`
huangz
  • 浏览: 320554 次
  • 性别: 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卷一TAOCP卷一

    TAOCP卷一

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

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

    算法 第四版 中文版 mobi for kindle

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

    TAOCP Errata

    TAOCP Errata TAOCP Errata TAOCP Errata TAOCP Errata TAOCP Errata

    算法第四版pdf

    《算法(第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 正则...

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

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

    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种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...

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

    该书写于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 正则...

    算法 第4版-谢路云 译(Java描述)-完整版_部分4

    Sedgewick之巨著,与高德纳TAOCP一脉相承,几十年多次修订,经久不衰的畅销书,涵盖所有程序员必须掌握的50种算法。 《算法:第4版》作为算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对...

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

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

    算法第四版

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

Global site tag (gtag.js) - Google Analytics