Получить любую возможную комбинацию чисел (самый быстрый способ) - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь получить каждую комбинацию элементов в массив. Теперь я могу использовать метод, описанный ниже, и удалить дубликаты, но этот путь - слишком медленный для моего использования.

Код ниже найдет каждую возможную комбинацию для 2 цифр ниже 4. Теперь в коде, для которого я действительно хочу использовать это, наименьший возможный код будет 6 для циклов (внутри друг друга) с сумма 18 (помните, это минимум).

Приведенный ниже код будет выполнять amount^[amount of for loops] или amount^2, что в данном случае равно 16. Это означает, что в коде, для которого я хочу использовать это, он выполняется 18^6 раз или 34 миллиона раз . И это минимум, который мог бы получить намного выше.

После попытки запустить мой код (с 6 циклами foor, в которых amount = 18) он сломал мой браузер ... Мой вопрос: Есть ли что-то быстрее и эффективнее ( нет элегантно. Мне все равно, насколько элегантно это ), в котором мой браузер не падает,

Примечание: Этот вопрос не является дублирующим вопросом. Все остальные вопросы просто спрашивают, как это сделать, однако у меня уже есть способ. Я просто пытаюсь сделать его более эффективным и быстрым, чтобы он действительно работал правильно.

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 ]

2 голосов
/ 19 апреля 2019

Хорошо, как обсуждалось в комментариях, если вам нужны топ-3 значения для определенной суммы, вы можете просто сделать что-то простое, как показано ниже:

let amount = 6;
let highest = amount - 1,second_highest = amount - 2,third_highest = amount - 3;
let possibilities = [
    highest + highest,
    highest + second_highest,
    highest + third_highest
];

console.log(possibilities);
1 голос
/ 19 апреля 2019

Я не знаю лучшего решения для этого, но да, есть некоторые условия, которые нужно проверить в первую очередь.

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

Так что, если кто-то введет отрицательное или нулевое значение, ваш цикл войдет в бесконечный цикл и сделает ситуацию еще хуже.

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

Поскольку количество меньше 1 равно только 0, а комбинации для 0 - только 1, вам не нужно анализировать весь цикл на 6 цифр или n цифр на 0, чтобы получить сложность 1 вместо N (число цифр).

И для величины больше 1 вы можете создавать ручные циклы, как здесь вы создали 2 цикла для 2 цифр, вы создали 6 циклов для 6 цифр, лучше создать динамическую логику для этого, чтобы автоматически создавать число циклов.

Вам нужно рассмотреть 1111, 1112 этот тип комбинаций, а? Или если только 1234, 2134, 2314 такого рода сценарии требуются? Это может быть сделано в очень меньшей сложности.

Для дублирования вы можете сохранить комбинации в виде пары ключ-значение. и тогда Object.Keys будут вашими комбинациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...