Tôi biết bài đăng này cũ, nhưng gần đây tôi đã tự làm một bài kiểm tra nhỏ. Sự phức tạp của list.insert() dường như là O (n)
Code:
'''
Independent Study, Timing insertion list method in python
'''
import time
def make_list_of_size(n):
ret_list = []
for i in range(n):
ret_list.append(n)
return ret_list
#Estimate overhead of timing loop
def get_overhead(niters):
'''
Returns the time it takes to iterate a for loop niter times
'''
tic = time.time()
for i in range(niters):
pass #Just blindly iterate, niter times
toc = time.time()
overhead = toc-tic
return overhead
def tictoc_midpoint_insertion(list_size_initial, list_size_final, niters,file):
overhead = get_overhead(niters)
list_size = list_size_initial
#insertion_pt = list_size//2 #<------- INSERTION POINT ASSIGMNET LOCATION 1
#insertion_pt = 0 #<--------------- INSERTION POINT ASSIGNMENT LOCATION 4 (insert at beginning)
delta = 100
while list_size <= list_size_final:
#insertion_pt = list_size//2 #<----------- INSERTION POINT ASSIGNMENT LOCATION 2
x = make_list_of_size(list_size)
tic = time.time()
for i in range(niters):
insertion_pt = len(x)//2 #<------------- INSERTION POINT ASSIGNMENT LOCATION 3
#insertion_pt = len(x) #<------------- INSERTION POINT ASSIGN LOC 5 insert at true end
x.insert(insertion_pt,0)
toc = time.time()
cost_per_iter = (toc-tic)/niters #overall time cost per iteration
cost_per_iter_no_overhead = (toc - tic - overhead)/niters #the fraction of time/iteration, #without overhead cost of pure iteration
print("list size = {:d}, cost without overhead = {:f} sec/iter".format(list_size,cost_per_iter_no_overhead))
file.write(str(list_size)+','+str(cost_per_iter_no_overhead)+'\n')
if list_size >= 10*delta:
delta *= 10
list_size += delta
def main():
fname = input()
file = open(fname,'w')
niters = 10000
tictoc_midpoint_insertion(100,10000000,niters,file)
file.close()
main()
Xem 5 vị trí nơi chèn có thể được thực hiện. Chi phí là tất nhiên một chức năng như thế nào lớn danh sách là, và khoảng cách giữa bạn với đầu danh sách (tức là có bao nhiêu vị trí bộ nhớ phải được tái tổ chức)
Bỏ qua hình ảnh bên trái của âm mưu
Nguồn
2017-03-23 04:57:16
Cảm ơn Ryeguy — đánh giá cao điều đó. Cũng từ tài liệu TimeComplexity được tham chiếu bởi kaizer.se: x in s ........... O (n) phút, tối đa (x) ... O (n) – Dan
@ ryeguy: Ngạc nhiên khi thấy rằng chèn và xóa là các hoạt động O (n). Không phải là toàn bộ điểm của cấu trúc dữ liệu danh sách để giảm độ phức tạp của thời gian chèn và xóa thành O (1)? Từ trên, có vẻ như cấu trúc dữ liệu cơ bản là một mảng. Tui bỏ lỡ điều gì vậy? –
@AKE xem [danh sách mảng] (http://en.wikipedia.org/wiki/Array_list). Có sự cân bằng trong việc triển khai các cấu trúc dữ liệu khác nhau. Trong điển hình của bạn O (1) chèn/xóa danh sách bạn thường có Get Item là O (n). –