algorithm - 更好的算法和更好的 Big O

标签 algorithm big-o

<分区>

给你一个未排序的 n 个整数数组,你想找出数组中是否有任何重复项(即任何出现多次的整数)。
该算法基于大小为 n 的整数的未排序数组。使用嵌套循环来查找重复项,复杂度为; O(N^2)

如果我们限制输入数据以实现某些最佳情况,您如何限制输入数据以实现更好的 Big O 复杂性?描述一种算法来处理这些有限的数据以查找是否有任何重复项。什么是大 O 复杂度?

问题要求如下:

  1. 限制数据的一种方法。

  2. 这如何改变您查找重复项的算法,什么是更好的 Big O 复杂度。

我想出的答案:

如果我们将数据限制为,比方说,数组大小为 5 (n = 5),我们可以将复杂度降低到 O(N)。
如果数组已排序,那么我们只需要一个循环来比较数组中的每个元素和下一个元素,这将查找是否存在重复项。
这只是意味着,如果给我们的数组默认(或幸运地)已经排序(从最低值到最高值),在这种情况下,减少将从 O(N^2) 到 O(N),因为我们不会需要内部循环来比较整数进行排序,因为它已经排序,因此我们可以实现一个循环来比较整数与其后继者,如果遇到重复,那么我们可以,例如,使用 printf 语句打印重复并继续迭代循环 n-1 次(这将是 4 次)- 一旦完成就结束程序。

此算法的最佳情况是 O(N),因为性能线性增长并与输入/数据的大小成正比,因此如果我们有一个大小为 50 的排序数组(数组中有 50 个整数)那么迭代将是 n-1(循环将迭代 50 – 1 次),其中 n 是数组的长度,即 50。
该算法的运行时间与输入大小成正比。这只是意味着在排序数组中,执行操作所花费的时间完全取决于数组的输入大小。

您的确认(关于这是否正确)将不胜感激。我知道还有其他算法具有更好的复杂度等级,但由于这比 O(N^2) 更有效,这将是一个可能的答案,因为这是问题所要求的。

最佳答案

如果将数组的大小限制为 5(或 1000,或与此相关的任何其他常量),则算法的复杂度变为 O(1),因此限制了该阵列无法启动。

但是,您可以做的是限制进入数组的。如果您将它们限制为 10000 或其他类似的小数字,您可以制作一个 O(N) 算法,如下所示:

创建一个名为seen 的 bool 数组。该数组需要具有进入数据数组的最大值的大小。将 seen 数组的所有元素设置为 false。现在遍历数组 data,检查是否设置了相应值的 bool 值,如果是,则声明一个副本。否则,将 seen 标志设置为 true。该算法在最坏情况下的复杂度为O(N)

您可以扩展此算法以允许任何范围的值,只要该值具有良好的哈希函数即可。将数组 seen 替换为哈希集,并使用相同的算法。由于在哈希集中添加和检索数据的时间复杂度是恒定的,因此算法的渐近复杂度不会改变。

最后,您可以对数组进行排序,并在 O(N*logN) 中查找重复项。该算法时间复杂度稍差,但空间复杂度为O(1)(使用hash set的算法空间复杂度为O(N),可能是显着)。

关于algorithm - 更好的算法和更好的 Big O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22418681/

相关文章:

big-o - 大 O 理论 - 三重嵌套循环

java - AHP 算法仅适用于 3 个标准

algorithm - GUID 是如何生成的并且始终是唯一的?

c++ - 队列反转的渐近分析

big-o - O(n Log n) 是多项式时间吗?

python - O(log n) 的时间复杂度嵌套在另一个 O(log n) 循环中

java - AVL 树给我 O(c^n) 而不是 O(log n)

algorithm - 混合左加乘法器,用于有符号乘法的教科书算法

r - 二维背包或方形包装的变体

algorithm - 逆序数组上的插入排序算法花费 0.00000 秒?