`
java-mans
  • 浏览: 11430488 次
文章分类
社区版块
存档分类
最新评论

【编程珠玑】第四章 编写正确的程序

 
阅读更多

1、对下标限定界限:加条件 0<=l u<=n-1

2、这个函数可以写成如下形式:

#include <iostream>
using namespace std;

int bs(int *a, int begin, int end, int v)  
{  
    int *b = a + begin; //开始 
	int *e = a + end;   //结束 
	int *mid = NULL;    //中间 
     
  
    while (b < e)  //直到等于第一个出现的值 
    {  
        mid = b + ((e - b)>>1);  //得到中间位置的地址 
        
        if (*mid >= v) 
			e = mid;  
        else 
			b = mid + 1;  
    }  
    if ((e-a) < end && (*e == v)) 
		return e-a;  
		
    return -1;  
}  
int main()
{
	int a[5]={1,2,2,2,4};
	cout<<bs(a, 0, 4, 2)<<endl;
	return 0;
}

再给一段测试代码

#include <stdio.h>  
#include <stdlib.h>  
int cmp(const void *a, const void *b)    
{    
    return (*(int*)a) - (*(int*)b);    
}  
  
int bs(int *a, int begin, int end, int v)  
{  
    int *b = a + begin, *e = a + end, *mid = NULL;  
    if (!a) return NULL;  
  
    while (b < e)  
    {  
        mid = b + ((e - b)>>1);  
        if (*mid >= v) e = mid;  
        else if(*mid < v) b = mid + 1;  
    }  
    if ((e-a) < end && (*e == v)) return e-a;  
    return -1;  
}  
  
int find(int *a, int begin, int end, int v)  
{  
    int i = 0;  
    for (i = begin; i < end; ++i)  
        if (a[i] == v) return i;  
    return -1;  
}  
  
int main(void)  
{  
    int a[10000];  
    int n = 10000, i = 0;  
    int f, e;  
    for (i = 0; i < n; ++i)  
        a[i] = random()%100;  
    qsort(a, n, sizeof(int), cmp);  
    for (i = 0; i < n; ++i){  
        f = find(a, 0, n, a[i]);  
        e = bs(a, 0, n, a[i]);  
        if (f != e)  
            printf("Error find of %d %d %d\n", a[i], f, e);  
    }  
    return 0;  
}  

6、程序终止性证明:即每一步都至少会扔出一个豆子,所以总会结束的。此外,白色的豆子要么拿两个,要么不扔,所以白色的豆子如果是奇数,则会留下一个白豆子,否则是黑豆子。

7、题目里面如果要采用二分搜索,那么需要找的是一个数的刚好下界。

采用题目2中的方法,可以找到刚好上界,由于,线段是顺序排列的,所以就可以找刚好的下界了。

分享到:
评论

相关推荐

    编程珠玑源码下载编程珠玑书后源代码

    编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码

    编程珠玑 编程珠玑 编程珠玑 编程

    我觉得不错,和大家分享! 编程珠玑 编程珠玑 编程珠玑

    编程珠玑编程珠玑

    编程珠玑编程珠玑

    编程珠玑 编程珠玑续

    编程珠玑和编程珠玑续两本,上传赚点分,填充填充填充

    编程珠玑(续)

    《编程珠玑(续)》是计算机科学方面的经典名著《编程珠玑》的姊妹篇,讲述了对于程序员有共性的知识。书中涵盖了程序员操纵程序的技术、程序员取舍的技巧、输入和输出设计以及算法示例,这些内容组成一个有机的整体,...

    编程珠玑之第二章questionC 测试数据

    本资源只是“编程珠玑之第二章questionC: 求变位词问题”的简单的测试数据。

    编程珠玑 第二版 修订版

    第4章 编写正确的程序 33 4.1 二分搜索的挑战 33 4.2 编写程序 34 4.3 理解程序 36 4.4 原理 38 4.5 程序验证的角色 39 4.6 习题 40 4.7 深入阅读 42 第5章 编程小事 43 5.1 从伪代码到C程序 43 5.2 测试...

    编程珠玑续本

    编程珠玑续、编程珠玑续本、编程珠玑续本、编程珠玑续本

    编程珠玑及其源码

    编程珠玑,编程珠玑续以及源码,本书针对程序设计人员探讨了一系列的实际问题,这些问题是对现实中常见问题的归纳总结。作者虽然没有给出解决这些问题的具体代码,但始终非常富有洞察力和创造力地围绕着这些折磨...

    编程珠玑.pdf

    第4章 自描述数据 33 4.1 名字—值对 33 4.2 记录来历 36 4.3 排序实验 37 4.4 原理 39 4.5 习题 39 第二部分 实 用 技 巧 第5章 劈开戈尔迪之结 43 5.1 小测验 43 5.2 解答 44 5.3 提示 44 5.4 原理 47 5.5 习题 48...

    《编程珠玑》源代码

    《编程珠玑》第一版是我早期职业生涯中阅读过的对我影响较大的书籍之一,在书中首次接触到的很多观点都让我长期受益。作者在这一版本中做了重要更新。新增加的很多例子让我耳目一新。 ——Steve McConnell,《代码...

    编程珠玑习题集锦

    书的内容围绕程序设计人员面对的一系列实际问题展开。作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程...《编程珠玑(第2版)》是计算机科学方面的经典名著。

    编程珠玑总结笔记

    编程珠玑是一本提升coding能力不可多得的好书,看书时,可以结合这个笔记,突出重点。

    编程珠玑II(编程珠玑·续) 扫描版6.56M pdf格式

    编程珠玑II(编程珠玑·续) 扫描版6.56M pdf格式

    编程珠玑+续

    编程珠玑+续

    编程珠玑高清pdf

    这本书是《编程珠玑》高清pdf,如有侵权请告知。

    编程珠玑第二版及源代码

    编程珠玑第二版及源代码实现(C/C++) 如果让程序员们列举他们喜欢的书籍,Jon Bentley的《编程珠玑》一定可以归于经典之列。如同精美的珍珠出自饱受沙砾折磨的牡蛎,程序员们的精彩设计也来源于曾经折磨他们的实际...

Global site tag (gtag.js) - Google Analytics