2.Python数据结构与算法分析课后习题__chapter2

chapter2_answer

一、讨论题

1.O( n 2 n^2 n 2 )

2.O( n n n )

3.O( log ⁡ ( n ) \log (n)lo g (n ) )

4.O( n 3 n^3 n 3 )

2.O( n n n )

二、编程练习

1.设计一个实验,证明列表的索引操作为常数阶。

import timeit
import random
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

lenx = []
listy = []
color = ['c', 'b', 'g', 'r', 'm', 'y', 'k', 'w']

for i in range(10000, 1000001, 20000):
    t = timeit.Timer("x[random.randrange(%d)]" % i,"from __main__ import random, x")
    x = list(range(i))
    list_time = t.timeit(number=1000)
    print("%d, %10.3f" % (i, list_time))
    lenx.append(i)
    listy.append(list_time)
    ax = plt.gca()

    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')

    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    listdot = plt.scatter(lenx, listy, c=color[3], edgecolors='r', label='list')
    plt.xlabel('lenth(list)')
    plt.ylabel('time(/s)')
    plt.title('List_index')
    plt.legend()
    plt.show()

2.Python数据结构与算法分析课后习题__chapter2

2.设计一个实验,证明字典的取值操作和赋值操作为常数阶。

  1. 字典取值操作: dict.get(key)
import timeit
import random
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

lenx = []
dicty = []
color = ['c', 'b', 'g', 'r', 'm', 'y', 'k', 'w']

for i in range(10000, 1000001, 20000):
    t = timeit.Timer("x.get(random.randrange(%d))" % i, "from __main__ import random, x")
    x = {j: None for j in range(i)}
    dict_time = t.timeit(number=1000)
    print("%d, %10.3f" % (i, dict_time))
    lenx.append(i)
    dicty.append(dict_time)
    ax = plt.gca()

    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')

    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    dictdot = plt.scatter(lenx, dicty, c=color[3], edgecolors='r', label='dict')
    plt.xlabel('lenth(dict)')
    plt.ylabel('time(/s)')
    plt.title('dict_assign()')
    plt.legend()
    plt.show()

2.Python数据结构与算法分析课后习题__chapter2
2. 字典赋值操作: dict[key] = value

    t = timeit.Timer("x[random.randrange(%d)] = random.randrange(%d)" % (i,i), "from __main__ import random, x")

2.Python数据结构与算法分析课后习题__chapter2

3.列表和字典比较del 操作的性能

import timeit
import random
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

lenx = []
listy = []
dicty = []
color = ['c', 'b', 'g', 'r', 'm', 'y', 'k', 'w']

for i in range(1000000, 100000001, 1000000):
    t = timeit.Timer("del x[random.randrange(%d)]" % i, "from __main__ import random, x")

    x = list(range(i))
    list_time = t.timeit(number=1)
    x = {j:None for j in range(i)}
    dict_time = t.timeit(number=1)
    print("%d, %15.5f, %15.5f" % (i, list_time, dict_time))

    lenx.append(i)
    listy.append(list_time)
    dicty.append(dict_time)
    ax = plt.gca()

    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')

    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    listdot = plt.scatter(lenx, listy, c=color[3], edgecolors='r', label='list')
    dictdot = plt.scatter(lenx, dicty, c=color[1], edgecolors='b', marker='^', label='dict')
    plt.xlabel('lenth(list&dict)')
    plt.ylabel('time(/s)')
    plt.title('List&Dict_del_analysis')
    plt.legend()
    plt.show()

2.Python数据结构与算法分析课后习题__chapter2

4.给定一个数字列表,其中的数字随机排列,编写一个线性阶算法,找出第k 小的元素,并解释为何该算法的阶是线性的。

5.针对前一个练习,能将算法的时间复杂度优化到O( n l o g n n log n n l o g n )吗?

import timeit
import random
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

def findkMin(x, k):
    if k == 0:
        return -1
    k -= 1
    while k:
        temp = x[0]
        j = 0
        for i in range(len(x)):
            if temp > x[i]:
                temp = x[i]
                j = i
        del x[j]
        k -= 1
    temp = x[0]
    for i in range(len(x)):
        if temp > x[i]:
            temp = x[i]
    return temp

def findkMin1(x, k):

    x.sort()
    return x[k-1]

lenx = []
find1y = []
find2y = []
color = ['c', 'b', 'g', 'r', 'm', 'y', 'k', 'w']

if __name__ == '__main__':
    x1 = [1,3,2,4]
    x = list(range(100))
    np.random.shuffle(x)
    print(x)
    print(findkMin1(x,0))

    for i in range(100, 200000, 1000):
        t1 = timeit.Timer("findkMin(x,random.randrange(%d))" % i, "from __main__ import random, x,findkMin")
        t2 = timeit.Timer("findkMin1(x,random.randrange(%d))" % i, "from __main__ import random, x,findkMin1")
        x = list(range(i))
        np.random.shuffle(x)
        findtime1 = t1.timeit(number=1)
        x = list(range(i))
        np.random.shuffle(x)
        findtime2 = t2.timeit(number=1)
        print("%d, %15.6f,%15.6f" % (i, findtime1, findtime2))
        lenx.append(i)
        find1y.append(findtime1)
        find2y.append(findtime2)
        ax = plt.gca()

        ax.spines['top'].set_color('none')
        ax.spines['right'].set_color('none')

        ax.xaxis.set_ticks_position('bottom')
        ax.spines['bottom'].set_position(('data', 0))
        ax.yaxis.set_ticks_position('left')
        ax.spines['left'].set_position(('data', 0))
        plt.scatter(lenx, find1y, c=color[3], edgecolors='r', label='FindKMin1')
        plt.scatter(lenx, find2y, c=color[1], edgecolors='b', marker='^', label='FindKMin2')
        plt.xlabel('lenth(list)')
        plt.ylabel('time(/s)')
        plt.title('FindKMin_analysis')
        plt.legend()
        plt.show()

2.Python数据结构与算法分析课后习题__chapter2
使用排序方法的findkmin()时间复杂度并不是常数,如下:
2.Python数据结构与算法分析课后习题__chapter2

三、总结

主要学习了

1.大O记法,
2.时间复杂度,
3.python绘制散点图,
4.如何对简单的python程序进行基准测试等。

Original: https://blog.csdn.net/conan04260426/article/details/127028641
Author: 纳梨
Title: 2.Python数据结构与算法分析课后习题__chapter2

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/759481/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 零基础入门Python要买什么书容易上手?强烈推荐这五本!!

    Original: https://www.cnblogs.com/zichengPython/p/16696431.htmlAuthor: 爱学习的小刘Title: 零基础入门P…

    Python 2023年10月31日
    079
  • Quartz框架汇总

    目录 一.Quartz理论基础 (一)Timer 二.线程池 (一)ScheduledThreadPoolExcutor (二)SingleThreadScheduledExecu…

    Python 2023年11月7日
    036
  • Datawhale学习打卡-01(Matplotlib)

    在绘图时将绘图对象显式赋值给一个变量,如将plt.plot([1, 2, 3, 4]) 改成line =plt.plot([1, 2, 3, 4]) 一个更简单的写法 line =…

    Python 2023年9月2日
    033
  • dataframe的head方法_DataFrame

    DataFrame 表示矩阵数据表,有行索引和列索引。 构建方式 In [43]: data = {‘state’: [‘Ohio’…

    Python 2023年8月18日
    054
  • Django笔记(十二)连表查询之性能提升

    目录 回顾之前的外键查询 第一个方法 第二个方法(select_related()连表查,性能差) 第三个方法(prefetch_related()多次单表查,性能高) 回顾之前的…

    Python 2023年8月5日
    044
  • python是什么?工作前景如何?怎么算有基础?爬数据违法嘛?。。

    Original: https://www.cnblogs.com/jnjnj/p/16226419.htmlAuthor: python茜Title: python是什么?工作前…

    Python 2023年11月2日
    064
  • Django_模型详解

    Django_模型ORM Django中内嵌了ORM框架,不需要直接编写SQL语句进行数据库操作,而是通过定义模型类,操作模型类来完成对数据库中表的增删改查和创建等操作。 O是ob…

    Python 2023年10月31日
    050
  • Python-Matplotlib可视化(7)——多方面自定义统计图绘制

    Python-Matplotlib可视化(7)——多方面自定义统计图绘制 * – 前言 – 多个子图的合成 – + 为每个子图添加标题 + 子图…

    Python 2023年9月3日
    053
  • 漏洞修复实用指南

    首先我们来定义漏洞修复这个概念。开发人员和安全团队为了 防止外部恶意攻击,使用一些方法来识别、优先考虑、修复和监控漏洞,这个过程就是漏洞修复了。 在检测方面,企业可以使用各种应用程…

    Python 2023年10月22日
    035
  • 采用scrapy对秀动网演出信息爬取

    爬取结果 mongodb数据库: ; spider文件 分析秀动网站页面的布局,准备爬取我们需要的信息。 没有粘贴代码,简单讲解一下爬取上海所有的演出信息。 parse方法里面定义…

    Python 2023年10月3日
    025
  • vue3的基本使用(超详细)

    一、初识vue3 1.vue3简介 2020年9月18日,vue3发布3.0版本,代号大海贼时代来临,One Piece 特点: 无需构建步骤,渐进式增强静态的 HTML 在任何页…

    Python 2023年10月11日
    054
  • scrapy 下载及处理文件和图片

    scrapy框架-下载及处理文件和图片 前言:scrapy提供下载item中包含的文件及图片, 提供了一个可重用的item pipelines, 这些pipeline有些共同的方法…

    Python 2023年10月2日
    040
  • Javaweb-Servlet学习

    1.Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个借口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两…

    Python 2023年6月12日
    078
  • Nodejs调用python的几种方案

    nodejs可以使用JavaScript进行后端应用开发,同时使用electron可以开发桌面应用,可以说是相当强大。如果要在nodejs中读取本地文件则可以使用fs模块进行,ff…

    Python 2023年8月2日
    050
  • 3D卷积神经网络详解

    1 3d卷积的官方详解 2 2D卷积与3D卷积 1)2D卷积 2D卷积:卷积核在输入图像的二维空间进行滑窗操作。 2D单通道卷积 对于2维卷积,一个3*3的卷积核,在单通道图像上进…

    Python 2023年9月28日
    055
  • 爬虫日记(70):Scrapy的SitemapSpider使用

    在开发爬虫的过程中,经常会遇到整个网站内容进行下载,比如像头条的APP类似的需求,它需要统计全世界上所有的新闻网站,看看这些网站出现什么内容是热点,这样把所有热点放到一起,再推荐给…

    Python 2023年10月5日
    043
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球