我正在对组合算法进行一些练习,并试图弄清楚如何解决以下问题:
给定一组 25 位,设置(选择)15(不可置换和顺序 NON 很重要):
n!/(k!(n-k)!) = 3.268.760
现在,对于这些可能性中的每一种,构建一个矩阵,在该矩阵中,我将每个唯一的 25 位成员与所有其他 25 位成员交叉,其中在它之间的关系中必须至少有 11 个公共设置位(只有一个,而不是零)。
让我尝试将其表示为二进制数据,因此第一个成员将是:
0000000000111111111111111 (10 zeros and 15 ones) or (15 bits set on 25 bits)
0000000001011111111111111 second member
0000000001101111111111111 third member
0000000001110111111111111 and so on....
...
1111111111111110000000000 up to here. The 3.268.760 member.
现在将这些值交叉在 1 x 1 的矩阵上,我必须有 15 位公共。由于结果 >= 11,因此它是一个“有用”的结果。
对于 1 x 2,我们有 14 位公共,因此也是一个有效的结果。
最后,为所有成员这样做,跨越 1 x 3.268.760 应该会导致 5 位通用,因此因为它 < 11 它不是“有用的”。
我需要的是(通过数学或算法)找出覆盖所有具有 11 位常见可能性的最小成员数。
换句话说,如果对所有其他成员进行测试,一组 N 个成员可能在整个 3.268.760 x 3.268.760 宇宙中至少有 11 个共同位。
使用蛮力算法,我发现使用 81 个 25 位成员可以实现这一点。但我猜这个数字应该更小(接近 12)。
我试图使用蛮力算法在 3.268.760 上对 12 个成员进行所有可能的变化,但可能性的数量是如此之大,以至于需要一百多年的时间来计算(3,156x10e69 组合)。
我已经用谷歌搜索过组合学,但有很多领域我不知道这些问题应该适合什么。
因此,非常感谢有关组合学领域的任何方向,或针对这些问题的任何算法。
PS:仅供参考。两个成员的“相似度”使用以下公式计算:
(Not(a xor b)) and a
之后,有一个小的递归循环来计算给定公共位数的位数。
编辑:正如所承诺的(@btilly)在下面的评论中,这里是关系的“分形”图像或图像链接
对于小于 10 位的值,色标范围从红色(15 位匹配)到绿色(11 位匹配)再到黑色。
此图像只是 4096 第一组的样本。