Python 中函数的时间复杂度
Time complexity of a function in Python
我有 2 个函数执行相同的任务,即识别 2 个列表之间是否有任何共同元素。我想分析一下他们的时间复杂度。
我所知道的是:for 循环如果迭代 n 次则复杂度为 O(n)。但是,我对使用 'in' 运算符时的情况感到困惑。例如:如果元素在 mylist
请查看功能以更好地了解场景:
list1 = ['a','b','c','d','e']
list2 = ['m','n','o','d']
def func1(list1, list2):
for i in list1: # O(n), assuming number of items in list1 is n
if i in list2: # What will be the BigO of this statement??
return True
return False
z = func1(list1, list2)
print(z)
我还有一个函数func2,请帮忙确定一下它的BigO:
def func2(list1, list2):
dict = {}
for i in list1:
if i not in dict.keys():
dict[i] = True
for j in list2:
if j in dict.keys():
return True
return False
z = func2(list1, list2)
print(z)
func1和func2的时间复杂度是多少? 2个函数在性能上有什么区别吗?
关于 func1
:
- 在列表中搜索是关于元素数量的线性运算,
- 假设项目是随机排序的并且检查顺序也不相关,那么从统计上讲,您会在 n/2 步中遇到一个现有元素,当找不到时会遇到 n(这简化为 O(n))
if x in list_
是如上所述的线性搜索,因此 func1
的复杂度为 n^2。
关于func2
:
您可能要考虑使用集合而不是字典。检查元素是否存在的复杂度为 O(1)。这将提高 func1
的复杂性,并且您还可以使用 set(list)
创建列表而不是直接在 python 中迭代列表(这比直接从列表初始化集合慢- 但不影响 O 的复杂性,因为它只是速度较慢,但保持不变)。
我有 2 个函数执行相同的任务,即识别 2 个列表之间是否有任何共同元素。我想分析一下他们的时间复杂度。
我所知道的是:for 循环如果迭代 n 次则复杂度为 O(n)。但是,我对使用 'in' 运算符时的情况感到困惑。例如:如果元素在 mylist
请查看功能以更好地了解场景:
list1 = ['a','b','c','d','e']
list2 = ['m','n','o','d']
def func1(list1, list2):
for i in list1: # O(n), assuming number of items in list1 is n
if i in list2: # What will be the BigO of this statement??
return True
return False
z = func1(list1, list2)
print(z)
我还有一个函数func2,请帮忙确定一下它的BigO:
def func2(list1, list2):
dict = {}
for i in list1:
if i not in dict.keys():
dict[i] = True
for j in list2:
if j in dict.keys():
return True
return False
z = func2(list1, list2)
print(z)
func1和func2的时间复杂度是多少? 2个函数在性能上有什么区别吗?
关于 func1
:
- 在列表中搜索是关于元素数量的线性运算,
- 假设项目是随机排序的并且检查顺序也不相关,那么从统计上讲,您会在 n/2 步中遇到一个现有元素,当找不到时会遇到 n(这简化为 O(n))
if x in list_
是如上所述的线性搜索,因此 func1
的复杂度为 n^2。
关于func2
:
您可能要考虑使用集合而不是字典。检查元素是否存在的复杂度为 O(1)。这将提高 func1
的复杂性,并且您还可以使用 set(list)
创建列表而不是直接在 python 中迭代列表(这比直接从列表初始化集合慢- 但不影响 O 的复杂性,因为它只是速度较慢,但保持不变)。