我被告知要找到这段代码的效率,我们已经花了大约1个小时(我和我的伙伴)试图找出这段代码的真正功能。
我们认为这是一种搜索算法,但我们无法找到一种方法使其无法进入无限循环:
int busq(int *v, int x, int b, int a){
int m1, m2;
int result;
m1 = (b+a) / 3;
m2 = 2*m1;
if (v[m1] == x)
result = m1;
else
if (v[m2] == x)
result = m2;
else
if (x<v[m1])
result = busq(v, x, b, m1-1);
else
if (x>v[m2])
result = busq(v, x, m2+1, a);
else
result = busq(v, x, m1+1, m2-1);
return result;
}
这就是我们所有的,参数a,b或x没有值,不是* v(向量)的大小或向量的内容。
应该可以像这样解决它。
如果有什么我们想知道这个代码的作用,但是如果你能告诉我们效率,那么也会受到赞赏。 (我们使用O()表示法E.J。:O(1),O(n ^ 2)...)
答案 0 :(得分:3)
基本上是ternary search。 v
必须是排序数组,x
是搜索的值,b
是范围的开头,a
是结尾(不包括)。
该函数尝试将范围划分为三个大致相等的分区m1
,m2
(计算错误,只有在搜索第一个元素时才起作用)并检查x是否在界限。如果没有,它会依据x分区进行递归。
可以使用
修复代码m1=b+(a-b)/3;
m2=b+(a-b)*2/3;
然后,效率应为O(log n)