在2d数组中找到唯一的相邻索引

时间:2013-10-17 02:01:40

标签: arrays algorithm 2d

假设我有一个2d的对象数组,N×N。假设一对可以由每对相邻的对象组成,水平,垂直或对角。如何计算N的任何值唯一对的数量?

例如,对于N = 2

0 1
2 3

您可以获得01 02 03 21 23 31,请注意03与30

相同

是否有一个公式来确定给定N中有多少对,甚至更好的算法来生成这些?

语言并不重要,但我将使用c ++。

使用以下算法并消除重复索引,我得到以下计数。不确定公式是什么。

For size N=2
Unique pairs is =6
For size N=3
Unique pairs is =20
For size N=4
Unique pairs is =42
For size N=5
Unique pairs is =72
For size N=6
Unique pairs is =110
For size N=7
Unique pairs is =156
For size N=8
Unique pairs is =210
For size N=9
Unique pairs is =272

有趣的是,公式似乎是2 ^ 2 + 2,4 ^ 2 + 4,6 ^ 2 + 6,8 ^ 2 + 8 ...

3 个答案:

答案 0 :(得分:1)

我发现最容易选择每种类型对的代表性对象(换句话说,垂直对的顶部对象,水平对的最左边的对象,并选择对角线对)。这会产生n(n-1)个垂直对,n(n-1)个水平对和2(n-1)^2个对角线对(每个变量的等量)。总计2(n-1)(n+n-1)=2(n-1)(2n-1),与您的猜测一致。

答案 1 :(得分:1)

每行有n-1个行内对,有n行。

每列有n-1个列内对,有n列。

每对相邻的行具有2 *(n-1)个对角线对,并且存在(n-1)个相邻的行对。

将这些数字相乘并添加,您将得到解决方案。

答案 2 :(得分:0)

这是计算唯一对的固定公式。

(4 C 2)*(N-1)^2 - 2*(N-2)*(N-1)

基本上你只需在dasblinkenlight的答案中使用该方法并减去“重复”边缘。重复边缘将始终是象限之间的边缘。我已经为下面的重复计数添加了一个解释。


对于N>使用原始公式(4 C 2)*(N-1)** 2。 2,你会计算重复数。你想要做的是从计算中减去这些重复的边缘。

让我们来研究N>的最简单的情况。 2.假设N = 3。

0-1-2
|x*x|
3*4*5
|x*x|
6-7-8

查看我标有星号而不是边缘的地方?公式将对这些边缘计数两次。我们可以通过将它们分解为水平和垂直边缘来计算它们。两次计算的垂直边数将为(N-2)*(N-1)。 在N = 3的情况下,这将是1 * 2 = 2。两次计算的水平边数也将为(N-2)*(N-1)

因此,如果我们简单地将重复的垂直边数和重复的水平边加起来,我们得到

(N-2)*(N-1) + (N-2)*(N-1) = 2*(N-2)*(N-1)

我们可以简单地从总数中减去该数字,以获得正确的边数。

Python中的测试计数:

from math import factorial

def choose(n, k):
    return factorial(n)/(factorial(k) * factorial(n-k))


for N in range(2, 10):
    print choose(4, 2) * (N-1)**2 - 2 * (N-2) * (N-1)

程序打印:

6
20
42
72
110
156
210
272
相关问题