您将获得一个n个整数的未排序数组,并且您希望查找数组中是否有任何重复项(即任何整数出现多次)。 描述一个算法(用两个嵌套循环实现)来做到这一点。
我坚持的问题是: 如何限制输入数据以实现更好的Big O复杂性?描述处理此有限数据的算法,以查找是否存在重复数据。什么是Big O复杂性?
非常感谢您的帮助。这与我的课程作业,作业或课程作业等无关。它来自上一年的试卷,我正在做一些自学,但似乎被困在这个问题上。我能提出的唯一可行解决方案是:
如果我们限制数据,并使用嵌套循环执行操作以查找是否存在重复项。复杂性为O(n)
,因为操作所需的时间与数据大小成正比。
如果我的回答没有意义,那么请忽略它,如果可以的话,请建议可能的解决方案/解决这个问题。
如果有人能帮助我解决这个问题,我会感激不尽,因为我尝试了无数可能的解决办法,所有这些似乎都不正确。
再次编辑部分..另一种可能的解决方案(如果有效!):
我们可以实现一个循环来对数组进行排序,以便对数组进行排序(从最小整数到最高整数),因此副本将紧挨着彼此,使它们更容易,更快速地被识别。
大O复杂度仍然是O(n ^ 2)
由于这是线性类型,它将简单地使用第一个循环并迭代n-1次,因为我们在数组中得到索引(在第一次迭代中它可能是,例如,1)并将其存储在变量名称& #39;电流&#39 ;.
循环将通过迭代每次更新当前变量+1,在该循环中,我们现在编写另一个循环以将当前数字与下一个数字进行比较,如果它等于下一个数字,我们可以使用printf语句进行打印否则我们回到外部循环以将当前变量更新+ 1(数组中的下一个值)并更新下一个变量以保持当前值之后的数字值。
答案 0 :(得分:3)
如果您使用哈希表(具有恒定的查找时间),您可以对任何输入进行线性(O(n)
)。
然而,这不是你被问到的。
通过限制数组中可能的值,您可以实现线性性能。
例如,如果整数的范围为1..L
,则可以分配一个长度为L
的位数组,将其初始化为0,并迭代输入数组,检查并翻转每个数组的相应位输入
答案 1 :(得分:1)
Bucket Sort的方差可以。这将为您提供O(n)
的复杂性,其中' n'是输入元素的数量。
但是一个限制 - 最大值。您应该知道整数数组可以采用的最大值。可以说它是m
。
这个想法是创建一个大小为m
的bool数组(全部初始化为false)。然后迭代你的数组。找到元素后,将bucket[m]
设置为true
。如果已经true
,则您遇到了重复。
一个java代码,
// alternatively, you can iterate over the array to find the maxVal which again is O(n).
public boolean findDup(int [] arr, int maxVal)
{
// java by default assigns false to all the values.
boolean bucket[] = new boolean[maxVal];
for (int elem : arr)
{
if (bucket[elem])
{
return true; // a duplicate found
}
bucket[elem] = true;
}
return false;
}
但这里的约束是空间。您需要O(maxVal)
空格。
答案 2 :(得分:0)
嵌套循环为O(N)提供O(N * M)或O(N * log(M))你不能使用嵌套循环!!!
我会用直方图来代替:
DWORD in[N]={ ... }; // input data ... values are from < 0 , M )
DWORD his[M]={ ... }; // histogram of in[]
int i,j;
// compute histogram O(N)
for (i=0;i<M;i++) his[i]=0; // this can be done also by memset ...
for (i=0;i<N;i++) his[in[i]]++; // if the range of values is not from 0 then shift it ...
// remove duplicates O(N)
for (i=0,j=0;i<N;i++)
{
his[in[i]]--; // count down duplicates
in[j]=in[i]; // copy item
if (his[in[i]]<=0) j++; // if not duplicate then do not delete it
}
// now j holds the new in[] array size
[注释]