查找,指在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程,本文主要介绍两种基本的查找方法:顺序查找算法和二分查找算法。
顺序查找算法
顺序查找算法又称顺序搜索算法或者线性搜索算法,是所有查找算法中最基本、最简单的,对应的时间复杂度为O(n)。顺序查找算法适用于绝大多数场景,既可以在有序序列中查找目标元素,也可以在无序序列中查找目标元素。
Python中内置的查找函数 index() 就是顺序查找方法。
def linear_search(lst, val): for i,v in enumerate(lst): if val == v: return i return -1 lst = [1,2,3,4,5, 6, 7, 8, 9] print(linear_search(lst, 3))
二分查找算法
二分查找又称折半查找,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn)。二分查找算法仅适用于有序序列,它只能用在升序序列或者降序序列中查找目标元素。核心思想是:不断地缩小搜索区域,降低查找目标元素的难度。
def binary_search(lst, val): left = 0 right = len(lst) - 1 while left <= right: mid = (left + right) // 2 if lst[mid] == val: return mid elif lst[mid] > val: # 待查找的值在mid左侧 right = mid - 1 else: # 待查找的值在mid右侧 left = mid + 1 return -1 lst = [1, 2, 3, 4, 5, 6, 7, 8, 9] print(binary_search(lst, 3))
算法比较
前面介绍的两个算法,时间复杂度不同,以下借助一个装饰器函数,来对比一下两个运行效率。
def calc_time(func): def wrapper(*args, **kwargs): t_b = time.time() result = func(*args, **kwargs) t_e = time.time() print('%s running time: %s secs.' % (func.__name__, t_e - t_b)) return result return wrapper @calc_time def linear_search(lst, val): pass @calc_time def binary_search(lst, val): pass # 修改输入数据 lst = range(100000000) print(linear_search(lst, 31090989)) print(binary_search(lst, 31090989)) # 输出 linear_search running time: 2.874976873397827 secs. binary_search running time: 2.002716064453125e-05 secs.
以上试验得出,当查找数据量较大时,二分查找的时间远小于顺序查找。
本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/75
- 上一篇:
- Sklearn使用决策树训练分类模型