有人可以帮我解决这个问题吗?: 如何限制输入数据以实现更好的Big O复杂性?描述处理此有限数据的算法,以查找是否存在重复数据。 Big O的复杂性是什么?
通过限制输入数据,我们指的是数组大小,例如: n = 100(数组包含100个整数)并且;默认情况下,数组未排序,但可以在算法中实现。
在大小为n的未排序数组的情况下,我得到的最坏情况复杂度是 O(N ^ 2)= N *((N + 1)/ 2)。
我通过使用嵌套循环(用于n-1次迭代的外部循环 - 用于迭代数组中的每个值 - 和用于比较的内部循环来检查是否存在重复项)并重复该过程直到外循环终止。
答案 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
方法