风也温柔

计算机科学知识库

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

  一、讨论题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, .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.设计一个实验,证明字典的取值操作和赋值操作为常数阶。字典取值操作: 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, .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. 字典赋值操作: dict[key] = value

  

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

  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, .5f, .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()

  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, .6f,.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()

  使用排序方法的()时间复杂度并不是常数,如下:

  三、总结

  主要学习了

  1.大O记法数据结构和算法 2.Python数据结构与算法分析课后习题__chapter2,

  2.时间复杂度数据结构和算法

  3.绘制散点图,

  4.如何对简单的程序进行基准测试等。

  :

  : 纳梨

  Title: 2.数据结构与算法分析课后习题

  相关阅读Title: 网页开发实现本地上传 实现图片上传接口开发 并生成可以访问的图片url…

  版本:.7

  功能,开发用户访问页面,支持图片上传,并保存在服务器上。

  [En]

  , a user to visit the page, , and save it on the .

  项目结构:

  app.py文件内容如下:

  from flask Flask, , ,

  from .utils

   os

  app = Flask(name)

  设置图片保存文件夹

   = ‘photo’

  app.[‘’] =

  设置允许上传的文件格式

   = ‘png’, ‘[jpg’, ‘jpeg’]

  判断文件后缀是否在列表中

  def ():

   ‘.’ in and .(‘.’, 1)[-1] in

  上传图片

  @app.route(“/photo/”, =[‘POST’, “GET”])

  def ():

  if . == ‘POST’:

  获取post过来的文件名称,从name=file参数中获取

  file = .files[‘file’]

  if file and (file.):

  print(file.)

  方法会去掉文件名中的中文

   = (file.)

  保存图片

  file.save(os.path.join(app.[‘’], ))

   “”

  else:

   “格式错误,请上传jpg格式文件”

   (‘index.html’)

  查看图片

  @app.route(“/photo/.jpg”)

  def ():

  图片上传保存的路径

  with open(r’C:/Users////photo/{}.jpg’.(), ‘rb’) as f:

  image = f.read()

  resp = (image, =”image/jpg”)

   resp

  if name == “main“:

  app.run(host=’0.0.0.0′, port=5000, debug=True)

  index.html内容如下:

  请上传图片文件

  启动app.py文件后数据结构和算法,我们先访问 :8002/photo/

  1、页面如下:

  2、我们先上传一张 1001.jpg,提交后界面如下:

  3、然后我们尝试通过图片url来访问这张图片:

  搞定收工!

  以上这篇 实现图片上传接口开发 并生成可以访问的图片url就是小编分享给大家的全部内容了,希望能给大家一个参考

  文章来源:https://www.johngo689.com/320796/