打印

请问那位大侠会写个2分法查表程序?请教一下!

[复制链接]
2889|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LLLLWWWW|  楼主 | 2009-8-14 10:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要求在一组N个按照大小顺序排列的数组中用2分法找到一个
合适的数,比前面一个小,比后面一个大,这样写是为了能让程序跑的
更快一些,效率更高一些,如果有其他的方式,也可以赐教!
时间紧,任务重,最好有源代码~谢谢了

相关帖子

沙发
5880527| | 2009-8-14 10:06 | 只看该作者
又来了一个懒虫

使用特权

评论回复
板凳
LLLLWWWW|  楼主 | 2009-8-14 10:10 | 只看该作者
我不是懒虫,我写过60多K的代码,只是现在空间不够了,原来是按顺序查表的,发现效率太低,
我就想用2分法来查表了,网上哪里有现成的代码吧?告诉我,我马上撤帖~~

使用特权

评论回复
地板
LLLLWWWW|  楼主 | 2009-8-14 10:14 | 只看该作者
大家都不愿意想办法吗?那算了,我还是自己做得了~~

使用特权

评论回复
5
auzxj| | 2009-8-14 10:26 | 只看该作者
我是来打酱油的
你找找谭浩强的那本C语言书,看里面有没类似的算法。。。good luck

使用特权

评论回复
6
auzxj| | 2009-8-14 10:27 | 只看该作者
不是大家不愿想办法,知道的肯定会告诉你的,可惜看到的都不知道,知道的可能恰好没看到你的帖子

使用特权

评论回复
7
mohanwei| | 2009-8-14 10:32 | 只看该作者
//获取汉字索引号。输入:汉字内码,返回:该汉字在小字库中的索引号
unsigned short int GetChinese(unsigned short int cn)
{
        unsigned short int min=0,mid=ChineseLen/2,max=ChineseLen;
        while(1)
        {
                if(cn<Chinese[mid])
                {
                        max=mid;
                        mid=(max-min)/2+min;//二分
                        if(mid==min)
                                return(min);
                }
                else if(cn>Chinese[mid])//大于
                {
                        min=mid;
                        mid=(max-min)/2+min;//二分
                        if(mid==min)
                                return(max);
                }
                else//等于
                {
                        return(mid);
                }
        }
}

使用特权

评论回复
8
mohanwei| | 2009-8-14 10:34 | 只看该作者
Chinese[]——汉字索引数组
ChineseLen——宏定义,汉字索引长度

使用特权

评论回复
9
古道热肠| | 2009-8-14 12:13 | 只看该作者
给您现成的给您,也是网上找的,测试过了,很好用。
uint UnicodeToGB2312(uint unicode)//用二分查找算法
{
           unsigned int xdata mid, low, high, len;
        len = sizeof(UnicodeToGB2312_Tab)/sizeof(UnicodeToGB2312_Tab[0]);
        low = 0;
        high = len - 1;
        if( (unicode >= 0x20 && unicode <= 0x5b) || (unicode >= 0x5d && unicode <= 0x7e))
           return unicode;
        while(low <= high)
        {
            mid = (low + high) / 2;
                if(UnicodeToGB2312_Tab[mid][0] > unicode)
                    high = mid - 1;
                else if(UnicodeToGB2312_Tab[mid][0] < unicode)
                    low =  mid + 1;
                else
                    return         UnicodeToGB2312_Tab[mid][1];
        }
        return 0 ; //没找到
}

使用特权

评论回复
10
LLLLWWWW|  楼主 | 2009-8-14 14:18 | 只看该作者
多谢大家了,我还在看~~程序有点长,可能装不下了,有短的没有?

使用特权

评论回复
11
mohanwei| | 2009-8-14 14:38 | 只看该作者
给你的只是一个思路!具体还要你自己根据所用的CPU,编译器来优化。
简单点如果是8位机,长度还小于256:
1-查表
2-把变量从uint换成uchar……

使用特权

评论回复
12
LLLLWWWW|  楼主 | 2009-8-14 14:47 | 只看该作者
哦,还有,不是查找汉字,是unsigned int类型的整数~已知数组是按大小排列的

使用特权

评论回复
13
huangqi412| | 2009-8-14 15:06 | 只看该作者
晕,给你思路和简单范例,接下来就看你自己了...

使用特权

评论回复
14
mohanwei| | 2009-8-14 15:16 | 只看该作者
一般都是从小到大排序的,所以上面两个例程也是默认从小到大排序……你可别说:从小到大我看懂了,但是从大到小我还是不太清楚……呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

91

主题

450

帖子

2

粉丝