繁体   English   中英

相互比较2D数组中的所有元素

[英]Compare all elements inside a 2D array with each other

我有一个完美的正方形64x64 2D整数数组,其值永远不会大于64。我想知道是否有一种非常快速的方法来比较所有元素并在一个元素中显示相同的元素。独特的方式。

目前我有这个

2D int array named array
loop from i = 0 to 64
    loop from j = 0 to 64
        loop from k = (j+1) to 64
            loop from z = 0 to 64
                if(array[i][j] == array[k][z])
                    print "element [i][j] is same as [k][z]

如您所见,有4个嵌套循环是我不愿使用的相当愚蠢的事情。 语言根本无关紧要,我只是好奇地想知道可以使用哪种很酷的解决方案。 由于任何整数内的值都不会大于64,所以我猜您只能使用6位并将数组转换为更奇特的值。 因此,这将需要较少的内存,并允许进行一些真正的按位运算。 las,我的知识不足,无法以这种格式思考,因此想看看你们能提出些什么。

预先感谢任何人提供真正独特的解决方案。

class temp {
    int i, j;
    int value;
}

然后将您的数组填充到类temp array [64] [64]中,然后按值对其进行排序(您可以在Java中通过实现一个可比较的接口来完成此操作)。 那么equal元素应该在彼此之后,并且您可以彼此提取i,j。

该解决方案将是最佳的,归类为big-O表示法的二次方方法。

无需通过O(m log m)算法对数组进行排序; 您可以使用O(m)桶排序。 (使m = n * n = 64 * 64)。

一种简单的使用列表的O(m)方法是建立一个由n + 1个整数组成的数组H,将其初始化为-1; 还分配一个数组L,每个数组m整数,用作列表元素。 对于第i个数组元素,其值为A [i],设置k = A [i]且L [i] = H [k]和H [k] = i。 完成此操作后,每个H [k]都是条目中具有相等值的列表的开头。 对于2D数组,将数组元素A [i,j]视为A [i + n *(j-1)]。

这是一个使用python列表的python示例,n = 7为便于查看结果:

import random
n = 7
m = n*n
a=[random.randint(1,n) for i in range(m)]
h=[[] for i in range(n+1)]
for i in range(m):
    k = a[i]
    h[k].append(i)
for i in range(1,n+1):
    print 'With value %2d:  %s' %(i, h[i])

其输出如下所示:

With value  1:  [1, 19, 24, 28, 44, 45]
With value  2:  [3, 6, 8, 16, 27, 29, 30, 34, 42]
With value  3:  [12, 17, 21, 23, 32, 41, 47]
With value  4:  [9, 15, 36]
With value  5:  [0, 4, 7, 10, 14, 18, 26, 33, 38]
With value  6:  [5, 11, 20, 22, 35, 37, 39, 43, 46, 48]
With value  7:  [2, 13, 25, 31, 40]

在数组上使用quicksort ,然后遍历数组,存储“ cursor”的临时值(您正在查看的当前值),并确定该临时值是否与下一个游标相同。

array[64][64];
quicksort(array);
temp = array[0][0];
for x in array[] {
    for y in array[][] {
        if(temp == array[x][y]) {
            print "duplicate found at x,y";
        }
        temp = array[x][y];
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM