【发布时间】:2011-10-05 06:14:31
【问题描述】:
我有一个小疑问...
如果我知道列表中的搜索元素(例如包含按顺序排序的 32 个元素)出现在前四个位置,
这是最好的搜索算法。
线性搜索至少需要4次迭代...... 二分查找至少 5 次迭代 二叉搜索树怎么样..在这种情况下它提供更好的解决方案还是等于二叉搜索...
我相信线性搜索在这种情况下会更好..
有人可以确认一下吗?
【问题讨论】:
我有一个小疑问...
如果我知道列表中的搜索元素(例如包含按顺序排序的 32 个元素)出现在前四个位置,
这是最好的搜索算法。
线性搜索至少需要4次迭代...... 二分查找至少 5 次迭代 二叉搜索树怎么样..在这种情况下它提供更好的解决方案还是等于二叉搜索...
我相信线性搜索在这种情况下会更好..
有人可以确认一下吗?
【问题讨论】:
如果您知道该位置位于前 4 个位置,则比线性搜索更好,因为您必须测试不超过 4 个元素。使用二分搜索 lg 32 = 5 ,因此您最多必须测试 5 个元素。
此外,对于这样的少量元素,时间差可以忽略不计,最好保持简单并进行线性搜索。
您也可以在 O(1) 时间内使用 HashTable 或 HashSet,但同样,对于少量数据,线性搜索可能比执行散列函数更快。
如果微小的差异真的很重要,我建议在它将运行的环境中进行测量。
【讨论】:
您可以对前 4 个元素进行二分搜索。这将是 lg 4 = 2 次迭代! :-)
【讨论】:
如果你手头有这么多的元素和确切的应用程序,二叉搜索树将是多余的。
此外,为了解决目前的问题,线性搜索会更好,因为定位特定元素的预期迭代次数将超过二分搜索。
对于现实生活场景,出现的问题将非常罕见。因此,对已排序的数组使用二分搜索总是更好。
【讨论】:
如果数据以某种方式均匀分布,则使用插值搜索是明智的。通过使用分布知识,您很有可能一步猜出正确的位置。预期的复杂度为 O(log(log(n))) 。
这是我的页面的链接,其中我使用 Java 实现了算法:Algoritmy.net - interpolation search implementation
【讨论】: