昨天上班的时候分了我一个任务,对比一下两个数据库导出的保险代理公司的记录有多少相同的和不同的,代理公司的数据主要有两个基本的字段,code和name,主要是分三种情况:
1 code相同,name相同
2 code相同,name不同
3 code不同,name不同
其中record_1中有9000多条记录,record_2中有6000多条记录。
我几乎一点思想斗争都没有的就从record_1中逐个拿出一条记录,然后用这条记录中的code去逐个对比record_2中的记录,在这种情况下,在6000条数据中能找到相同code的话,需要比较的平均次数是 3000次,如果找不到的话,则铁定要比较6000次,好吧,就按照比较理想的状态考虑,都能找到,按照3000次计算,则最后的比较次数是
9,000 * 3,000 = 27,000,000(天,是六个0么?)
然后加上别的操作,我完成了这次比较,在没有看表的情况下,我估计是用了 10多分钟,pc机,酷睿双核。主频2G多?有待考证。我在想,如果是在服务器上,速度会提高多少呢?只需要1分钟?不知道。
---------
然后,我发觉record_2中的记录是有顺序的,是按照code的升序排列的,于是我还是逐条从record_1中取出记录,去和record_2中的记录对比,不过这次我采用了二分法查找,然后,我发觉,即使在最坏的情况下,找到或者找不到需要比较的次数大概是 13次。(2^12 = 4096, 2^13 = 8192),于是比较次数,就变成了
9,000 * 13 = 117,000
这时候的速度至少提高了两个数量级,也许这个时候,在pc机上运行时间和用上一种方式的服务器时间已经差不多了,甚至比在服务器上运行上一个程序还要快。
----------
于是,我发觉record_1中的记录也是有顺序的,所以可以利用下上次的查找结果来决定一下下次的记录开始行数,不过粗略考虑了一下,也许不会再有数量级上的提高了,所以,也无所谓吧。
--------------------
--------------------
我写了很久的程序了,也许只是应用程序员的原因,我甚至很少在程序中用到哪怕只是上面一个,任何一个学过一点算法的学生都知道的算法。虽然每次面试的时候,也偶尔会考到一些算法的问题,但是那只是笔试,一个过场而已。
前几天同事说客户这边优化了一个程序,优化后速度有所提升,然后优化的手段是,换了一台服务器。嘘,了解这边程序内幕的人,就会知道这件事情有多搞笑。
不过有人说,换服务器更具备实力,是啊,经济实力,我有时候经常想,为什么在国内,一个如你我的平凡人想认真干活的人,大部分都是很穷困呢?嘘,不可说,也说不得。
于是,狐狸给记者算了一笔账……
----------
附上一段java代码吧。递归调用
public static void search(int key, int[] items, int startIndex, int endIndex) {
if (startIndex == endIndex) {
if (key == items[startIndex]) {
System.out.println(key + " has been found,index is " + startIndex);
} else {
System.out.println(key + " hasn't beed found");
}
} else {
int midIndex = (startIndex + endIndex) / 2;
if (key == items[midIndex]) {
System.out.println(key + " has been found, index is " + midIndex);
} else if (key < items[midIndex]) {
search(key, items, startIndex, midIndex);
} else {
search(key, items, midIndex + 1, endIndex);
}
}
}