递归列表拆分(javascript)

时间:2015-05-13 21:56:28

标签: javascript algorithm tree

所以说我有一个数组l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]

包含一些值,在本例中为整数。我有另一个数组m

[2, 3, 2]

持有除数(我将在后面解释除数的意思)。我想要做的是根据l中的当前值将m连续划分为切片。因此,在此示例中,我首先将其划分为2个相同大小的列表(m[0]为2):

[[1,2,3,4,5,6,7,8,9,10,11,12], [13,14,15,16,17,18,19,20,21,22,23,24]]

然后将这些列表分成3个(m[1]是3个)列表,产生:

[[[1,2,3,4],[5,6,7,8],[9,10,11,12]], [[13,14,15,16],[17,18,19,20],[21,22,23,24]]]

然后最后将每个列表分成2个列表(m[2]为2):

[[[[1,2],[3,4]],[[5,6],[7,8]],[[9,10],[11,12]]],[[[13,14],[15,16]],[[17,18],[19,20]],[[21,22],[23,24]]]]

在实际执行中,m将具有任意长度并具有任意值。

是否有现成的算法可以实现这一目标?这基本上是一个树结构,因为每个分区产生的列表都会收到一个标签,但是我不知道如何实现一个能够返回我需要的列表的函数。我在Javascript中实现,但算法在这里非常重要。

2 个答案:

答案 0 :(得分:3)

试试这段代码。它以递归方式分割数组。

function split(arr, n) {
  if(n <= 1) return [arr];
  var partLength = Math.ceil(arr.length/n),
      part1 = arr.slice(0, partLength),
      result = split(arr.slice(partLength), n - 1);
  result.unshift(part1);
  return result;
}

function splitTree(arr, m) {
  if(m.length < 1) return arr;
  var result = split(arr, m[0]);
  return result.map(function(sublist) {
    return splitTree(sublist, m.slice(1));
  });
}

var l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24];

console.log(splitTree(l, [2,3,2]));

答案 1 :(得分:0)

请看,

https://stackoverflow.com/a/10456644/1875956

这可以是您发出的第一步。接下来将是递归拆分每个数组