n 维组合 - 如何确定点是否相互看到(如果它们在同一轴上)
Combinations in n-dimensions - How determine if Points see each other (If they are on same axis)
n维网格(最大10^7维)是两个点。他们在每个轴上都有假想的传感器。
我需要算法来计算当这两点可以发现自己时所有可能的选项。
正式写自我的任务文档(翻译成英文):
让 A 与坐标 (a1, a2, ..., an) 和 B 与坐标 (b1, b2, ..., bn)
是 n 维 space 中的两个点并且存在 i ∈ 1, 2, ..., n 使得 ai = bi然后A和B见面
示例:
在一维space中,长度为10一共45个组合怎么放2分 when they see each other(他们每次都看到对方)。
很容易组合 10C2 (10 of 2) = 45
如何通过程序计算2,3,4,...,10^7维(我更喜欢C#)?
正确的测试数据我有:
输入:
1
10
输出:45
输入:
2
5 8
输出:220
输入:
3
8 12 11
输出:14784
更多解释:
当 space 中的两个点相互看到(在同一轴上)时,输出是组合数。在 1 维中 space 只有一个轴,所以他们总是看到对方。在 2 维 space 是 2 轴,所以他们只能在某些情况下看到对方
This image example explaining more than text i think
我已经创建了示例代码,您可以尝试一下。我检查过它工作正常。
等式是:C(n,r)=n!/(r!(n−r)!)
示例:
1.10C2=45
2.10C3=120
public void Calc()
{
int result= nCr(10, 3);
}
public int nCr(int n,int r )
{
int nValue=1;
int rValue = 1;
for (int i = n-r+1; i <= n; i++)
{
nValue = nValue*i;
}
for (int i = 1; i <= r; i++)
{
rValue = rValue*i;
}
return nValue/rValue;
}
我确定是正确的。
C(x,y) 是 y 的组合 x。
假设我们有一个维度,我们称之为长度为 8 的 X。有 C(8,2) = 8*7/2 = 28 种可能性可以看到彼此。
当我们添加长度为 12 的名为 Y 的第二个维度时,现在我们有 12 条平行于 X 的直线。因此我们有 12*28=336 种可能性可以在所有平行于 X 的直线上找到。现在,在 Y 维度上我们有 C( 12,2) = 66 种可能性。有 8 行这样的行,所以 66*8=528.
总共:336+528=846种可能
现在让我们添加另一个维度,标记为 Z,长度为 11。一行中有 C(1,2) = 11*10/2 = 55,并且(注意)我们有 8*12 行。那么是不是55*8*12 = 5280种可能!
现在我们总共有:
与 X 轴平行:C(8,2)*11*12 = 3696
平行于Y轴 C(12,2)*8*11 = 5808
平行于Z轴 C(11,2)*8*12 = 5280
总计 = 14784
一般来说,具有 n1,n2...nk 长度的 n 维的公式是:
C(ni,2) * (n1*n2...*nk)/ni
之和
或者更短:
(n1*n2*n3...nk)/2 * (ni-1)
的总和
示例:
尺寸为 3,8,9,11:
(3*8*9*11)/2*(3-1) = 2376
(3*8*9*11)/2*(8-1) = 8316
(3*8*9*11)/2*(9-1) = 9504
(3*8*9*11)/2*(11-1) = 11880
总计 = 32076
最简单的方程式:
(n1*n2*n3...ni)(n1+n2+...ni - k)/2,其中ni是长度,k是维数
n维网格(最大10^7维)是两个点。他们在每个轴上都有假想的传感器。 我需要算法来计算当这两点可以发现自己时所有可能的选项。
正式写自我的任务文档(翻译成英文):
让 A 与坐标 (a1, a2, ..., an) 和 B 与坐标 (b1, b2, ..., bn)
是 n 维 space 中的两个点并且存在 i ∈ 1, 2, ..., n 使得 ai = bi然后A和B见面
示例:
在一维space中,长度为10一共45个组合怎么放2分 when they see each other(他们每次都看到对方)。
很容易组合 10C2 (10 of 2) = 45
如何通过程序计算2,3,4,...,10^7维(我更喜欢C#)?
正确的测试数据我有:
输入:
1
10
输出:45
输入:
2
5 8
输出:220
输入:
3
8 12 11
输出:14784
更多解释:
当 space 中的两个点相互看到(在同一轴上)时,输出是组合数。在 1 维中 space 只有一个轴,所以他们总是看到对方。在 2 维 space 是 2 轴,所以他们只能在某些情况下看到对方
This image example explaining more than text i think
我已经创建了示例代码,您可以尝试一下。我检查过它工作正常。
等式是:C(n,r)=n!/(r!(n−r)!)
示例: 1.10C2=45 2.10C3=120
public void Calc()
{
int result= nCr(10, 3);
}
public int nCr(int n,int r )
{
int nValue=1;
int rValue = 1;
for (int i = n-r+1; i <= n; i++)
{
nValue = nValue*i;
}
for (int i = 1; i <= r; i++)
{
rValue = rValue*i;
}
return nValue/rValue;
}
我确定是正确的。
C(x,y) 是 y 的组合 x。
假设我们有一个维度,我们称之为长度为 8 的 X。有 C(8,2) = 8*7/2 = 28 种可能性可以看到彼此。
当我们添加长度为 12 的名为 Y 的第二个维度时,现在我们有 12 条平行于 X 的直线。因此我们有 12*28=336 种可能性可以在所有平行于 X 的直线上找到。现在,在 Y 维度上我们有 C( 12,2) = 66 种可能性。有 8 行这样的行,所以 66*8=528.
总共:336+528=846种可能
现在让我们添加另一个维度,标记为 Z,长度为 11。一行中有 C(1,2) = 11*10/2 = 55,并且(注意)我们有 8*12 行。那么是不是55*8*12 = 5280种可能!
现在我们总共有:
与 X 轴平行:C(8,2)*11*12 = 3696
平行于Y轴 C(12,2)*8*11 = 5808
平行于Z轴 C(11,2)*8*12 = 5280
总计 = 14784
一般来说,具有 n1,n2...nk 长度的 n 维的公式是:
C(ni,2) * (n1*n2...*nk)/ni
之和
或者更短:
(n1*n2*n3...nk)/2 * (ni-1)
示例:
尺寸为 3,8,9,11:
(3*8*9*11)/2*(3-1) = 2376
(3*8*9*11)/2*(8-1) = 8316
(3*8*9*11)/2*(9-1) = 9504
(3*8*9*11)/2*(11-1) = 11880
总计 = 32076
最简单的方程式:
(n1*n2*n3...ni)(n1+n2+...ni - k)/2,其中ni是长度,k是维数