你没说清楚,为什么8681和852都是1类,138018是2类?
补充:
好像明白你的意思了,分类是预先有的,我们的程序只判断下楼号码各自属于哪一个类别,而不是从数据中提取有哪些类别。
如果我的理解正确,我说两个观点:
一、如果你的程序不是写在程控交换机上,或者类似需要瞬间反应的设备上,效率并不那么重要,程序的绝对正确才是最重要的。
现在的电脑性能非常好,对于10万个号码的分类,最先进的算法与最落后的相比,也只是几秒钟的差异。
二、对于你的需求,最先进的算法就是哈希算法,是经典的,应该在网上能查到许多相关资料,各类大学的算法和数据结构教材里面也会讲到,你都可以参考。
本例中,好在你需要处理的数据全是数字,这样程序就非常简单。你没有说最大类别代码长度是几位,我这里假设是6位,那么我们定义一个包括所有6位数字的静态数组,然后可以存放在一个外部文件中,程序每次运行的时候从外部文件中读去数组内容到内存,利用这个数组完成高速分类。
下面从数组的内容、数组的生成、数组的使用三个方面来说明,希望你能够明白。
先说数组的内容,定义为:int key[999999];其含义是:key[n]的值是前6位位n的号码的分类,例如key[138018]=2,而key[868100]到key[868199]的值均为1,同样有key[852000]到key[852999]的值也全为1,表示所有852开头的都是1类。
做这个数组的过程,就需要你把所有分类的类别代码给出,如果是6位则设置相应的一个key,否则循环设置多个key,这个做的过程没什么技术含量,也没有效率要求,事实上也没多大的效率可言。
使用这个数组就相当简单,对于任意的号码char num[18];我们要分类所需要做的事情就是取前6位数、转换位数值类型、通过数组key直接得出分类,几乎是瞬间完成。
char num[18];
long i;
int k;
i=(num[0]-'0')*100000
(num[1]-'0')*10000
(num[2]-'0')*1000
(num[3]-'0')*100
(num[4]-'0')*10
(num[5]-'0');
k=key[i];
单独对于分类查找的算法而言,这可能是效率最高的算法了。
全部