java - 枚举具有 N 个元素的一维数组的所有 k 分区?

标签 java c arrays algorithm data-partitioning

这似乎是一个简单的请求,但 google 不是我的 friend ,因为“分区”在数据库和文件系统空间中得分很高。

我需要将 N 值数组(N 是常量)的所有分区枚举为 k 个子数组。子数组就是这样——一个起始索引和一个结束索引。原始数组的整体顺序将被保留。

例如,当 N=4 且 k=2 时:

[ | a b c d ] (0, 4)
[ a | b c d ] (1, 3)
[ a b | c d ] (2, 2)
[ a b c | d ] (3, 1)
[ a b c d | ] (4, 0)

当 k=3 时:

[ | | a b c d ] (0, 0, 4)
[ | a | b c d ] (0, 1, 3)
  :
[ a | b | c d ] (1, 1, 2)
[ a | b c | d ] (1, 2, 1)
  :
[ a b c d | | ] (4, 0, 0)

我很确定这不是一个原始问题(不,这不是家庭作业),但我想对每个 k <= N 都这样做,如果以后通过就太好了(随着 k 的增长)利用了早期的结果。

如果您有链接,请分享。

最佳答案

为了重新使用先前的结果(对于较小的 k 值),您可以进行递归。

将这种分区视为结束索引列表(任何分区的起始索引只是最后一个分区的结束索引或第一个分区的 0)。

因此,您的分区集只是一组 k 0 到 N 之间的非递减整数的所有数组。

如果 k 是有界的,你可以通过 k 嵌套循环来做到这一点

for (i[0]=0; i[0] < N; i[0]++) {
    for (i[1]=i[0]; i[1] < N; i[1]++) {
    ...
            for (i[10]=i[9]; i[10] < N; i[10]++) {
                push i[0]==>i[10] onto the list of partitionings.
            }
    ...
    }
}

如果 k 是无限的,你可以递归地做。

一组 k 索引 S 和 E 之间的分区是通过以下方式获得的:

  • 在 S 和 E 之间循环“第一个分区的结尾”EFP。对于每个值:

    • 递归地找到EFP和S之间的k-1分区列表

    • 对于该列表中的每个 vector ,在该 vector 前加上“EFP”。

    • 长度为 k 的结果 vector 被添加到结果列表中。

请注意,我的回答会生成每个切片的端点列表。如果您(如您的示例所示)想要每个切片的 LENGTHS 列表,则需要通过从当前切片末端减去最后一个切片末端来获得长度。

关于java - 枚举具有 N 个元素的一维数组的所有 k 分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4563523/

相关文章:

Java,当使用GridBagLayout布局面板时,向面板添加按钮会改变大小,如何防止这种情况?

c - system() 和 execve() 有什么区别

python - numpy/python 中的矢量替换

java - 确定fx :id of a pressed button

java - 如何在junit测试中通过服务方法模拟返回对象的字段?

c - C99 中的灵活数组

c - 在函数 C 中返回 "char *tab[]"

arrays - 无法为数组 Swift 随机选择一个元素

java - 单例中的 Spring Prototype 范围 bean

c - 常量字符串将存储在内存中的什么位置?