限制输入数据以实现更好的Big O复杂性

时间:2014-03-13 20:24:29

标签: arrays algorithm big-o nested-loops

您将获得一个n个整数的未排序数组,并且您希望查找数组中是否有任何重复项(即任何整数出现多次)。 描述一个算法(用两个嵌套循环实现)来做到这一点。

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

非常感谢您的帮助。这与我的课程作业,作业或课程作业等无关。它来自上一年的试卷,我正在做一些自学,但似乎被困在这个问题上。我能提出的唯一可行解决方案是:

如果我们限制数据,并使用嵌套循环执行操作以查找是否存在重复项。复杂性为O(n),因为操作所需的时间与数据大小成正比。

如果我的回答没有意义,那么请忽略它,如果可以的话,请建议可能的解决方案/解决这个问题。

如果有人能帮助我解决这个问题,我会感激不尽,因为我尝试了无数可能的解决办法,所有这些似乎都不正确。

再次编辑部分..另一种可能的解决方案(如果有效!):
 我们可以实现一个循环来对数组进行排序,以便对数组进行排序(从最小整数到最高整数),因此副本将紧挨着彼此,使它们更容易,更快速地被识别。
大O复杂度仍然是O(n ^ 2) 由于这是线性类型,它将简单地使用第一个循环并迭代n-1次,因为我们在数组中得到索引(在第一次迭代中它可能是,例如,1)并将其存储在变量名称& #39;电流&#39 ;.
 循环将通过迭代每次更新当前变量+1,在该循环中,我们现在编写另一个循环以将当前数字与下一个数字进行比较,如果它等于下一个数字,我们可以使用printf语句进行打印否则我们回到外部循环以将当前变量更新+ 1(数组中的下一个值)并更新下一个变量以保持当前值之后的数字值。

3 个答案:

答案 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

[注释]

  • 如果稀疏区域的值范围太大,则需要转换他的[]
  • 到动态列表,每个项目有两个值
  • 一个是[]中的值,第二个是它的出现次数
  • 但是你需要嵌套循环 - &gt; O(N * M)
  • 或二进制搜索 - &gt; O(N *日志(M))