递归与列表查找(二分查找)
递归:
调用自身(自己调用自己)
结束条件(递归最大深度)
def func3(x): if x > 0: print(x) func3(x-1) func3(5) # 执行结果 5 4 3 2 1
def func4(x): if x > 0: func4(x-1) print(x) func4(5) # 执行结果 1 2 3 4 5
时间复杂度
时间复杂度:用来评估算法运行时间的一个公式(单位)。
一般来说,时间复杂度高的算法比复杂度低的算法慢。
常见的时间复杂度(按效率排序)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
print("hello world") O(1)
for i in range(n): print('hello world') O(n)
如何一眼判断时间复杂度?
循环减半的过程
O(logn) 几次循环就是n的几次方的复杂度
空间复杂度
空间复杂度:用来评估算法内存占用大小的一个式子
“空间换时间”:
变量O(1)
列表O(n)
二维列表O(n2)
三维列表O(n3)
列表查找
列表查找:从列表中查找指定元素
顺序查找
从列表第一个元素开始,顺序进行搜索,直到找到为止。
二分查找
从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。
# 二分查找[1,2,3,4,5,6,7,8]
import random import time def cal_time(func): """ 测试时间装饰器 :param func: 接收一个函数 :return: """ def wrapper(*args, **kwargs): ti = time.time() x = func(*args, **kwargs) ti2 = time.time() print("time cost:", func.__name__, ti2 - ti) return x return wrapper @cal_time def search(data_set, val): """ 二分查找 :param data_set:有序列表 :param val:要查找的值 :return:列表下标 """ low = 0 high = len(data_set) - 1 while low <= high: mid = (low + high) // 2 if data_set[mid] == val: return mid elif data_set[mid] < val: low = mid + 1 else: high = mid - 1 return val ls = list(range(10000)) print(search(ls, 5050)) -----------------返回测试结果------------------ time cost: search 0.0 5050
生成:[{'name': '王洋', 'id': 1001, 'age': 39}, {'name': '赵丽', 'id': 1002, 'age': 37}]
import random def random_list(n): """ [{'name': '王洋', 'id': 1001, 'age': 39}, {'name': '赵丽', 'id': 1002, 'age': 37}] :param n: :return: """ result = [] a1 = ["赵", "王", "孙", "李"] a2 = ["丽", "洋", " ", "", "晓"] a3 = ["洋", "艳", ""] ids = list(range(1001, 1001+n)) for i in range(n): dicts = {} dicts["age"] = random.randint(18, 60) dicts["id"] = ids[i] dicts["name"] = random.choice(a1)+random.choice(a2)+random.choice(a3) result.append(dicts,) return result
import random def tw_search(data_set, val): """ 二分查找 :param data_set:[{'id': 1001, 'age': 42, 'name': '赵 艳'}, {'id': 1002, 'age': 33, 'name': '王洋'}] :param val:需要找查的ID值 ”1002“ :return:返回列表下标 """ low = 0 high = len(data_set) - 1 while low <= high: mid = (low + high) // 2 if data_set[mid]["id"] == val: return mid elif data_set[mid]["id"] < val: low = mid + 1 else: high = mid - 1 return data = random_list(1000) a = tw_search(data, 1805) print(data[a]) ---------------------执行结果--------------------- {'id': 1805, 'age': 37, 'name': '孙丽艳'}