我正在分析搜索算法的复杂性。例如,对于下面给出伪代码的二进制搜索,我可以写出
循环外的5个操作(3个赋值,1个减法,1个比较)。
每次循环运行7次操作(2次加法,1次除法,2次比较,2次分配)。
int binary_search(int x, int a[], int n)
{
int i, j, location;
int m;
i = 0;
j = n-1;
while (i < j) {
m = (i + j) / 2;
if (x > a[m]) i = m+1;
else j = m;
}
if (x == a[i]) location = i;
else location = -1;
return location;
}
当k = 4时,我试图对k-ary搜索算法做同样的事情,但我找不到可以分析的伪代码。任何帮助或指导将不胜感激。
答案 0 :(得分:0)
我问了另一个问题,经过几天的斗争,我又回答了这个问题。在互联网的帮助下,我写了一个与acm库一起正常工作的java代码。我们要查找的数字是x,j是我们集合的最后一个索引,数组的顺序递增。通过更改这些参数,我们可以使用4进制算法查找任何数组中的任何数字。
import java.util.Arrays;
import acm.program.*;
public class quartersearch extends ConsoleProgram {
public void run() {
int i = 0;
int j = 15;
int location;
int x = 6;
int[] a = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
println(a[2]);
while ( i < j) {
int l = (j + 3*i) /4 ; // 1st divisor
int m = (j + i) / 2; // 2nd divisor
int u = (3*j + i) / 4; // 3rd divisor
if(x > a[u]) {
i = u + 1;
} else if ( x > a[m] && x <= a[u]) {
i = m + 1;
j = u;
} else if (x > a[l] && x <= a[m]) {
i = l + 1;
j = m;
} else {
j = l;
}
}
int k = (i+j) / 2;
if (a[i] == x) {
location = i;
} else if (a[k] == x) {
location = k;
} else if (a[j] == x) {
location = j;
} else {
location = 0;
}
println(location);
}
}