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

Arrays 限制输入数据以实现更好的大O复杂性,arrays,algorithm,big-o,nested-loops,Arrays,Algorithm,Big O,Nested Loops,您将获得一个由n个整数组成的未排序数组,您希望查找数组中是否有重复项(即任何整数出现多次)。 描述一种算法(用两个嵌套循环实现)。 我遇到的问题是: 如何限制输入数据以实现更好的大O复杂性?描述一种算法,用于处理这些有限的数据,以查找是否存在任何重复数据。什么是大O复杂性? 非常感谢你的帮助。这与我的课程、作业或课程等无关。这是上一年的试卷,我正在自学,但似乎被困在这个问题上。我能想到的唯一可能的解决方案是: 如果我们限制数据,并使用嵌套循环执行操作以查找是否存在重复项。复杂性将是O(n),这仅

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

我遇到的问题是: 如何限制输入数据以实现更好的大O复杂性?描述一种算法,用于处理这些有限的数据,以查找是否存在任何重复数据。什么是大O复杂性?

非常感谢你的帮助。这与我的课程、作业或课程等无关。这是上一年的试卷,我正在自学,但似乎被困在这个问题上。我能想到的唯一可能的解决方案是:

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

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

如果有人能帮我解决这个问题,我将不胜感激,因为我已经尝试了无数种可能的解决方案,而所有这些似乎都不是正确的

再次编辑部分。。另一种可能的解决方案(如果有效!):
我们可以实现一个循环来对数组进行排序,以便它对数组进行排序(从最低整数到最高整数),因此重复项将紧靠在一起,从而使它们更易于识别。
最大的O复杂性仍然是O(n^2)。
由于这是线性类型,它只需使用第一个循环,并在获取数组中的索引时迭代n-1次(例如,在第一次迭代中,它可以是1),然后将其存储在变量名“current”中。
循环将在每次迭代中更新当前变量+1,在该循环中,我们现在编写另一个循环,将当前数字与下一个数字进行比较,如果它等于下一个数字,我们可以使用printf语句打印,否则我们将移回外循环,将当前变量更新+1(数组中的下一个值)并更新下一个变量,以保存当前值之后的数字值

如果使用哈希表(具有恒定的查找时间),则可以对任何输入执行线性(
O(n)

然而,这不是你被问到的问题

通过限制数组中可能的值,可以实现线性性能

例如,如果整数的范围为
1..L
,则可以分配一个长度为
L
的位数组,将其初始化为0,然后在输入数组上迭代,检查并翻转每个输入的相应位。

。这将为您提供
O(n)
的复杂性,其中'n'是输入元素的数量

但有一个限制-最大值。您应该知道整数数组可以接受的最大值。让我们把它说成
m

其思想是创建一个大小为
m
(全部初始化为false)的bool数组。然后在数组上迭代。找到元素时,将
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)
space。

嵌套循环为O(N*M)或O(N*log(M))获取O(N)您不能使用嵌套循环

我会用直方图来代替:

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
[N]={…}中的DWORD;//输入数据。。。数值从<0,M) DWORD his[M]={…};//在[]中的直方图 int i,j; //计算直方图O(N)
对于(i=0;数据的唯一性不会改变算法的大O复杂性。您需要不同的算法。您从未在第一次匹配时将bucket[elem]设置为true。很抱歉,java中布尔值的默认值为false。编辑