1.设计一个试验,证明列表的索引操作为常数阶
from timeit import Timer
import random
import numpy as np
from matplotlib import pyplot as plt
a=[]
b=[]
#测x[200]这个代码性能
#"from __main__ import x"表示将x从__main__引入的timeit的计时命名空间
popzero=Timer("x[200]","from __main__ import x")#索引操作
for i in range(1000000,100000001,1000000):
# 起点 终点 步长
b.append(i)#横轴,一共,(100000001-1000000)/1000000个横坐标
x=list(range(i)) #生成不同长度的列表
w=popzero.timeit(1000) #执行1000次得到的总时间(每循环一次执行1000次)
a.append(w)#时间作为纵坐标
#figure方法(创建图形对象):
#plt.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True,**kwargs)
# 编号 大小 分辨率 背景颜色 边框颜色 是否显示边框
plt.figure(figsize=(100,20))
#传入x,y,通过plot画图,并设置折线颜色、透明度、样式、宽度、标记点、标记点大小、标记点边颜色、标记点边宽
#plt.plot(x,y,color='red',alpha=0.3,linestyle='-',linewidth=5,marker='0',markeredgecolor='r',markersize='20',markeredgewidth=10)
#x=np.arange(0,100,10)
#y=x**2
#plt.plot(x,y,linewidth='1',label='test',color='r',linestyle='--',marker='H')#H为六角标记
plt.plot(b,a,'r.-',linewidth=2,ms=5)
#横坐标从b[0]开始,到b[-1]结束,步长1000000
my_x_ticks=np.arange(b[0],b[-1],1000000)
plt.xticks(my_x_ticks)
plt.show()
2.设计一个实验,证明字典的取值操作和赋值操作为常数阶
from timeit import Timer
import random
import numpy as np
from matplotlib import pyplot as plt
x1=[]#用来存储x横坐标
y1=[]
y2=[]
#"from __main__ import x"表示将x从__main__引入的timeit的计时命名空间
popzero=Timer("x[200]","from __main__ import x") #索引操作
h=Timer("x[100]=-1","from __main__ import x") #赋值操作
for i in range(10000,1000001,20000):
x1.append(i)#每次生成的字典的长度存储到x坐标中
x={j:j for j in range(i)} #根据i生成新的字典
w=popzero.timeit(1000) #执行得到字典的索引1000次的总时间
n=h.timeit(1000) #执行进行1000次赋值操作的总时间
y1.append(w) #将每次索引的计算时间存储到y1中
y2.append(n) #将每次赋值的计算时间存储到y1中
plt.figure(figsize=(100,20))
plt.plot(x1,y1,'r.-',linewidth=2,ms=5,label='索引')
plt.plot(x1,y2,'r.-',linewidth=2,ms=5,label='赋值')
my_x_ticks=np.arange(x1[0],x1[-1],2000)
plt.xticks(my_x_ticks)
plt.legend()#图标
plt.show()
3、给定一个数字列表,其中的数字随机排列,编写一个线性阶算法,找出第k小的元素
def ksmal(list2,k): #传入数字列表和k
a=set(list2) #使用集合去除重复元素
if k>len(a): #如果k大于集合的长度,则返回k太大
print("k太大")
return None
else:
b=list(a) #将集合转化为列表
return sorted(b)[k-1] #对列表进行排序,找到第k小的元素
print(ksmal([33,44,666,442,689,75,98,21,55],4))#结果为55