折半查找(二分查找)
思路
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
代码
def bin_search(items: list, key, *, cmp=lambda x, y: x - y) -> int:
"""二分查找(渐近时间复杂度O(log2 n))
:param items: 待查找的列表(元素有序)
:param key: 要找的元素
:param cmp: 比较两个元素的函数(返回0表示两个元素相等,返回大于0的值,表示x>y)
:return: 找到了返回元素的索引,找不到返回-1
"""
start, end = 0, len(items) - 1
while start <= end:
mid = (start + end) // 2
if cmp(key, items[mid]) > 0:
start = mid + 1
elif cmp(key, items[mid]) < 0:
end = mid - 1
else:
return mid
return -1
顺序查找
思想
就是把元素拿到里面一个个比对,有就返回,没有就返回-1。
代码
def seq_search(items: list, key) -> int:
"""顺序查找(渐近时间复杂度O(n))
:param items: 待查找的列表
:param key: 要找的元素
:return: 找到了返回元素的索引,找不到返回-1
"""
for index, item in enumerate(items):
if item == key:
return index
return -1