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

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

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值