list的具体实现方法:见https://blog.csdn.net/lucky404/article/details/79596319 or 印象笔记 Python 列表源码解析
源码没看太懂,但是用实验的方式来看了一下list 中append, remove 和 set 中add 和 remove 的时间复杂度
import numpy as np
class TestTime:
@classmethod
def DuplicatesInSortedArray(cls, size = 1000):
arr = []
for i in range(size//2):
arr.append(i)
arr.append(i)
return arr
@classmethod
def notSortedArray(cls, low = 1, high = 1000, size = 1000):
return list(np.random.randint(low, high, size))
from TestTime import TestTime
from UsingArray.SortColors75 import Solution
import time
for i in range(15,25):
size = 2 ** i
nums = TestTime.notSortedArray(size=size)
ll = set(nums)
ll.add(1)
# start = time.time()
# nums.append(0) #O(1)的时间复杂度
# end = time.time()
# print('size=',size, ' list append time=',end - start)
# start = time.time()
# nums.remove(nums[0]) # O(n)的时间复杂度
# end = time.time()
# print('size=', size, ' list remove time=', end - start)
# start = time.time()
# re = 10 in nums #O(n)的时间复杂度,不太确定
# end = time.time()
# print('size=', size, ' list exits time=', end - start)
# start = time.time()
# ll.add(0) # O(1)的时间复杂度
# end = time.time()
# print('size=', size, ' set add time=', end - start)
start = time.time()
re = 1 in ll # O(1)的时间复杂度
end = time.time()
print('size=', size, ' set remove time=', end - start)
暂且认为:
list 中append的时间复杂度为O(1), insert 和remove的时间复杂度为O(n)(因为涉及到元素的移动)
但是不能从实验数据中确定 x在list
中(x in list) 的时间复杂度
set 中 add , remove ,x在set
中(x in set) 的时间复杂度的时间复杂度为O(1)
set 和 frozenset 的区别为一个可变,有add和remove方法,一个不可变,没有add 和remove方法。