出于我的问题的目的,我将包括一个示例问题。
假设我们需要迭代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更有意义,但这并不能使我的问题有效。
答案 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();
}
}
然后方法foo
在O(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)字符比较......