from tkinter import *
import timeit
import matplotlib.pyplot as plt
#------------------------------------------------------------------------
# ST_Recur
#------------------------------------------------------------------------
def midpoint(p1,p2):
return ((p1[0]+p2[0])/2,(p1[1]+p2[1])/2)
def ST_Recur(level, p1, p2, p3):
if level == 1:
canvas.create_polygon(p1, p2, p3)
canvas.update
else:
p4 = midpoint(p1, p2)
p5 = midpoint(p2, p3)
p6 = midpoint(p1, p3)
ST_Recur(level - 1,p1,p4,p6)
ST_Recur(level - 1,p4,p2,p5)
ST_Recur(level - 1,p6, p5,p3)
#------------------------------------------------------------------------
# DrawSierpinskiTriangle
#------------------------------------------------------------------------
def DrawSierpinskiTriangle(event=None):
global size
level = int(levels.get())
canvas.delete("all")
p1 = (0.1*size, 0.9*size) # bottom left
p2 = (0.5*size, 0.1*size) # top
p3 = (0.9*size, 0.9*size) # bottom right
ST_Recur( level, p1, p2, p3)
#===================================================================================
root = Tk()
root.title("Sierpinski Triangle")
#---- entry box for level number
Label(root, text="Levels:").grid(row=1, column=1, sticky=W)
levels = StringVar()
levels_entry = Entry(root, width=7, textvariable=levels)
levels_entry.grid(row=1, column=2)
#---- button to draw
Button(root, text="Draw", command=DrawSierpinskiTriangle).grid(row=1, column=3)
#---- return key to draw
root.bind("<Return>", DrawSierpinskiTriangle)
#---- canvas to draw
size = 500
canvas = Canvas(root, width=size, height=size, borderwidth=1, highlightbackground='black', background='white')
canvas.grid(row=1, column=4)
#---- space out widgets
for child in root.winfo_children():
child.grid_configure(padx=5, pady=5)
#---- start event loop
start = timeit.timeit()
a = ST_Recur
end = timeit.timeit()
print(start - end)
plt.plot(start - end)
plt.show()
root.mainloop()
有人可以帮我绘制这个Sierpinski Triangle程序的图形吗?我正在尝试确定程序是线性O(n ^ 2)还是指数O(Logn)。我不确定如何将ST_recure函数和运行时间集成到mat plot lib中。目的是测量运行时间和图表。
答案 0 :(得分:1)
来自评论:
问题大小是要绘制的级别数
这是关键细节。在分析算法时,我们需要一种方法来测量不同输入的“大小”。对于家庭作业,您需要某种类型的循环,该循环以ST_Recur()
的不同值调用level
。您还需要为每个调用计时,并收集level
与运行时间之间的数据。然后,您可以在线图中或类似图形中绘制该数据的图形。