我想写一本字典。我应该使用哪些算法/结构?
每个单词或短语都有相应的说明(示例,视频,图像等)。应该可以轻松添加/删除单词和修改说明。快速访问比快速添加/删除更相关。应该可以根据描述中的一些信息过滤单词。有些描述可能是半空的。
我在想字典文件中包含这些单词的单词和位置的索引。如何从描述中快速搜索一些信息?
答案 0 :(得分:2)
字典通常建立在树木之上,最常见的是自平衡树木。最常用的是Red-Black trees和AVL 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查询将使您能够按描述或任何其他字段进行过滤。
这种方法的主要缺点是插入算法,因为数据库增加了插入单词所花费的时间(假设你不想保持顺序)会增加。二进制搜索正确的位置可能是你最好的开始。显然,这有助于对二叉树结构的需求。
对于实际的数据库本身,有几种方法可以解决它。将实际单词作为索引可能值得考虑,并且还具有以下优点:您可以根据索引直接获取位置(假设您可以将字符串转换为随着单词位置增加而增加的数字
希望这有帮助。