关于在 240k 单词列表中使用 android 中的基数树进行英语词典单词查找的问题

Questions about using a Radix Tree in android for English dictionary word-lookup in 240k word-list

应用概览

在这个游戏中,您将一个字母附加到不断增长的字母链中,但每个玩家都尽量不组成单词。在你的对手选择一个字母附加到字母链后,你可以选择说这是一个词,需要检查特定的数据结构。我需要实现这个数据结构。

数据结构要求

  1. 我需要一个数据结构,能够快速判断某个单词是否存在于 android 设备上的游戏的 240000 个单词列表中。
  2. 您应该可以轻松玩多达 20 场比赛
  3. 应该为 android 应用编写

一个不错的额外功能是快速显示给定单词的所有可能单词,但这不是必需的。

我试过的

Radix Tree 似乎是个好主意,请参见下图。现在我可能会后悔我投入其中的时间,因为我认为它需要太多的对象。在我的代码中,每个黑点和编号的圆圈都将表示为节点 objects。

基数树至少需要 240k (240,000) 个节点和对象,每个节点的每条路径都是一个词,这将产生 240k 词列表。每个游戏将被表示为只存储对树中当前节点的引用,这意味着额外的游戏需要很少的额外存储。

我还认为我可以将它实现为一个 hashMap,其中包含所有可能的单词,并遍历所有单词并在每个字母后缩小范围。这似乎是一种计算方法,其中基数树需要更少的计算但需要更多的存储空间。

[编辑] 这是我的错误假设,请看下面的图片。

我有问题

  1. Radix Tree 是满足当今大多数 android 设备要求的最佳数据结构之一吗? (answers/comments好像是)

  2. 当你有这么多对象时,它在内存中是如何工作的?它们都存储在内存中还是磁盘上? I could find this that an app could use a total of 16mb/25mb/32mb of ram。将 240000 个对象放入 ram 时,我可能会达到 16mb 以上的 ram 吗?

  3. 您可以在运行时从文件中存储和检索大型 Radix Tree 对象,对吧?它存储在磁盘的 res/raw 文件夹中。

  4. 如果有(比方说)50 个游戏以散列图打开,其中对于每个游戏你都必须使用散列图的副本,你可以在其中缩小可能的单词,甚至可能的?安装后应用程序可以要求多少额外存储空间?


根据评论: 似乎我假设基数树需要更多 space 似乎是错误的:要查看更大的图像,请右键单击它并在新选项卡中打开

A trie/prefix tree/radix 树对于这个应用程序来说似乎是一个完全有效的数据结构。如果字典是固定的(即在播放过程中没有单词得到 added/deleted),则可以通过 compressing shared branches.

节省内存