Performance 提高大O复杂度的算法
有人能帮我回答这个问题吗?:Performance 提高大O复杂度的算法,performance,algorithm,data-structures,big-o,Performance,Algorithm,Data Structures,Big O,有人能帮我回答这个问题吗?: 如何限制输入数据以实现更好的大O复杂性?描述一种算法,用于处理这些有限的数据,以查找是否存在任何重复数据。什么是大O复杂性? 通过限制输入数据,我们指的是数组大小,例如n=100(数组包含100个整数)以及;默认情况下,数组未排序,但可以在算法中实现 对于大小为N的未排序数组,我得到的最坏情况复杂性是O(N^2)=N*((N+1)/2) 我通过使用嵌套循环(用于n-1次迭代的外循环-用于对数组中的每个值进行迭代-和用于比较以检查是否存在重复项的内循环)并重复该过程,
如何限制输入数据以实现更好的大O复杂性?描述一种算法,用于处理这些有限的数据,以查找是否存在任何重复数据。什么是大O复杂性? 通过限制输入数据,我们指的是数组大小,例如n=100(数组包含100个整数)以及;默认情况下,数组未排序,但可以在算法中实现 对于大小为N的未排序数组,我得到的最坏情况复杂性是O(N^2)=N*((N+1)/2)
我通过使用嵌套循环(用于n-1次迭代的外循环-用于对数组中的每个值进行迭代-和用于比较以检查是否存在重复项的内循环)并重复该过程,直到外循环终止 解决方案就在眼前。如您所述,如果数组未排序,则查找重复项是O(N^2)。但如果数组已排序,则可以在O(N)中进行排序。因此,首先对数组进行排序,这可以在O(N.Log(N))中完成 因此,可以在O(N.Log(N)+N中完成一个先排序然后查找重复项的算法,即O(N.Log(N)) 更新: 正如阿米尔所指出的:您可以使用哈希表。由于在哈希表中插入和搜索是O(1),所以可以在单个循环中执行此操作,从而产生O(N)时间复杂度 然而,您的问题是关于“有限的输入数据”。因此,如果将输入数据限制为排序数组,则可以将复杂性降低到O(N)。确切地说,如果您知道数组已排序(这是您的限制),那么将每个元素与其后续元素进行比较的单个循环将找到重复的元素
如果数组未排序,则除最后一个元素外,所有元素都需要一个外循环,其余所有元素都需要一个内循环。如果数组已排序,则不需要内部循环,只需与下一个元素进行比较即可。这就是算法的“减少”,导致O(N^2)减少为O(N) 一种方法是排序然后删除重复项,但您需要额外的内存 伪代码:
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(非登录)
您可以使用,
HashTable
method数组没有大O复杂性,算法有。你暗示了这一点,但不要提及你的算法应该解决的实际问题。谢谢你的帮助。我终于找到了一个解决方案,可以得到比O(N^2)更好的大O复杂度。我将实现O(n.log(n))算法,因为它看起来不太麻烦,而我甚至不知道哈希算法是如何开始的。。。很抱歉,但是你能扩展一下我如何将复杂性降低到O(N)。。。一旦数组被排序,我将使用一个循环来比较整数,以检查是否有重复项,这将是O(n),但我如何对数组进行排序,使其不影响大O的复杂性?我不知道我写的东西是否有意义,但你能否扩展/详细说明,如果我有一个数组(例如100个整数),我如何将复杂性降低到O(n)。thanks@user3418449请参阅我的最新答案。我不会给你实际的代码,必须有一些练习留给你;-)克里斯·范德莫顿。。。一切都很好。我只是需要那个,我可以自己实现的代码。我对算法很迷茫,但既然你帮了我,我会自己完成代码的。谢谢你的帮助。