|
10鱼币
该代码是折半查找的算法 , 实在是不懂怎么求时间复杂度,还望各位指点一二,在下感激不尽
- int bisearch(int ary[], int n, int key)
- {
- int seek_val;
- int front_val = 0; //1 次
- int rear_val = n- 1; //1 次
- while (front_val <= rear_val)
- {
- seek_val = (front_val + rear_val) / 2;
- if (ary[seek_val] == key)
- {
- return seek_val;
- }
- if (ary[seek_val] > key)
- {
- rear_val = seek_val - 1;
- }
- else
- {
- front_val = seek_val + 1;
- }
- }
- return -1;
- }
复制代码
本帖最后由 迷雾少年 于 2019-8-15 23:34 编辑
序列:{1,2,3,4,5,6,7,8......n}
个数:n
第一次查找,没找到:剩余n/2;
第二次查找,没找到:剩余n/4;
第三次查找,没找到:剩余n/8;
第四次查找,没找到:剩余n/16;
...
第k次查找,没找到, 剩余n/(2^k);
最差的情况在例子里就找1或者n,假如在第k次找的时候就剩下1这个数(就剩余一个)了,那么n/(2^k) = 1;
两边同乘2^k:2^k = n;
同取对数 :k = log2(n);
|
最佳答案
查看完整内容
序列:{1,2,3,4,5,6,7,8......n}
个数:n
第一次查找,没找到:剩余n/2;
第二次查找,没找到:剩余n/4;
第三次查找,没找到:剩余n/8;
第四次查找,没找到:剩余n/16;
...
第k次查找,没找到, 剩余n/(2^k);
最差的情况在例子里就找1或者n,假如在第k次找的时候就剩下1这个数(就剩余一个)了,那么n/(2^k) = 1;
两边同乘2^k:2^k = n;
同取对数 :k = log2(n);
|