预处理静态数据结构的大O表示法

时间:2018-10-14 20:53:42

标签: algorithm data-structures big-o

据我了解,O(n)将随输入数据集的大小线性增长。

我感到困惑,因为我有一个查询结构,该结构将键映射到预处理值列表,该值在结构初始化后将永远不会改变。

如果我将n定义为输入,则为键数组。

def (arrOfKeys): 
    for key in arrOfKeys: # O(n) Iterating through the input.
        preprocessedList = getPreprocessedListDifferentForEachKey(key) # O(1) this list could have any number of elements.
        for anotherPreprocessedList in preprocessedList: # * <- O(n) or O(1)?
            for element in anotherPreprocessedList: # * <- O(n) or O(1)?
                ...
  • 我不确定此O(1)是经过预处理还是O(n),因为列表的大小取决于输入的内容是什么?

在最坏的情况下最终会变成O(n ^ 3)还是有可能争论O(n)?

1 个答案:

答案 0 :(得分:0)

这取决于如果preprocessedList(及其子数组)始终具有恒定的长度,则您的2个内部循环的时间复杂度为O(1)。但是,如果它们取决于输入参数arrOfKeys,则它们各自将为O(n),因此O(n)* O(n)= O(n ^ 2)。

结合第一个循环,然后将其乘以时间复杂度O(n)。

因此,如果内部循环中的每个循环都为O(n),则总计为O(n ^ 3)

如果preprocessedList的长度是可变的,但不取决于arrOfKeys的长度,则可以将其定义为m,并说它的时间复杂度为O(m)。然后您可以说时间复杂度为O(n * m ^ 2)。

通常可以引入另一个符号来描述时间复杂度,只要您解释它们是什么以及它们与数据之间的关系即可。