采用以下python程序,从banned_fruit
中“过滤”出fruits
:
banned_fruit = {"apple", "orange", "grape"} # always size = 3
fruits = ["banana", "apple", "blueberry", "kiwi", "orange"] # size = N
good_fruit = []
for fruit in fruits: # O(N)
if fruit not in banned_fruit: # O(1) average case, worst case O(3) = O(1) ?
good_fruit.append(fruit)
print(good_fruit) # Output: ['banana', 'blueberry', 'kiwi']
我的问题是上述程序在最坏情况下的时间复杂度是多少?令我困惑的是那行:
if fruit not in banned_fruit:
如果banned_fruit
是python集,那么据我所知,它可能具有最糟糕的时间复杂度O(K)
,其中K
是banned_fruit
集的长度。但是,如果banned_fruit
集的长度始终恒定(即:3),这意味着最坏的情况是O(1)
,从而使我的整个程序的时间复杂度为{{1 }},还是我需要考虑集合的搜索时间,使时间变得O(N)
复杂?
答案 0 :(得分:2)
复杂性理论是关于程序的时间或空间如何根据可变大小的输入而变化。
如果算法的一部分使用固定大小的对象,则在确定复杂度时,这不是您考虑的变量。如果设置的大小是预定义的,而不是可以更改的大小,则不会影响算法的复杂性。
答案 1 :(得分:1)
时间复杂度为O(N)。如果存在太多的哈希冲突(如果集合哈希中的许多项达到相同值),则哈希查询最复杂的情况就是O(集合的长度)。因此,在您的情况下,实际上是O(N)[循环的复杂度] [您的设置大小是恒定的],您不需要将其称为O(NK)。