C 4嵌套';对于';循环?

C 4嵌套';对于';循环?,c,algorithm,for-loop,time-complexity,nested-loops,C,Algorithm,For Loop,Time Complexity,Nested Loops,嵌套for循环的最差和最佳时间复杂度是什么 int compare(int n, int A[][]) { int i, j, k, m; for (i=1; i<=n; i++) { for (j=1; j<=n; j++) { for (k=1; k<=n; k++) { for (m=1; m<=n; m++) { if (A[i][j]

嵌套
for
循环的最差和最佳时间复杂度是什么

int compare(int n, int A[][]) {
    int i, j, k, m;
    for (i=1; i<=n; i++) {
        for (j=1; j<=n; j++) {
            for (k=1; k<=n; k++) {
                for (m=1; m<=n; m++) {
                    if (A[i][j] == A[k][m] && !(i==k && j==m))
                        return 1;
                }
            }
        }
    }
return 0;
}
int比较(int n,int A[]{
int i,j,k,m;

对于(i=1;i最佳情况时间复杂度是常数,
O(1)
。当网格
A
的第一个和第二个元素相等时,将出现最佳情况

    1 1 x x x
A = x x x x x
    x x x x x
    x x x x x
最坏情况的复杂性是
O(n^4)
。当网格
A
的所有元素都是唯一的时,最坏情况就会发生

    1  2  3  4
A = 5  6  7  8
    9  10 11 12
    13 14 15 16

最佳情况时间复杂度是常数,
O(1)
。当网格
A
的第一个和第二个元素相等时,将出现最佳情况

    1 1 x x x
A = x x x x x
    x x x x x
    x x x x x
最坏情况的复杂性是
O(n^4)
。当网格
A
的所有元素都是唯一的时,最坏情况就会发生

    1  2  3  4
A = 5  6  7  8
    9  10 11 12
    13 14 15 16
最佳情况:O(1),当A[1][1]=A[1][2]

最坏的情况是:O(n4),当没有重复的元素->时,您将为它的每个元素迭代整个数组

请注意,使用映射或集合(称为结构)可以更有效地实现它:

  • 迭代数组
  • 如果结构已经有[i][j],则返回1
  • 在结构中添加[i][j]
  • 数组迭代结束后返回0
这将给您一个O(n2 log n)或O(n2)的更坏情况,这取决于您使用的结构。最佳情况是:当a[1][1]=a[1][2]

最坏的情况是:O(n4),当没有重复的元素->时,您将为它的每个元素迭代整个数组

请注意,使用映射或集合(称为结构)可以更有效地实现它:

  • 迭代数组
  • 如果结构已经有[i][j],则返回1
  • 在结构中添加[i][j]
  • 数组迭代结束后返回0

这会给你一个更糟糕的O(n2 log n)或O(n2)的情况,这取决于你使用的结构。在C中,数组很少从
1
索引。通常从
0
索引数组,比如
for(i=0;i
你是说
!(i==k | j==m)
?如果(A[i][j]==A[k][m]&&i!=k&&j!=m),这比
更难理解
我的意思是
不是
对于
I==k
j==m
这两个条件都得到满足。旁白:在C中,数组很少从
1
索引。通常从
0
索引数组,例如
对于(I=0;I
你的意思是
!(I==k | j==m)
?如果(A[i][j]==A[k][m]&&i!=k&&j!=m),这比
更难理解
我的意思是
不是
对于
I==k
j==m
这两个条件都得到满足。谢谢@Kaidul这是我的想法,但我认为它是正确的。谢谢@Kaidul这是我的想法,但我认为它是正确的。谢谢@Srini和juvian你认为通过改变逻辑t不使用映射或集合可以提高效率?@RajatGupta不确定你的意思。使用映射或集合已经意味着改变我在循环方面的意思。但现在我明白了你的意思。:)在你和@Srini给出的解决方案中,最好的情况是,
I!=k
应该与
j!=m
一起得到满足。因此,a[1][1] =A[1][2]不正确。这有意义吗?还是我让它更混乱了?@RajatGupta!(I==k&&j==m)相当于(I!=k | j!=m)谢谢@Srini和juvian你认为通过改变逻辑而不是使用映射或集合可以提高效率吗?@RajatGupta不知道你的意思。使用映射或集合已经意味着改变逻辑,我是指循环。但现在我明白了你的意思。:)对于你和@Srini给出的最佳解决方案,
I!=k
shoul因此,A[1][1]=A[1][2]是不正确的。这有意义吗?还是我让它更混乱了?@RajatGupta!(I==k&&j==m)相当于(I!=k|j!=m)