更好的Big O复杂度的算法

时间:2014-03-14 08:12:44

标签: performance algorithm data-structures big-o

有人可以帮我解决这个问题吗?: 如何限制输入数据以实现更好的Big O复杂性?描述处理此有限数据的算法,以查找是否存在重复数据。 Big O的复杂性是什么?

通过限制输入数据,我们指的是数组大小,例如: n = 100(数组包含100个整数)并且;默认情况下,数组未排序,但可以在算法中实现。

在大小为n的未排序数组的情况下,我得到的最坏情况复杂度是 O(N ^ 2)= N *((N + 1)/ 2)

我通过使用嵌套循环(用于n-1次迭代的外部循环 - 用于迭代数组中的每个值 - 和用于比较的内部循环来检查是否存在重复项)并重复该过程直到外循环终止。

2 个答案:

答案 0 :(得分:1)

你有解决方案就在你面前。如您所述,如果数组未排序,则查找重复项为O(N ^ 2)。但是如果对数组进行排序,则可以在O(N)中进行排序。所以首先对数组进行排序,这可以在O(N.Log(N))中完成。

首先排序然后找到重复项的算法因此可以在O(N.Log(N)+ N)中完成,即O(N.Log(N))。

更新:

正如Amir所指出的:你可以使用哈希表。由于在哈希表中插入和搜索是O(1),因此可以在单个循环中执行此操作,从而产生O(N)时间复杂度。

但是,您的问题是关于"有限的输入数据"。因此,如果将输入数据限制为已排序的数组,则可以将复杂度降低到O(N)。确切地说,如果您知道数组已排序(这是您的限制),那么将每个元素与其后继元素进行比较的单个循环将找到重复数据。

如果数组未排序,则需要在除最后一个元素之外的所有元素上进行外部循环,并在所有剩余元素上进行内部循环。如果数组已排序,则您不需要内循环,只需与下一个元素进行比较即可。这就是"减少"算法的结果,导致"减少" O(N ^ 2)与O(N)的关系。

答案 1 :(得分:0)

一种方法是排序然后删除重复项,但是你需要一个额外的内存

伪代码:

remDups(arr,arr2)

   Sort(arr); // O(nlogn)
   arr2[0] = arr[0];
   j=1;
   foreach(i+1 to arr.len : i++) //O(n)
   {
      if(arr[i-1] == arr[i]) continue;
      arr1[j++] = arr[i];
   }

O(nlogn)

您可以使用HashTable方法