大O表示法 - 包括数据结构成本?

时间:2018-03-23 15:49:05

标签: algorithm big-o

出于我的问题的目的,我将包括一个示例问题。

假设我们需要迭代N个元素的向量并删除重复项。那么,我们可能会使用一套权利? (让我们使用一个树的C ++集)

O(N)迭代遍历每个元素的成本 - 然后插入到设置数据结构中。

我的问题Has a log n cost with the Set structure,我们插入了N次,这个算法是O(N log N)还是简单的O(N)?我和一位教授正在讨论这个问题,我不确定。 Leetcode / SO /在线社区似乎忽略了数据结构成本,但从学术角度来看,N插入红/黑树,其中log N最坏情况 - 这是Log N,N次没有?

澄清 - 是的使用unordered_set更有意义,但这并不能使我的问题有效。

2 个答案:

答案 0 :(得分:1)

是的,它是O(n * log(n))。如果您有像

这样的方法
public void foo(int n) {
    for (int i = 0; i < n; i++) {
        // Call a method that is in O(log n)
        someLogNMethod();
    }
}

然后方法fooO(n * log n)时间内运行。

实施例

有许多非构造的例子。就像计算整数数组中的中位数 - 值一样。看一下这个问题的解决方案,首先通过排序来解决这个问题。排序位于Theta(n log n)(请参阅comparison based sorting)。

public int median(int[] values) {
    int[] sortedValues = sort(values);

    // Let's ignore special cases (even, empty, ...) for simplicity
    int indexOfMedian = values.length / 2;

    return sortedValues[indexOfMedian];
}

显然,您不会将此median方法称为Theta(1),但所有方法都会在常量时间(不包括sort方法)中运行。

但是,问题取决于sort方法。您无法解决在O(1)中找到常规数组的中位数的问题。您需要在分析中包含sort。因此,该方法实际上在Theta(n log n + 1)中运行,即Theta(n log n)

请注意,问题实际上可以在Theta(n)中解决(请参阅Find median of unsorted array in O(n) time)。

答案 1 :(得分:1)

复杂性表示一些参考操作的计数。

例如,您可以很好地计算某些黑盒结构中的插入并枚举O(N)插入。

但是,如果您专注于比较,并且您知道插入平均花费Log N比较,则比较总数为O(N Log N)。

现在,如果您要比较Log N字符的字符串,您将计算O(NLog²N)字符比较......