【发布时间】:2014-10-27 10:52:58
【问题描述】:
要搜索一个非常大的数组,我正在考虑一种复杂度小于 log n 的算法,这意味着顺序不小于 log n,但绝对小于 log n。所以我所做的不是直接走到中间向前移动 1 步,检查如果数字均匀分布,我们必须进一步移动多少,移动到那个位置,如果这是一个解决方案,打破它,否则计算我们必须进一步移动多少,迭代执行直到找到解决方案 这是一个有效的 Java 代码:-
public class Search {
public static void main(String[] args) {
int a[]={12,15,16,17,19,20,26,27};
int required=27;
int pointer=0;
int n=1;
int diff;
int count=0;
int length=a.length;
while(a[pointer]!=required){
count++;
if ((pointer+n)>(length-1))
n=length-1-pointer;
if(n==0)
n=-1;
diff=a[pointer+n]-a[pointer];
pointer=pointer+n;
n=(required-a[pointer])*n/diff;
}
System.out.println(pointer);
System.out.println(count);
}
}
P.S- 我有一个接近均匀分布的数组。
我想问一下它真的比二分查找更好吗??在什么情况下它会失败?最好、平均和最差情况的复杂度是多少??
【问题讨论】:
-
您的做法是个坏主意,几乎在所有情况下都会减慢您的搜索速度。
-
@Rafael 你能解释一下为什么吗?
-
唯一比二分搜索更快的搜索是散列。 O(1) 复杂度。除此之外,就复杂性而言,二分搜索几乎是您所希望的最好的。
-
1.如果您的数组接近线性分布,您可以通过线性插值估计二进制搜索的前几个 MSB 位。如果 N 足够大但不复杂,则可以改善运行时间。 2.您要实现的目标与 O(log(N)) 几乎相同,但开销更大,日志库也不同 2. 所以最终您的运行时可能会比原始二进制搜索更糟
-
你正在重塑Interpolation Search。它可能会更快,因为它可能会执行更少的探测,但在实践中也可能会更慢,因为代码更复杂。