重复函数的大 0 符号,C++

Posted

技术标签:

【中文标题】重复函数的大 0 符号,C++【英文标题】:Big 0 notation for duplicate function, C++ 【发布时间】:2015-12-11 23:52:27 【问题描述】:

屏幕截图中函数描述的大 0 符号是什么。

遍历所有数字需要 O(n),但是一旦找到数字并删除它们,那会是什么?去掉的部分会是常数A吗?然后函数是否必须再次遍历数字?

这就是我对Big O的想法

T(n) = n + a + (n-a) 或者在找到第一个重复项后必须迭代 (n-a) 步的东西,那么大 O 会是 O(n) 吗?

【问题讨论】:

请将文本作为文本发布,而不是作为图像发布。 【参考方案1】:

大 O 表示法正在考虑最坏的情况。假设我们需要从数组A=[1..n] 中删除所有重复项。该算法将从第一个元素开始并检查每个剩余元素 - 其中有n-1。由于所有值恰好不同,因此不会从数组中删除任何值。

接下来,算法选择第二个元素并检查数组中剩余的n-2 元素。以此类推。

当算法到达最后一个元素时,它就完成了。比较的总数是(n-1) + (n-2) + ... + 2 + 1 + 0 的总和。通过数学的力量,这个和变成了(n-1)*n/2,主导项是n^2,所以算法是O(n^2)

【讨论】:

最后是“+2 +1 +0”是什么原因造成的? @user2076774 例如,假设数组是[1,2,3,4,5,6,7]。当算法选择5 时,它必须检查剩余的两个元素67。当它选择6 时,它必须检查单个剩余元素。最后,当它选择7 时,没有更多要检查的元素;因此最后 3 个元素为 2+1+0。【参考方案2】:

这个算法是O(n^2)。因为对于数组中的每个元素,您都在遍历数组并计算该元素的出现次数。

foreach item in array
    count = 0
    foreach other in array
         if item == other
             count += 1
    if count > 1
         remove item

如您所见,该算法中有两个嵌套循环,结果为O(n*n)。 删除的项目不会影响最坏的情况。考虑一个包含唯一元素的数组。此数组中没有元素被删除。

注意:此算法的幼稚实现可能会导致O(n^3) 复杂度。

【讨论】:

【参考方案3】:

您从第一个元素开始,您将遍历向量中的所有元素,即 n-1,您将这样做 n 次,最坏的情况是 (n * n-1)/2,最好的情况是 n 次(所有元素是 4)

【讨论】:

以上是关于重复函数的大 0 符号,C++的主要内容,如果未能解决你的问题,请参考以下文章

C#编组来自C++ DLL的无符号字符返回值[重复]

重复符号链接器错误(C++ 帮助)

从无符号字符到 std::string 的 C++ 转换 [重复]

从 C++ 连接 MySQL:错误 LNK2001:未解析的外部符号 [重复]

Matlab signrank 函数中的矛盾结果(Wilcoxon 符号秩检验)[重复]

C++重复调用一个函数系统挂起