6.7 二分查找
Posted si-lei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6.7 二分查找相关的知识,希望对你有一定的参考价值。
(1)查找:
查找是在一个项目集合中找到一个特定项目的算法过程。查找通常的答案是真的或假的,因为该项目是否存在。 查找的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找
(2)二分查找:
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
(3)代码实现:
1 # 二分查找 非递归实现 2 def binary_search1(alist, item): 3 """二分查找,非递归""" 4 n = len(alist) 5 first = 0 6 last = n-1 7 while first <= last: 8 mid = (first + last) // 2 9 if alist[mid] == item: 10 return True 11 elif item < alist[mid]: 12 last = mid - 1 13 else: 14 first = mid + 1 15 return False 16 17 # 二分查找 递归实现 18 def binary_search2(alist, item): 19 """二分查找,递归""" 20 n = len(alist) 21 if n > 0: 22 mid = n // 2 23 if alist[mid] == item: 24 return True 25 elif item < alist[mid]: 26 return binary_search2(alist[:mid], item) 27 else: 28 return binary_search2(alist[mid+1:], item) 29 return False 30 31 32 if __name__ == "__main__": 33 li = [17, 20, 26, 31, 44, 54, 55, 77, 93] 34 print("非递归版本:") 35 print(li) 36 print(binary_search1(li, 55)) 37 print(binary_search1(li, 100)) 38 39 print("-"*50) 40 41 print("递归版本:") 42 print(binary_search2(li, 55)) 43 print(binary_search2(li, 100))
(4)运行结果:
(5)时间复杂度:
最优时间复杂度:O(1)
最坏时间复杂度:O(logn)
以上是关于6.7 二分查找的主要内容,如果未能解决你的问题,请参考以下文章