重复函数的大 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
时,它必须检查剩余的两个元素6
和7
。当它选择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++的主要内容,如果未能解决你的问题,请参考以下文章
从无符号字符到 std::string 的 C++ 转换 [重复]
从 C++ 连接 MySQL:错误 LNK2001:未解析的外部符号 [重复]