Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用N个元素枚举1d数组的所有k分区?_Java_C_Arrays_Algorithm_Data Partitioning - Fatal编程技术网

Java 用N个元素枚举1d数组的所有k分区?

Java 用N个元素枚举1d数组的所有k分区?,java,c,arrays,algorithm,data-partitioning,Java,C,Arrays,Algorithm,Data Partitioning,这似乎是一个简单的请求,但谷歌不是我的朋友,因为“分区”在数据库和文件系统空间中获得了大量成功 我需要将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

这似乎是一个简单的请求,但谷歌不是我的朋友,因为“分区”在数据库和文件系统空间中获得了大量成功

我需要将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执行此操作,以便重用先前的结果(对于较小的
k
),您可以执行递归

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

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

如果
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.
            }
    ...
    }
}
(i[0]=0;i[0]{ 对于(i[1]=i[0];i[1]i[10]推到分区列表上。 } ... } } 如果
k
是无界的,则可以递归执行

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

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

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

    • 对于该列表中的每个向量,将“EFP”预先挂起到该向量

    • 长度
      k
      的结果向量被添加到结果列表中


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

每个分区都可以用分隔部分的k-1索引来描述。由于顺序保持不变,这些索引必须是非递减的。也就是说,大小为k-1的子集与所搜索的分区之间存在直接对应关系

对于迭代大小为k-1的所有子集,您可以检查以下问题:

唯一的问题是,如果允许空零件,则多个切割点可以重合,但子集最多只能包含一次每个索引。您必须通过替换以下内容稍微调整算法:

        processLargerSubsets(set, subset, subsetSize + 1, j + 1);


当k=2时,它看起来很简单;你能用更高的k值(最好是更高的n值)来发布一个例子吗?这样问题就更清楚了?你的例子对(0,4)和(4,0)有相同的分区,也就是说,abcd是有意的吗?Andrew,分区是不同的。一个是| abcd,另一个是abcd |(空位在两端)。
        processLargerSubsets(set, subset, subsetSize + 1, j);