【发布时间】:2021-08-04 07:48:12
【问题描述】:
我正在自学数据结构,我正在尝试测量将 append 方法实现到数组数据结构的高效和低效方式之间的时间复杂度差异。也就是说,根据我在纸上所做的一些数学运算,低效的方式应该是 O(n) = n^2,而有效的方式应该是 O(n) = n。
问题是,当我运行模拟并在图表上绘制这两种情况时,低效的方式按预期执行,但有效的方式执行 O(n) = 1。我做错了什么吗?
import datetime
import time
import random
import matplotlib.pyplot as plt
import numpy as np
# Inefficient append
class PyListInef:
def __init__(self):
self.items = []
def append(self, item):
# Inefficient append -> appending n items to the list causes a O(n) = n^2, since for each i for i in 1, 2, 3...n
# we need i * k operations in order to append every element to the new list. Then, by weak induction we prove
# that the number of required operations is n(n+1)/2 which implies O(n) = n^2
self.items = self.items + [item]
# Using magic method for our PyList to be an iterable object.
def __iter__(self):
for c in self.items:
yield c
# Efficient append:
class PyList:
def __init__(self):
self.items = []
def append(self, item):
self.items.append(item)
def __iter__(self):
for c in self.items:
yield c
# The inefficient append running time
lst = PyListInef()
time_dict_inef = dict()
time_dict_ef = dict()
series = np.linspace(1, 301, 300)
time.sleep(2)
for i in range(300):
starttime = time.time()
for j in range(i):
lst.append(series[j])
elapsed_time = time.time() - starttime
time_dict_inef[i] = elapsed_time * 100000
# The efficient append running time
lst = PyList()
time.sleep(2)
for i in range(300):
starttime = time.time()
for j in range(i):
lst.append(series[j])
elapsed_time = time.time() - starttime
time_dict_ef[i] = elapsed_time * 100000
plt.figure(figsize = (14,7))
plt.plot(time_dict_inef.keys(), time_dict_inef.values())
plt.plot(time_dict_ef.keys(), time_dict_ef.values())
plt.xlabel('Number of elements to append')
plt.ylabel('Elapsed time (microseconds)')
plt.title('Comparison between efficient appending vs inefficient appending in a list data structure')
plt.show()
你能帮我指出我做错了什么吗?
【问题讨论】:
-
不要计时单次运行,而是尝试计时 100/1000 次运行?
-
使用更高的 n,例如 1,10,100,1000,10000,10000 由于系统开销、设置时间等原因,几微秒的计时大多是无用的......
-
我会努力做到的!!谢谢大家。
标签: python arrays algorithm data-structures big-o