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' 算法实现起来比较复杂,容易出错且效果不显著,用来扯淡的成分比较大。
分享到:
相关推荐
1. **排序与搜索**:TAOCP第一卷主要讨论了各种排序算法(如冒泡排序、插入排序、快速排序、归并排序等)和搜索算法(如二分查找、哈希表)。这些算法是所有编程工作中的基础,理解和掌握它们对于优化代码效率至关...
在这一卷中,Knuth详细讨论了各种排序和搜索算法的基础理论和实现,这些算法对于理解和优化计算机程序至关重要。他不仅介绍了传统的排序方法,如冒泡排序、插入排序、选择排序、快速排序、归并排序,还深入探讨了堆...
计算机程序设计艺术(第三版,英文版,第一卷:基本算法),TAOCP V1 3rd Edition,英文扫描版,清晰,带书签
《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...
算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了...
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 正则...
6. **图算法**:图论在数据结构中占据重要位置,具体数学详细介绍了路径寻找、最短路径、最小生成树等算法,对理解和实现网络流、路由算法等有直接影响。 7. **序列和序列分析**:书中讨论了各种数列,如斐波那契...
《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...
《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...
TAOCP卷一
《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...
TAOCP作为一个资料库是绝对优秀的,基础的算法只要你能想到的,几乎都可以在上面找到原始出处。
taocp-en-djvu
《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...
《算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行...
书中不仅讨论了经典的排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序以及堆排序,还深入研究了二分查找、哈希表和B树等高效搜索方法。 2. **数值计算**:包括浮点数表示、舍入误差处理、高精度计算...
1. **排序与搜索**:这是第一卷的一个核心主题,Knuth详细介绍了各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序等,还有线性搜索、二分搜索、哈希表搜索等高效查找技术。 2. **递归*...
该书写于1976年,作者Hopcroft是 1986年ACM图灵奖得主,这三个人写过很多书,大多数都是经典,于一般的算法书不同,该书侧重于证明算法的正确性和复杂性,而不是怎样实现和应用算法,叙述上更加形式化,属于定义-...
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 正则...
该书被誉为计算机科学领域的经典之作,深入探讨了算法设计和分析的理论基础。 2. "Errata" 通常指的是对已出版书籍中的错误进行更正的列表。在本文件中,"TAOCP Errata" 表示的是在《计算机程序设计艺术》第一卷...