免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3141 | 回复: 16
打印 上一主题 下一主题

[C] 看书时看到一个简洁的关于二分法的函数,有几个问题请教一下各位大神。 [复制链接]

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-11 14:20 |只看该作者 |倒序浏览
本帖最后由 _HellAngel_ 于 2012-11-11 14:21 编辑

例题中给出的简单二分法函数是这个:
  1. int binsearch(int x, int v[], int n)
  2. {
  3.     int low, high, mid;
  4.    
  5.     low = 0;
  6.     high = n-1;
  7.     while (low <= high){
  8.         mid = (low+high) / 2;
  9.         if(x < v[mid])
  10.             high = mid - 1;
  11.         else if(x > v[mid])
  12.             low = mid + 1;
  13.         else
  14.             return mid;
  15.     }
  16.     return -1;
  17. }
复制代码
然后有一个题目,说是让我简化一下这个函数,让它在循环里面只进行一次测试(原本的例题里进行了两次测试),让更多的测试在循环外进行。然后让我比较两个版本函数运行的时间。

我看了下答案,答案给出的是这个:
  1. int binsearch(int x, int v[], int n)
  2. {
  3.     int low, high, mid;
  4.    
  5.     low = 0;
  6.     high = n-1;
  7.     mid = (low+high) / 2;
  8.     while(low <= high && x!= v[mid]){
  9.         if(x < v[mid])
  10.              high = mid - 1;
  11.         else
  12.              low = mid + 1;
  13.         mid = (low + high) / 2;
  14.     }
  15.     if(x == v[mid])
  16.         return mid;
  17.     else
  18.         return -1;
  19. }
复制代码
解答说,两种方案的执行时间几乎没有什么差异。





我想请教各位大神的问题是:
1、因为它只是个函数,我想知道如何能看出它的执行时间。
2、有没有更简单的方法,真的可以让执行时间变短。
谢谢各位大神看完小弟的帖子。

论坛徽章:
0
2 [报告]
发表于 2012-11-11 16:54 |只看该作者
mid = (low+high) / 2;//bug

论坛徽章:
0
3 [报告]
发表于 2012-11-11 19:02 |只看该作者
回复 2# fallening_cu
说说。

   

论坛徽章:
0
4 [报告]
发表于 2012-11-11 19:34 |只看该作者
_Rayx 发表于 2012-11-11 19:02
回复 2# fallening_cu
说说。
  1. #include <limits>
  2. #include <iostream>

  3. int main()
  4. {
  5.     int const a = std::numeric_limits<int>::max();
  6.     int const b = std::numeric_limits<int>::max();

  7.     std::cout << (a+b)/2 << std::endl;

  8.     return 0;
  9. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-11-11 20:37 |只看该作者
回复 4# fallening_cu

能传这么大的数组进去么。。。
   

论坛徽章:
0
6 [报告]
发表于 2012-11-11 20:45 |只看该作者
本帖最后由 x5miao 于 2012-11-11 20:46 编辑

这不是效率的问题,而是第二个函数部分修正第一个的部分bug的问题

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
7 [报告]
发表于 2012-11-11 20:55 |只看该作者
没兴趣看, 不过送楼主一个标准库实现:
  1. SYNOPSIS
  2.        #include <stdlib.h>

  3.        void *bsearch(const void *key, const void *base,
  4.                      size_t nmemb, size_t size,
  5.                      int (*compar)(const void *, const void *));
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-11-11 20:59 |只看该作者
_Rayx 发表于 2012-11-11 20:37
回复 4# fallening_cu

能传这么大的数组进去么。。。


为什么不能?你算算 int arr[2^32] 才占了多大的地?
我台式机内存都 48G 了,更不要提超级计算机了

论坛徽章:
0
9 [报告]
发表于 2012-11-11 21:24 |只看该作者
回复 8# fallening_cu


    48G。。。

论坛徽章:
0
10 [报告]
发表于 2012-11-11 23:03 |只看该作者
fallening_cu 发表于 2012-11-11 20:59
为什么不能?你算算 int arr[2^32] 才占了多大的地?
我台式机内存都 48G 了,更不要提超级计算机了


你买的二手小型机吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP