| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3051 人关注过本帖, 1 人收藏
标题:二分法查找,进来帮帮我吧
只看楼主 加入收藏
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用liufashuai在2013-8-7 09:43:32的发言:


就是想。你那样做效率真的比这样好么

用二分找边界,通常情况下比我写的顺序要高...
不信,自己证明

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-07 09:46
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 40楼 liufashuai
你告诉我你的算法的时间复杂度是多少,我就给你解释。

重剑无锋,大巧不工
2013-08-07 09:46
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
唉,各位还要多努力啊。尤其是各位小朋友,以后别起哄,别欺负别的小朋友。

程序代码:
int element_count(int * set, int len, int e)
{
    int f, a, b, t;
    for(a = 0, b = len - 1; a < b; set[t = a + b >> 1] <  e ? (a = t + 1) : (b = t));
    for(f = a, b = len - 1; a < b; set[t = a + b >> 1] <= e ? (a = t + 1) : (b = t));
    return b - f;
}
收到的鲜花
  • 邓士林2013-08-07 15:02 送鲜花  15朵   附言:好文章

重剑无锋,大巧不工
2013-08-07 10:11
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用beyondyf在2013-8-7 10:11:08的发言:

唉,各位还要多努力啊。尤其是各位小朋友,以后别起哄,别欺负别的小朋友。

int element_count(int * set, int len, int e)
{
    int f, a, b, t;
    for(a = 0, b = len - 1; a < b; set[t = a + b >> 1] <  e ? (a = t + 1) : (b = t));
    for(f = a, b = len - 1; a < b; set[t = a + b >> 1] <= e ? (a = t + 1) : (b = t));
    return b - f;
}

哦...受教育了
以后再也不欺负其他小盆友了...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-07 10:16
qjw2719
Rank: 2
等 级:论坛游民
帖 子:21
专家分:33
注 册:2012-3-15
收藏
得分:0 
以下是引用beyondyf在2013-8-7 10:11:08的发言:

唉,各位还要多努力啊。尤其是各位小朋友,以后别起哄,别欺负别的小朋友。

int element_count(int * set, int len, int e)
{
    int f, a, b, t;
    for(a = 0, b = len - 1; a < b; set[t = a + b >> 1] <  e ? (a = t + 1) : (b = t));
    for(f = a, b = len - 1; a < b; set[t = a + b >> 1] <= e ? (a = t + 1) : (b = t));
    return b - f;
}

2013-08-07 14:33
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
得,那就再送大家一段好了。这仍然是二分法,但分析的角度不同。

话说昨天那个燕尾姑娘不是挺兴奋的么,怎么今天不吱声了?互动一下嘛,要不然我也没什么兴趣发代码了

程序代码:
int element_count(int * set, int len, int e)
{
    int t;
    if(set[0] == e && set[len - 1] == e) return len;
    if(set[0] > e || set[len - 1] < e) return 0;
    t = len / 2;
    return element_count(set, t, e) + element_count(set + t, len - t, e);
}

重剑无锋,大巧不工
2013-08-07 17:25
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
结贴了怎么连句客气话也没有?

这分数分配的让我理解不了,给我那5分是不是该放在我发代码的帖子上?

关于我的代码,除了邓版主和楼上两位的赞许,其他人都静悄悄。这贴的浏览量不算少,想必不少人看过了,没人发现我代码中的问题么?

重剑无锋,大巧不工
2013-08-08 19:57
may大象
Rank: 2
等 级:论坛游民
帖 子:55
专家分:38
注 册:2013-5-30
收藏
得分:0 
回复 47楼 beyondyf
额。。佩服你,可是我暂时看不懂,还没有学二分法。。。

                             凡成大事者,各有各的方法论。
2013-08-08 23:16
XiaoXiao_Ren
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
威 望:1
帖 子:80
专家分:198
注 册:2013-7-17
收藏
得分:0 
回复 9楼 beyondyf
我觉得就没有必要用二分法统计指定key的个数,得不偿失!!

否极泰来
2013-08-08 23:26
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
回复 47楼 beyondyf
代码我仔细的看过了,确实不错。

利用二分法分别逼近两侧端点,很好,学习了~



其实我一直在考虑这样一个问题:

你是把二分法分别用到了逼近两个端点上,能不能套用一次二分法,一次性得出两个端点的下标值。

你的第二种方法用到了递归,这个递归应该会有很多次调用,暂且不说这个。

第一种方法确实设计的很巧妙,你也看见我最后的那个代码了,我其实就是一直想通过一次二分法实现你的第一种方法的效果,最后还是没有摆脱使用了顺序遍历的

惨状。。。直到现在我还是在考虑这个问题。。。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-08-09 00:03
快速回复:二分法查找,进来帮帮我吧
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028436 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved