一下通过Python实现运用二分法分别在10^1-10^8 个元素中查找随机数的代码。
import random, time
def binary_chop(x):
count = 1 # 计数器
numbers = list(range(1, x+1)) # 创建列表
random_number = random.choice(numbers) # 在给定范围内生成随机查找数
print('随机查找数: %s' % random_number)
while True:
if (numbers[-1] + numbers[0]) % 2 == 0: # 如果列表元素个数为奇数
middle_number = int((numbers[0] + numbers[-1]) / 2) # 获取中间数(列表正好有中间数)
else:
middle_number = int((numbers[0] + numbers[-1]) / 2 + 1) # 如果列表元素个数为偶数,中间数为右边一半列表的第一个数
numbers = caculate(random_number, middle_number, numbers)
if numbers == 0:
print('总共需要查找的次数: %s 次' % count)
break
count += 1
def caculate(random_number, middle_number,numbers):
if random_number == middle_number: # 如果恰好随机数在中间则找到该随机数
return 0
elif random_number > middle_number: # 如果随机数大于中间数,保留列表右半边,继续查找
numbers = list(range(middle_number, numbers[-1] + 1))
return numbers
else: # 如果随机数小于中间数,保留列表左半边,继续查找
numbers = list(range(numbers[0], middle_number + 1))
return numbers
def value_setting():
list = ['十个', '一百个', '一千个', '一万个', '十万个', '一百万个', '一千万个', '一亿个']
for i in range(1, 9): # 在10的一次方到八次方数量级上查找随机数并计算耗费时间,查找所需的次数
begin = time.time()
binary_chop(10 ** i)
end = time.time()
print('在%s元素中进行随机查找 耗费时间: %s 秒\n' % (list[i-1], (end - begin)))
print('-' * 20)
value_setting()
程序运行之后的结果:
随机查找数: 5
总共需要查找的次数: 3 次
在十个元素中进行随机查找 耗费时间: 0.000102996826171875 秒
--------------------
随机查找数: 63
总共需要查找的次数: 6 次
在一百个元素中进行随机查找 耗费时间: 4.291534423828125e-05 秒
--------------------
随机查找数: 324
总共需要查找的次数: 9 次
在一千个元素中进行随机查找 耗费时间: 0.00015306472778320312 秒
--------------------
随机查找数: 9039
总共需要查找的次数: 13 次
在一万个元素中进行随机查找 耗费时间: 0.001062154769897461 秒
--------------------
随机查找数: 6026
总共需要查找的次数: 14 次
在十万个元素中进行随机查找 耗费时间: 0.008674144744873047 秒
--------------------
随机查找数: 955416
总共需要查找的次数: 19 次
在一百万个元素中进行随机查找 耗费时间: 0.10787487030029297 秒
--------------------
随机查找数: 6819278
总共需要查找的次数: 23 次
在一千万个元素中进行随机查找 耗费时间: 1.2694149017333984 秒
--------------------
随机查找数: 33477582
总共需要查找的次数: 27 次
在一亿个元素中进行随机查找 耗费时间: 24.8403160572052 秒
--------------------