大话数据结构的第八章,查找,说了好大一堆查找的东西,其中每次老师会经常提到的就是二分查找还有哈希表,所以我也只想多多看看这两方面的内容~
binary search
1.经典二分查找
要解决的问题是:是在有序的序列中找到所需的数字。
中心思想是:将有序序列(假设为升序排列)中间的数字设为middle数值,左边第一个数字设为left,右边第一个数字设为right,将target与middle先做比较,若middle比target大,证明target应该出现在middle的左半段,则可以将middle右半段的序列舍弃,反之同理。
代码如下:
def binary_search(list1,target):
if list1 == None or len(list1) == 0:
return -1
left = 0
right = len(list1) - 1
while left <= right:
#这里要是没有=的话,在left=right的情况下
#如果target正好等于list1[left] = list1[right]就会正好被漏判,返回-1.
mid = int((left+right)/2)
if list1[mid] < target:
left = mid + 1
elif list1[mid] > target:
right = mid - 1
else:
return mid
return -1
此算法时间复杂度为:o(logn)(假设序列长度为n)
推导:序列长度为n,比较一次后,序列长度变为n/2,比较j次过后,序列长度变为n/(2^j),最终序列长度会变为1,所以令n/(2^j)=1,j = log2n,所以时间复杂度为o(logn)。
空间复杂度:o(1)
2.矩阵中的二分查找
问题:若给一个有序的矩阵如下所示
1 2 3 4
5 6 7 8