线性搜索优化 - 减少计算次数
Posted
技术标签:
【中文标题】线性搜索优化 - 减少计算次数【英文标题】:linear search optimization - cutting number of calculations 【发布时间】:2018-04-01 12:26:59 【问题描述】:我想知道 - 是否可以改进线性搜索算法(在数组上,而不是列表上),以便它可以完成大约一半的计算?
例如,这是基本的线性搜索算法:
i <- 1
while i<=length[a] && a[i]!=v
do i <- i+1
if i>length[a]
then return NIL
else return i
现在,如果它已排序,据我所知,我们可以使用二进制排序或使用上限函数进行大约一半的计算。但是如果给定数组的算法没有排序——我们可以做大约一半的计算吗?
如果我计算正确,预期的计算次数是 (n-1)(n+2)/2n,而最坏的情况是 n-1
是否可以将计算次数减少一半左右?
注意:使用哨兵可能会改善一点,但仍不会将其减少到大约一半的计算量
非常感谢您的帮助
【问题讨论】:
【参考方案1】:首先,n/2 仍然是 O(n)。其次,如果搜索到的元素在一个数组中并且数组中的所有数字都是不同的(如果有重复比较的次数更小),那么比较的次数:
1/(n-1)*1 + 1/(n-1)*2 +...+ 1/(n-1)*n-1 = 1/(n-1)*(1+2+...+n-1) = 1/n*(n*(n-1)/2) = (n-1)/2
但如果搜索的元素不在数组中,那么您需要使用数组中不同元素的数量除以所有可能的对象/数字的数量,而不是 1/n 因子。如果比率非常小,很可能您需要遍历数组以检查它是否为数组,因此您需要进行几乎 n 次比较。如果从底层宇宙中提取的数组中的元素不均匀,则分析可能会很复杂。
【讨论】:
以上是关于线性搜索优化 - 减少计算次数的主要内容,如果未能解决你的问题,请参考以下文章