具有更好Big O的更好的算法

时间:2014-03-15 02:07:11

标签: algorithm big-o

您将获得一个n个整数的未排序数组,并且您希望查找数组中是否有任何重复项(即任何整数出现多次)。
该算法基于大小为n的整数排序。使用嵌套循环来查找重复项,复杂性是; O(N ^ 2)

如果我们限制输入数据以实现某种最佳情况,那么如何限制输入数据以实现更好的Big O复杂度?描述处理此有限数据的算法,以查找是否存在重复数据。 Big O的复杂性是什么?

问题要求如下:

  1. 如何限制数据的一种方式。

  2. 这会如何改变您的算法以查找重复项,以及更好的Big O复杂性。

  3. 我想出的答案:

    如果我们将数据限制为,比方说,数组大小为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)更有效,因此它是一个可能的答案,因为它是问题所要求的。

1 个答案:

答案 0 :(得分:4)

如果将数组的大小限制为5(或1000,或任何其他常量),那么算法的复杂性将变为O(1),因此限制数组的大小是非起动机。

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

制作一组名为seen的布尔值。数组需要具有进入数据数组的最大值的大小。将seen数组的所有元素设置为false。现在浏览数组data,检查是否设置了相应值的布尔值,如果是,则声明重复。否则,将seen标志设置为true。在最坏的情况下,该算法的复杂度为O(N)

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

最后,您可以对数组进行排序,并在O(N*logN)中查找重复项。此算法的时间复杂度稍差,但其空间复杂度为O(1)(使用哈希集的算法的空间复杂度为O(N),这可能很重要。)