获取所有可能的数字组合(最快的方法)

时间:2019-04-19 05:18:31

标签: javascript performance

我正在尝试将元素的每个单独组合放入一个数组中。现在,我可以使用下面的方法,并删除重复项,但是这种方式对于我来说慢得多

下面的代码将找到每个可能组合的2位数字下面。4.现在,在我实际上想要使用的代码中,最小的代码将是6个for循环(彼此之间)数量为18(请注意,这是最小值)。

下面的代码将执行amount^[amount of for loops]amount^2,在这种情况下为16。这意味着在我要使用的代码中,它执行了18^6次,或者 3400万次。这是最小值,它会提高很多

尝试运行我的代码(具有amount = 18的6个循环)后,它使我的浏览器崩溃了。我的问题是:是否有更快,更高效的方法(< strong>不优雅。我不在乎浏览器不会崩溃的优雅程度)。

注意:此问题不是重复问题。所有其他问题都只是要求一种方法来实现,但是我已经有了一种方法。我只是想使其更高效,更快,以便其实际正常工作。

let combinations = [];
let amount = 4;

for (let a = 0; a < amount; a++) {
  for (let b = 0; b < amount; b++) {
    combinations.push(`${a}${b}`);
  }
}

console.log(combinations);

下面是一个片段,提供了有关我的代码如何工作的可能示例。

let possibilities = [];
let amount = 6; //Amount is set by me, so don't worry about it being incorrect

for (let a = 0; a < amount; a++) {
  for (let b = 0; b < amount; b++) {
    possibilities.push(a + b);
  }
}

possibilities = [...new Set(possibilities)]; //Removes duplicates
possibilities.sort((a, b) => b - a); //Sorts in descending order
possibilities = possibilities.slice(0, 3); //Gets top 3 values
console.log(possibilities);

2 个答案:

答案 0 :(得分:2)

好,如评论中所述,如果您需要特定数量的前3个值,则可以执行以下简单操作:

<Chart
  chartType="ScatterChart"
  width="80%"
  height="400px"
  data={data}
  options={options}
  legendToggle
  chartEvents={[
    {
      eventName: "ready",
      callback: ({ chartWrapper, google }) => {
        const chart = chartWrapper.getChart();
        google.visualization.events.addListener(chart, "onmouseover", e => {
          const { row, column } = e;
          console.warn("MOUSE OVER ", { row, column });
        });
        google.visualization.events.addListener(chart, "onmouseout", e => {
          const { row, column } = e;
          console.warn("MOUSE OUT ", { row, column });
        });
      }
    }
  ]}
/>

答案 1 :(得分:1)

我不知道有什么更好的解决方案,但是是的,您需要先检查一些条件。

If(amount <= 0) return 'Invalid amount, Please enter a valid amount"

因此,如果有人输入负值或零值,则您的循环将进入无限循环,并使情况变得更糟。

if(amount === 1) return '1 possible combination'

由于小于1的数量仅是0,并且0的组合仅是1,因此您无需解析6位数字的整个循环或0的n位数字,因此它将获得1而不是N(n。数字)。

对于大于1的数量,您可以创建手动循环,例如此处您为2位数字创建了2个循环,为6位数字创建了6个循环,为此更好地创建了动态逻辑来自动创建循环数。

您还需要考虑11111112这种类型的组合,对吗? 或者,如果仅需要1234、2134、2314这种情况?可以以非常低的复杂度完成此操作。

对于复制,您可以将组合存储为键值对。然后Object.Keys将成为您的组合。