编程珠玑第五章习题五——C++实现二分搜索时进行错误检测

一,概述

        主要讲解如何保证编程的正确性。在程序中加入断言(assert(断言内容) //如果错误,则终止程序。否则正常执行)。

        typdef   //声明自定义类型

               typedef int size; //声明int 型整数的别名

               size array[4];

               

[html]  view plain copy
  1. typedef struct tagNode  
  2. {  
  3.   char *pItem;  
  4.  pNode  *pNext;  
  5. } *pNode;  

测试结构题大小的程序

[html]  view plain copy
  1. #include "stdio.h"  
  2.   
  3. typedef struct tagNode  
  4. {  
  5.    char *pItem; //32位   
  6.    struct tagNode  *pNext;//32位   
  7. } *pNode;  
  8.   
  9. int main()  
  10. {  
  11.     printf("%d\n",sizeof(struct tagNode));  
  12.       
  13.     return 0;  
  14. }  

二,习题

      5)测试、断言优化过程

[html]  view plain copy
  1. for (i = 0; i < n - 1; ++i)    
  2.    assert(a[i] < a[i+1]);    

如何利用二分的性质来进行处理还是一个问题。

一种办法是:

[html]  view plain copy
  1. int bs(int *a, int b, int e, int v)    
  2. {    
  3.     int *begin = a + b, *end = a + e, *mid;    
  4.     if (!a || b >= e) return -1;    
  5.     while (begin < end)    
  6.     {    
  7.         mid = begin + ((end - begin) >> 1);    
  8.         assert(*begin <= *mid && *mid <= *end);    
  9.         if (*mid > v) end = mid;    
  10.         else if (*mid < vbegin = mid + 1;    
  11.         else return mid - a;    
  12.     }    
  13.     return -1;    
  14. }    

     但是这个方法需要多次使用才能检测出来,也就是可能在查找某两个数的时候不会报错,可能在查找别的几个数的时候就报错了。很多时候,这不是一种好选择。

根据第五题的题意,可以写如下代码来减少每次检测的量。

[html]  view plain copy
  1. int bs(int *a, int b, int e, int v)    
  2. {    
  3.     int *begin = a + b, *end = a + e, *mid, i = b;    
  4.     static int *record = 0;    
  5.     if (!a || b >= e) return -1;    
  6.     if (!record || record != a)    
  7.     {    
  8.         while (i < e && a[i] < a[i+1])       ++i;    
  9.         assert(i == e);    
  10.     }    
  11.     
  12.     while (begin < end)    
  13.     {    
  14.         mid = begin + ((end - begin) >> 1);    
  15.         assert(*begin <= *mid && *mid <= *end);    
  16.         if (*mid > v) end = mid;    
  17.         else if (*mid < vbegin = mid + 1;    
  18.         else return mid - a;    
  19.     }    
  20.     return -1;    
  21. }    

       加一个static变量来记录这个数组是否经过检测,来决定以后的检测还需要进行。

当然对于多个数组的检测,可以利用hash来处理,因为一般来说,数组的下标地址都是不一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值