我有一个完全正方形的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位并将数组转换成更高级的东西。因此,这将需要更少的内存,并允许一些真正花哨的按位操作。唉,我不太了解这种格式,因此想看看你们能想出什么。
感谢任何人提前寻找真正独特的解决方案。
答案 0 :(得分:2)
class temp {
int i, j;
int value;
}
然后在类temp数组[64] [64]中填充数组,然后按值排序(您可以通过实现类似的接口在Java中执行此操作)。那么相等的元素应该在彼此之后,你可以互相提取i,j。
此解决方案将是最佳的,将其归类为big-O notation的二次方法。
答案 1 :(得分:2)
无需通过O(m log m)算法对数组进行排序;你可以使用O(m)桶排序。 (设m = n * n = 64 * 64)。
使用列表的简单O(m)方法是建立一个n + 1个整数的数组H,初始化为-1;还分配一个m
整数的数组L,用作列表元素。对于具有值A [i]的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]
答案 2 :(得分:1)
在数组上使用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];
}
}