import timeit
import random
本人手写或借阅资料,仅供参考,有错误欢迎指正。
#2.1 设计一个实验,证明列表的索引操作为常数阶。
#2.2 设计一个实验,证明字典的取值操作和赋值操作为常数阶。
if 0:
for i in range(1000, 100001, 2000):
t = timeit.Timer("random.randrange(%d) in x" % i, "from __main__ import random, x")
x = list(range(i))
lidx_time = t.timeit(number = 1000)
t = timeit.Timer("x.get(random.randrange(%d))" % i, "from __main__ import random, x")
x = {j:None for j in range(i)}
dget_time = t.timeit(number = 1000)
t = timeit.Timer("x[random.randrange(%d)] = random.randrange(%d)" % (i, i), "from __main__ import random, x")
dint_time = t.timeit(number = 1000)
print("%d, %10.3f, %10.3f, %10.3f" % (i, lidx_time, dget_time, dint_time))
#2.3 列表和字典比较del 操作的性能
if 0:
for i in range(1000000, 100000001, 2000000):
t = timeit.Timer("del x[random.randrange(%d)]" % i, "from __main__ import random, x")
x = list(range(i))
lst_time = t.timeit(number = 1)
x = {j:None for j in range(i)}
dict_time = t.timeit(number = 1)
print("%d, %10.3f, %10.3f" % (i, lst_time, dict_time))
#2.4 给定一个数字列表,其中的数字随机排列,编写一个线性阶算法,找出第k 小的元素,
#并解释为何该算法的阶是线性的。
#O(kn)
def findkmin1(l, k):
k -= 1
while k:
kmin, tmp= 255, 0
for i in range(len(l)):
if l[i] < kmin:
kmin = l[i]
tmp = i
del l[tmp]
k -= 1
return min(l)
#2.5 针对前一个练习,能将算法的时间复杂度优化到O(n log n)吗?
def findkmin2(l, k):
l.sort()
return l[k - 1]
def findminktest():
l1 = [79, 58, 4, 35, 5, 6, 76, 99]
l2 = [79, 58, 4, 35, 5, 6, 76, 99]
print(findkmin1(l1, 4))
print(findkmin2(l2, 4))