二分法 时间复杂度 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) 
