【发布时间】:2016-01-06 15:33:23
【问题描述】:
我想将(给定的)单组 D 的行和列(例如电子表格或数据库表)的数据转换为随机生成的一组 N 个片段,给定的数字 n 是
澄清一下:“n”是用户提供的一个非零整数,意思是“使用 D,至少还给我 n 个片段”。 “N”是返回的片段的实际数量。一种可接受的算法是产生至少 n 个片段的算法。对于两种可接受的算法 X 和 Y,如果在其他条件相同的情况下,X 产生的 N 比 Y 产生的 N 更接近 n,则 X 比 Y 更好。
此外,任何分片中任何一行中的数据也必须包含在 D 中的一行中。(每个分片还需要包含一个标识符列,例如行 ID 或其他具有唯一值的列,但这应该输出片段时添加是微不足道的)。因此,例如,如果 D 包含姓名和电话号码以及其他列,那么其中包含姓名和电话号码的任何片段都应该始终具有与该行名称相关联的正确电话号码。
一般来说,如果任何列存在于片段中的任何位置,则它必须存在于该片段的每一行(例如,如果第 1 行包含 A、B 和 C 列,则第 2 行必须包含这些相同的列),列也是如此(例如,如果 B 列包含第 4、5 和 6 行,则片段中的每个其他列也必须包含第 4、5 和 6 行)。
如果 N = 4,那么我想出的最简单的方法是:
- 对于每一行,掷一枚硬币。如果是正面,则分配给片段 1
- 对于每一行,掷一枚硬币。如果正面,则分配给片段 2
- 对于每一行,如果它没有分配给片段 1 或片段 2,则掷硬币,如果是正面,则分配给片段 1,否则分配给片段 2
- 对所有列重复上述 3 个步骤。现在我们有了片段 1 和 2,但它们不一定涵盖 D 中的所有数据。继续到 3 和 4。
- 对于每一行,掷一枚硬币。如果是正面,则分配给片段 3;否则,如果该行已分配给片段 2,但未分配给片段 1,则分配给片段 3。
- 对于每一列,掷一枚硬币。如果是正面,则分配给片段 3;否则,如果该列分配给片段 2 而不是片段 1,则分配给片段 3。
- 对于每一行,掷一枚硬币。如果是正面,则分配给片段 4;否则,如果该行已分配给片段 1,但未分配给片段 2,则分配给片段 4。
- 对于每一列,掷一枚硬币。如果是正面,则分配给片段 4;否则,如果此列分配给片段 1 而不是片段 2,则分配给片段 4
我相信这应该会产生 4 个可能看起来像这样的片段,假设行和列被重新排序为片段 1 的连续块,并且在不与之冲突的情况下尽可能与片段连续2(绿色是黄色+蓝色重叠的地方):
但是,这种方法似乎难以扩展到更高的 N 值。有没有更简单的方法可以将这种方法推广到任何 n 或 N 值?
【问题讨论】:
-
你说有N个片段,n一定是
-
n 只是一个大于零的整数,是算法的输入
-
它是什么意思?例如,为什么我不能简单地说“让 n = 42”?
-
意思是“我想把数据集 D 分成至少 n 个片段”。如果可以说“我想将数据集 D 分解成 完全 n 个片段”会更好
-
确实,n 和 N 的概念仍然不清楚。需要清楚地说明它们是什么,有什么区别,以及为什么需要两者。到目前为止,我知道 N 是一个输入,而 n 将是生成的片段的实际数量,以防算法无法达到 N 的计数,但后来你写到 n 是算法的输入......令人困惑。
标签: algorithm overlap rectangles random-sample