【问题标题】:Permutation on the large array (Javascript)大数组的排列(Javascript)
【发布时间】:2022-09-23 07:29:03
【问题描述】:

我有一个简单的置换函数。它适用于少于 5 个项目的数组。但是当我在数组中有 40 个项目时,我的网络崩溃了。我曾经尝试将那个大数组拆分成小的子数组,但它错过了很多情况。还有其他方法可以解决这个问题吗?

const permute = (items) => {
  const result = [];
  const dsf = (i, items) => {
    if (i === items.length) {
      result.push(items.slice())
      return;
    }

    for (let j = 0; j < items.length; j++) {
      [items[i], items[j]] = [items[j], items[i]];
      dsf(i + 1, items);
      [items[i], items[j]] = [items[j], items[i]];
    }
  }
  dsf(0, items);
  return result;
}
  • 首先搜索算法以查找数组的所有排列。这是starter。但一般来说,排列的数量由(amount of elements)! 描述。例如5! = 12040! = 8.1591528e+47。所以你看到它迅速升级不;想知道您的网络应用程序崩溃了。

标签: javascript performance recursion crash permute


【解决方案1】:

815,915,283,247,897,734,345,611,269,596,115,894,272,000,000,000

给定 N 个元素的排列数是 N!。因此,如果有 40 个元素,您将有 8.1591528e+47 个排列。这种量级的计算在几乎任何常规机器上都是完全不切实际的。

此外,您附加的代码无法正确计算排列,因为输出中有一些重复项。

这是计算排列的更好方法。

function permute(arr) {
   const res = [];
   if (arr.length === 0) return [];
   if (arr.length === 1) return [arr];
   for (let i = 0; i < arr.length; i++) {
      const cur = arr[i];
      const remaining = arr.slice(0, i).concat(arr.slice(i + 1));
      const permutations = permute(remaining);
      for (let j = 0; j < permutations.length; j++) {
         const permuted = [cur].concat(permutations[j]);
         res.push(permuted);
      }
   }
   return res;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2017-06-08
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多