awk折半查找

平时我们需要找出2个文件里相同的部分,假如a内容是排序后的。比如
10
20
30
40
50
50
60
70
而b:
15
10
70
45
300
50
找出a,b中公共的部分,一般做法

 

awk 'NR==FNR{a[$0]}NR>FNR{if($0 in a)print }'

缺点是,当a数量大的时候逐个比较,效率低,类似mysql的全表扫描(无索引)。

二分查找代码


#!/bin/awk -f # date :2010-10-02 # binary search by awk ,just for fun NR==FNR { a[k++] = $0 } NR>FNR { start= 0;end = k-1 while(start<= end) { mid =int(start+ ((end - start)/2)) #start,end都很大时,比如元素达到 2^30 时,平常做法mid =int((start+ end)/2)将超过整数的最大值 2^31 -1,此时讲溢 #出,值为负了。所以要用这个办法,O(∩_∩)O~ split(a[mid], b) if($1==b[1]) {print "ok "$1 " was found";break} else if ($1 > b[1]) start = mid+1 else end= mid-1 } }

用法:awk -f binarysearch.awk a b
此时a必须是排序过的,当然这些废话了,学过数据结构的都晓得为什么。

你可能感兴趣的:(数据结构,mysql,Date,search,fun,2010)