`
huangz
  • 浏览: 322253 次
  • 性别: Icon_minigender_1
  • 来自: 广东-清远
社区版块
存档分类
最新评论

TAoCP 6.1 Sequential Searching 顺序查找算法的实现

阅读更多

p.396 算法 S

 

人类史上最简单最直观也是效率最低的查找算法。

 

# coding: utf-8

"""
算法 S

遍历 lst 逐个查找 key 。
"""
def sequential_search(key, lst):
    n = len(lst)

    i = 0 
    while (i < n): 
        if lst[i] == key:
            return i
        else:
            i += 1

    return None

if __name__ == "__name__":
    l = [5,2,1,3,6,9]

    assert sequential_search(3, l) == 3
    assert sequential_search(7, l) is None

 

 

p.396 算法 Q

 

Q 算法将 key 追加到列表的末尾,然后通过对比 i 来判断查找是否成功,它比起 S 算法减少了内循环判断的次数。

 

# coding: utf-8

"""
算法 Q

将 key 追加到 lst 的末尾,通过 i 来判断查找是否成功。
"""
def quick_sequential_search(key, lst):
    n = len(lst)

    lst.append(key)
    new_n = len(lst)

    i = 0 
    while (i < new_n):
        if lst[i] != key:
            i += 1
        else:   
            break

    if i < n:
        return i
    else:
        return None

if __name__ == "__main__":
    l = [5,2,1,3,6,9]

    assert quick_sequential_search(3, l) == 3
    assert quick_sequential_search(7, l) is None

 

 

p.398 算法 Q'

 

Q' 算法改进自 Q 算法,主要改进是以 2 为步进增长 i ,每次将 key 和 lst[i] 、 lst[i+1] 两个元素进行对比,节省了一半 i += 1 的执行时间。

当然,因为列表的长度可能是偶数(% 2 == 0),也可能是奇数(% 2 != 0),因此要小心处理长度为奇数的情况。

 

# coding: utf-8

"""
算法 Q'

以 2 为步进递增 i ,每次将 key 和 lst[i] 、 lst[i+1] 比对。
如果 len(lst) 不能被 2 整除,那么先单独处理 lst[0] 。
"""
def quicker_sequential_search(key, lst):
    n = len(lst)
    i = 0 

    if n % 2 != 0:
        if lst[0] == key:
            return 0
        else:
            i += 1
    
    lst.append(key)
    while i < n:    
        if lst[i] == key:
            return i
        elif lst[i+1] == key:
            return i+1 if i+1 < n else None
        else:
            i +=2 

if __name__ == "__main__":
    # len(l) % 2 != 0
    l = [5,2,6,3,1]
    assert quicker_sequential_search(6, l) == 2
    assert quicker_sequential_search(7, l) is None

    # len(another) % 2 == 0
    another = [5,2,6,3,1,0]
    assert quicker_sequential_search(6, another) == 2
    assert quicker_sequential_search(7, another) is None

 

 

p.398 算法 T

 

算法 T 是最简单(也是最低效)的已排序列表的查找算法。

 

# coding: utf-8

"""
算法 T

最简单(也是效率最低的)对已排序列表进行查找的算法。
"""
def sequential_search_in_ordered_table(key, lst):
    assert sorted(lst) == lst 

    n = len(lst)
    i = 0 
    while i < n:
        if key <= lst[i]:
            return i if key == lst[i] else None
        else:
            i += 1

if __name__ == "__main__":
    l = [1, 2, 3, 5, 6]

    assert sequential_search_in_ordered_table(3, l) == 2
    assert sequential_search_in_ordered_table(4, l) is None
    assert sequential_search_in_ordered_table(10, l) is None

 

现在看来,也只有 S 算法在比较简单的场合在使用,一般情况下,对比较大的列表先进行排序然后再进行查找,或者使用其他数据结构来处理(比如树和哈希表)也可以得到更好的效率。

 

而 Q 和 Q' 算法实现起来比较复杂,容易出错且效果不显著,用来扯淡的成分比较大。

分享到:
评论

相关推荐

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

    1. **排序与搜索**:TAOCP第一卷主要讨论了各种排序算法(如冒泡排序、插入排序、快速排序、归并排序等)和搜索算法(如二分查找、哈希表)。这些算法是所有编程工作中的基础,理解和掌握它们对于优化代码效率至关...

    TAOCP第三卷高清版

    在这一卷中,Knuth详细讨论了各种排序和搜索算法的基础理论和实现,这些算法对于理解和优化计算机程序至关重要。他不仅介绍了传统的排序方法,如冒泡排序、插入排序、选择排序、快速排序、归并排序,还深入探讨了堆...

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

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

    算法 第四版 中文版 mobi for kindle

    《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...

    算法 第4版 高清中文版

    算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了...

    《算法》中文版,Robert Sedgewick,塞奇威克

    5.3.3 Knuth-Morris-Pratt子字符串查找算法 5.3.4 Boyer-Moore字符串查找算法 5.3.5 Rabin-Karp指纹字符串查找算法 5.3.6 总结 5.4 正则表达式 5.4.1 使用正则表达式描述模式 5.4.2 缩略写法 5.4.3 正则...

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

    6. **图算法**:图论在数据结构中占据重要位置,具体数学详细介绍了路径寻找、最短路径、最小生成树等算法,对理解和实现网络流、路由算法等有直接影响。 7. **序列和序列分析**:书中讨论了各种数列,如斐波那契...

    算法第四版 谢路云译 百度云地址

    《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...

    算法第四版pdf

    《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...

    TAOCP卷一TAOCP卷一

    TAOCP卷一

    算法第四版(中文)

    《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...

    TAOCP第二卷高清版

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

    taocp-en-djvu

    taocp-en-djvu

    算法 第4版-谢路云 译(Java描述)-中文-完整版.pdf

    《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...

    算法第四版 中文

    《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...

    TAOCP第一卷高清版

    书中不仅讨论了经典的排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序以及堆排序,还深入研究了二分查找、哈希表和B树等高效搜索方法。 2. **数值计算**:包括浮点数表示、舍入误差处理、高精度计算...

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

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

    算法设计与分析基础.第二版

    该书写于1976年,作者Hopcroft是 1986年ACM图灵奖得主,这三个人写过很多书,大多数都是经典,于一般的算法书不同,该书侧重于证明算法的正确性和复杂性,而不是怎样实现和应用算法,叙述上更加形式化,属于定义-...

    算法,4th,塞奇威克 (Robert Sedgewick)韦恩 (Kevin Wayne), 谢路云 译.azw3

    5.3.3 Knuth—Morris—Pratt子字符串查找算法 5.3.4 Boyer—Moore字符串查找算法 5.3.5 Rabin—Karp指纹字符串查找算法 5.3.6 总结 5.4 正则表达式 5.4.1 使用正则表达式描述模式 5.4.2 缩略写法 5.4.3 正则...

    TAOCP Errata

    该书被誉为计算机科学领域的经典之作,深入探讨了算法设计和分析的理论基础。 2. "Errata" 通常指的是对已出版书籍中的错误进行更正的列表。在本文件中,"TAOCP Errata" 表示的是在《计算机程序设计艺术》第一卷...

Global site tag (gtag.js) - Google Analytics