字典的算法和结构

时间:2009-09-05 09:35:13

标签: dictionary indexing

我想写一本字典。我应该使用哪些算法/结构?

每个单词或短语都有相应的说明(示例,视频,图像等)。应该可以轻松添加/删除单词和修改说明。快速访问比快速添加/删除更相关。应该可以根据描述中的一些信息过滤单词。有些描述可能是半空的。

我在想字典文件中包含这些单词的单词和位置的索引。如何从描述中快速搜索一些信息?

4 个答案:

答案 0 :(得分:2)

字典通常建立在树木之上,最常见的是自平衡树木。最常用的是Red-Black treesAVL Trees,你应该从那里开始 满足您的要求(我正在考虑案例,其中单词是键(索引),描述是该键指向的数据):
1.我应该添加/删除单词 - 检查,你从树中添加和删除节点 2.应该可以修改描述 - 检查,描述没有编入索引,所以当你找到它时,你可以用它做任何你想做的事情,而不用改变树自己。
3.快速访问 - 检查,你有log2(N)访问权限,树保持平衡(因此 - 它是自平衡树)。
4.一些描述可以是半空的 - 描述只是连接到节点的数据,它可以是空的,或任何你喜欢的,不会改变结构内部的任何内容。
5.根据一些信息过滤单词 - 我没有得到这个,过滤的东西可以通过复制树来实现,但没有你要过滤的单词,因此你会得到另一棵树,只有那些你想要的单词(不会复制描述)。

编辑:你应该知道的一件事 - 很好地实施这些树,这不是一件容易的事。得到一两个错误很容易,你应该在每一步都检查你的实现的正确性。此外,如果您想要深入了解更多结构,您可能需要阅读Knuth's

答案 1 :(得分:1)

Ravadre指出了基于搜索树的数据结构。

最大的选择是使用hash table。它对树的主要缺点是它内部的数据没有排序 - 元素的排序有些随意。如果需要按排序顺序访问元素,则不建议使用哈希表。

但是,如果你需要排序的项目,请使用哈希表:访问时间平均为O(1),虽然这取决于很多因素,但它通常仍然很远优于基于树的结构中的访问时间。

顺便说一句,大多数编程语言已经提供了一种或两种数据结构,因此您不需要自己实现它们。

答案 2 :(得分:0)

对于存储带有单词作为键的字典,您可能希望使用trie,一种数据结构,其中键通常是字符串。非常好。

如果将字典本身存储在数组中,则单词键映射的值可以只是数组中字典条目的索引列表,其中出现该单词的描述。

如果您不想使用trie:您可以使用哈希表或某种二叉树。

使用哈希表,理论上你有极快的查找速度,但是碰撞的可能性,这意味着性能可能会随着时间的推移而变得更糟。另请参阅this blog post

使用平衡二叉搜索树(红黑树很受欢迎),你的键查找可能会慢一点,但(如果你使用平衡树)可以保证相对较好的性能。

答案 3 :(得分:0)

如果我理解正确,你想建立一个实际的字典,即带有描述,视频和图像的单词列表?而不是实现字典数据类型?

对于前者,我建议数据库是您的最佳选择。您不必将整个结构保留在内存中,良好的索引结构允许快速访问。 SQL查询将使您能够按描述或任何其他字段进行过滤。

这种方法的主要缺点是插入算法,因为数据库增加了插入单词所花费的时间(假设你不想保持顺序)会增加。二进制搜索正确的位置可能是你最好的开始。显然,这有助于对二叉树结构的需求。

对于实际的数据库本身,有几种方法可以解决它。将实际单词作为索引可能值得考虑,并且还具有以下优点:您可以根据索引直接获取位置(假设您可以将字符串转换为随着单词位置增加而增加的数字

希望这有帮助。