搜索与排序—— 顺序查找与二分查找
Posted 鲸骑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索与排序—— 顺序查找与二分查找相关的知识,希望对你有一定的参考价值。
搜索与排序是计算中常常会出现的问题。本文我们主要研究搜索, 并且主要关注项是否存在集合中,返回项位序留给读者自行实现。
python中的搜索
查询项是否存在:
in
关键字
'a' in ['a', 'b', 'c', 'd']
查询项位序:
index()
方法
l = [4, 2, 1, 7, 0, 6]
l.index(1)
顺序查找
这个是最最基础, 也是最最没技术含量的查找了。
代码实现:
def sequentialSearch(alist, item):
pos = 0
found = False
while pos < len(alist) and not found:
if alist[pos] == item:
found = True
else:
pos += 1
return found
时间复杂度:O(n)
还有另外一种顺序查找针对已经排好序的集合,代这里不贴出,主要是因为时间复杂度与上述代码实现无差别。
二分查找
二分查找的条件为集合为有序(本文有序为从小到大排序, 从大到小原理相同)。主要原理是先从中间查找,如果该项为寻找的项,则完成查找。如中间项小于查找项, 则以起始项到中间项为新集合继续二分查找,中间项大于查找项的话, 以中间项与末尾项为新集合二分查找。
代码实现:
def binarySearch(alist, item):
first = 0
last = len(alist)-1
found = False
while first <= last and not found:
mid = (first + last) // 2
if alist[mid] == item:
found = True
else:
if alist[item] > item:
last = mid - 1
else:
first = mid + 1
return found
代码实现2(递归版):
def binarySearch(alist, item):
if len(alist) == 0:
return False
else:
mid = len(alist) // 2
if alist[mid] == item:
return True
else:
if alist[mid] > item:
return binarySearch(alist[:mid-1], item)
else:
return binarySearch(alist[mid+1:], item)
复杂度:O(log^n)
需要注意的是递归版本中, 切片花费的时间复杂度不为O(1)。
end
以上是关于搜索与排序—— 顺序查找与二分查找的主要内容,如果未能解决你的问题,请参考以下文章