如何有效搜索有序列表?

时间:2015-08-17 15:48:05

标签: ios swift sorting search

我有一个函数可以预测输入的单词并返回数组中的可能性。不幸的是,这些不按使用频率排序。因此,我列出了最频繁列出的10K有序单词列表。什么是比较数组和有序列表中的单词以返回最常用单词的有效方法? (即它首先遇到的那个?)

我被朋友告知要使用二叉搜索树,但我真的不知道这对我有什么帮助。根据我对following website的理解,只能使用数值。我这样想错了吗?有没有更好的方法来完成上述任务?

提前致谢

4 个答案:

答案 0 :(得分:1)

您可以创建一个字典,其中单词为键,频率为值。然后迭代结果数组,使用字典获取每个项目的频率值,并预测具有最高频率的项目。

我不会在这里使用vanilla二元搜索树。有可能 - 正如泰勒柯克帕特里克所说,你可以创建一个用词作为键和频率的树,并用它来查找每个结果词的频率,这与字典解决方案的方式非常相似。

问题在于您无法保证简单的二叉树将得到平衡。从它的声音,你的数据可能会好,因为你的话是按频率顺序。最糟糕的情况是如果单词按字母顺序排列 - 那么你的二叉树最终会与链表相同 - 它永远不会分支,因为每个节点都会附加到前一个节点的右边。因此,搜索的计算复杂度与迭代单词数组相同 - O(n)而不是O(log2N)(这是二叉树的最佳情况)。

当然,您可以通过在插入之前随机化单词列表来防范这种情况。但在我看来,使用字典更容易。我不知道Swift词典的实际实现是什么(我们在几个月内开源之前就已经赢了),但是你可以把它看作是它会执行一个普通的BT用于价值检索。

我不知道这个问题的背景是什么 - 如果你正在学习CS,那么为了智力增长而实施BST可能是值得的 - 在这种情况下,只有10,000项你可能会发现性能差异是最终很小。但如果你是一个努力解决问题的工作程序员,请使用字典方法。

答案 1 :(得分:1)

您将所有单词放入字典或集合中。就是这样。字典,如果您有与单词相关联的数据,如果您没有数据则设置,并且只想知道单词是否在列表中。

答案 2 :(得分:1)

您可能想要使用Trie

将单词列表放入其中。对于输入的每个字符,您尽可能深地遍历Trie,然后将所有路径显示为叶节点作为可能的完成。

由于您所拥有的世界可能是静态的,因此如果性能受到关注,您可以预先计算Trie并从磁盘/网络/加载任何内容加载。

答案 3 :(得分:0)

您可以使用二进制搜索树,其中包含任何内容作为实际值。要实际使用树,请使用单词的频率作为数值。这实际上是解决您问题的一个很好的解决方案。树的每个节点都将包含该单词和表示单词频率的数值。

Here are a few links帮助您完成制作。

希望有所帮助。