`
fanzy618
  • 浏览: 20292 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

[TAOCP第三卷6.1节]顺序搜索

阅读更多
TAOCP第三卷搜索算法中最先讲的就是顺序搜索。
顺序搜索的优点是足够的简单,在数据量足够小的时候速度最快。
而且在无序数据集的时候顺序搜索是唯一可行的方法。

首先是6.1节的程序S
int search(int array[],int count, int n) {
    int i = 0;
    for(; i < count; i++) {
        if(array[i] == n) {
            return i;
        }
    }
    return -1;
}

非常简单,但是每个循环需要比较两次。
通过在尾部追加一个哨兵值,可以把比较次数降为一次。
这就是6.1节的算法Q:
int search(int array[],int count, int n) {
    int i = 0;
    int t = array[count];  //假设这里有空间,先保存现场
    array[count] = n;
    for(; array[i] != n; i++) {
    }
    array[count] = t; //还原现场
    if(i < count) {
        return i;
    else {
        return -1;
    }
}

当n比较大的时候会比算法S快一些。但是要求在array的尾部有多余的空间,
内存分配的时候需要注意一点。

算法Q有个一个优化版Q'
int search(int array[],int count, int n) {
    int i = 0;
    int t = array[count];  
    array[count] = n;
    while(1) {
        if(array[i] == n) {
            break;
        }
        if(array[i+1] == n) {
            i++;
            break;
        }
        i += 2
    }
    array[count] = t; 
    if(i < count) {
        return i;
    else {
        return -1;
    }
}

一次步进2,算是一种手工的循环展开吧。
不过gcc使用-O3参数时会自动进行循环展开,
这种工作还是留给编译器吧。

如果数据是有序的,则可以使用算法T:
int search(int array[],int count, int n) {
    int i = 0;
    int t = array[count];  
    array[count] = INT_MAX;  //设置一个大于array中所有值的值
    for(; array[i] < n; i++) {
    }
    
    array[count] = t; 
    
    //array[i] >= n
    if(i < count && array[i] == n) {  //多了一个判断条件
        return i;
    else {
        return -1;
    }
}

在查找成功的时候算法T和算法Q一样快,
但是失败的时候T比Q大约两倍。

对于有序数据可以使用更快的二分查找,
但是并不是所有的时候二分查找都跟快。
在数据总数N比较小的时候,算法T更快,而且T更简单。


分享到:
评论

相关推荐

    TAOCP第三卷高清版

    第三卷,即"排序与搜索"卷,是该系列中的一个重要组成部分,涵盖了数据组织、排序算法和查找技术等核心主题。 在这一卷中,Knuth详细讨论了各种排序和搜索算法的基础理论和实现,这些算法对于理解和优化计算机程序...

    TAOCP第二卷高清版

    TAOCP作为一个资料库是绝对优秀的,基础的算法只要你能想到的,几乎都可以在上面找到原始出处。

    MMIX 手册(TAOCP第一卷中的相关部分)

    MMIX 手册(TAOCP第一卷中的相关部分)

    计算机程序设计艺术中文版清晰(第三卷)

    第三卷,标题为"排序与搜索",是整个系列中的一个重要组成部分。 在这一卷中,Knuth主要关注的是数据组织和检索方法,这是计算机科学中的核心问题。排序是指将一组数据按照特定顺序排列的过程,而搜索则涉及在已...

    TAOCP㈠.rar计算机程序设计艺术(第一卷)

    1. **排序与搜索**:这是第一卷的一个核心主题,Knuth详细介绍了各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序等,还有线性搜索、二分搜索、哈希表搜索等高效查找技术。 2. **递归*...

    taocp 三卷共165MB 一共只要15分 省积分的这边来!

    Addison Wesley - 2001 - Knuth - The Art of Computer Programming Vol I II III IV全卷共165MB.一共只要15分. 我也是下载后自行打包的.原来一共8卷,每个3分,用了我24分. 拿来共积分不多的人下载.

    TAOCP第一卷高清版

    《TAOCP》第一卷为读者构建了坚实的算法基础,并鼓励读者深入探索计算机科学的其他领域。阅读这本书不仅能提升编程能力,更能培养出解决问题的批判性思维。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    TAOCP Vol 3

    计算机程序设计技巧3.排序查找计算机程序设计技巧3.排序查找

    TAOCP卷一TAOCP卷一

    TAOCP卷一

    taocp-en-djvu

    taocp-en-djvu

    计算机程序设计艺术 英文版 前三卷

    计算机程序设计进阶必备,研究编程宝典,内容包含前三卷的英文版。

    TAOCP, 算是到现在为止已经写出来的

    3. **计算机程序的数学分析**:第三卷涉及数学在编程中的应用,如数论、组合数学、概率论等,这对于理解和设计复杂算法至关重要。 4. **浮点计算**:第四卷讨论浮点数表示、算术运算的精度问题以及数值稳定性,这...

    计算机程序设计艺术(第三版,英文版,第一卷:基本算法),TAOCP V1 3rd Edition

    计算机程序设计艺术(第三版,英文版,第一卷:基本算法),TAOCP V1 3rd Edition,英文扫描版,清晰,带书签

    java高手真经_编程基础卷 第五卷(共七卷)

    第一部分:Java开发入门 第二部分:Java语法基础 第三部分:Java核心编程 第四部分:Java图形编程 第五部分:Java网络编程

    TAOCP Errata

    在本文件中,"TAOCP Errata" 表示的是在《计算机程序设计艺术》第一卷(第三版)中的更正记录。 3. 文件中提到的“错误更新”级别包括以下四种: - 错误(errors):包括技术性或排版错误,即常说的“bug”,这些...

    TAOCP㈡.rar计算机程序设计艺术(第二卷)

    《TAOCP》第二卷不仅对专业程序员有深远影响,也是教育工作者、科研人员和数学爱好者的宝贵资源。它通过深入浅出的讲解,帮助读者理解并掌握数值计算领域的核心概念,从而能够编写更高效、更稳定的代码。通过阅读这...

    [TAOCP的数学基础]具体数学

    《具体数学》是计算机科学领域的一本经典著作,由著名计算机科学家Donald Knuth撰写,作为其巨著《计算机程序设计艺术》(The Art of Computer Programming,简称TAOCP)的数学基础部分。这本书深入浅出地介绍了...

    TAOCP 卷一

    最著名的算法分析书,作者是顶尖大牛,英文原版,第三版。

    计算机程序设计艺术第二版第三卷

    现在发行的只有三卷,分别为基础运算法则,半数值算法,以及排序和搜索(在写本文之际,第四卷已经出来了,我也在第一时间抢购了一本)。本书结合大量数学知识,分析不同应用领域中的各种算法,研究算法的复杂性,即...

    mmix文档-用于taocp

    《美国地区英语词典》第三卷(1996年)将“mommix”列为一个普通的方言词汇,它可以用作名词或动词;动词用法“tomommix something”意味着把某事搞砸、搞乱。未来是否Knuth对MMIX的定义会被认为是“mommix”,将取...

Global site tag (gtag.js) - Google Analytics