二分法 时间复杂度 O(logN)
根据log(x) 曲线,随着数据量x的增大,耗时时间y并不会有太大的变化。
随着x增大,可以看到曲线趋近于直线,y的值变化不大
题目:给定一个数GUEST,以及排序好的列表THE_LIST,要求输出THE_LIST中的数middle,使得middle=GUEST
完成以下函数find_data
import random import time GUEST = 1980 N = 10 ** 5 # 根据logN 曲线,随着数据量x的增大,耗时时间y并不会有太大的变化。 THE_LIST = sorted([random.randint(0, N) for _ in range(N)]) list_len = len(THE_LIST) s = time.time() def find_data(the_list): pass print(find_data(THE_LIST)) print('列表长度', list_len) print('耗时', time.time() - s) print('---------------------------')
题解:
def find_data(the_list): # return the_list[the_list.index(GUEST)] while True: if not the_list: print('列表没有这个数') break inx = int(len(the_list) / 2) middle = the_list[inx] if middle == GUEST: print('这个数是:', middle) return middle elif middle > GUEST: the_list = the_list[:inx] else: the_list = the_list[inx + 1:]
同样的思路:
给定一个数GUEST,连续整数n~m ,要求输出n~m中的数middle,使得middle=GUEST
import time GUEST = 198000 n = 1 m = 10 ** 10 s = time.time() while True: if GUEST > m or GUEST < n: print('给定的范围内没有这个数') break middle = int((n + m) / 2) if middle == GUEST: print('这个数是:', middle) break elif middle > GUEST: m = middle else: n = middle print('耗时', time.time() - s)