Python数据结构与算法分析(第二版)答案 - 第二章(仅供参考)

Python数据结构与算法分析(第二版)答案 - 第二章(仅供参考),第1张

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))

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/718868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存