Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371838
  • 博文数量: 47
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 1290
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-25 16:14
文章分类

全部博文(47)

文章存档

2019年(1)

2014年(1)

2013年(9)

2012年(36)

分类: LINUX

2012-08-24 13:57:24

  二分查找也叫折半查找,折半查找就是利用表中元素的有序性,每经过一次比较就把表中的查找范围缩小一半,而且查找结果产生于最后查找的表元素中,很显然,它属于减冶算法。具体算法如下:


  1. int bisearch(int x,NODE *elem,int len)
  2. {
  3. int left,right,mid;
  4. left = 0;
  5. right = len-1;
  6. while(left <= right){
  7. mid = (left + right)/2;
  8. if(elem[mid].key < x) left = mid + 1;
  9. else if(elem[mid].key > x) right = mid - 1;
  10. else return mid;
  11. }
  12. return NOT_FOUND;
  13. }
内核中的二分查找如下代码:


  1. void *bsearch(const void *key, const void *base, size_t num, size_t size,
  2.      int (*cmp)(const void *key, const void *elt))
  3. {
  4.     size_t start = 0, end = num;
  5.     int result;

  6.     while (start < end) {
  7.         size_t mid = start +(end - start) / 2;     (1)

  8.         result = cmp(key, base +  mid * size);     (2)
  9.         if (result < 0)
  10.             end = mid;                        
  11.         else if (result > 0)
  12.             start = mid + 1;
  13.         else
  14.             return (void *)base +  mid * size;
  15.     }

  16.     return NULL;
  17. }
  18. EXPORT_SYMBOL(bsearch);
大家仔细分析这两段代码还是有区别的.(1)没有采用left和right相加之后再除以2,是为了防止溢出,因为我们谁也无法预料要查找的表的数到底有多大。
 (2)处用比较的方式通过参数传进来,可以由用户自由编写。
   我们可以自己写一个用户态的程序复用内核中的代码。其中参数分别代表:key是我们要查找的元素,base是链表的首地址,num是链表的总长度,size是每个元素的平均大小。cmp是用户自己定义的比较函数。
阅读(2365) | 评论(0) | 转发(0) |
0

上一篇:list.h链表实践

下一篇:虚拟文件系统VFS

给主人留下些什么吧!~~