Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Использование in-place функций для массивов (https://javascript.ru/forum/misc/84844-ispolzovanie-place-funkcijj-dlya-massivov.html)

Bonky 13.01.2023 18:40

Использование in-place функций для массивов
 
На сайте с уроками попалась задача, нужно создать функцию, которая отсортирует элементы массива, оставив только уникальные:

let strings = ["кришна", "кришна", "харе", "харе",
  "харе", "харе", "кришна", "кришна", ":-O"
];

alert( unique(strings) ); // кришна, харе, :-O


Вот мое решение при помощи in place функций:
function unique(arr) {
    arr.sort();

      for (let i = 0; i < arr.length; ) {
          if (arr[i] === arr[i + 1]) {
              arr.splice(i, 1);
              continue;
          }
          i++;
      }

      return arr;
  }


А вот решение из учебника:
function unique(arr) {
  let result = [];

  for (let str of arr) {
    if (!result.includes(str)) {
      result.push(str);
    }
  }

  return result;
}


Вопрос: какое из решений является более экономным по ресурсам? Помогает ли в моем случае использование in place функций сделать алгоритм эффективнее?

Bonky 13.01.2023 18:49

Цитата:

Сообщение от Rise (Сообщение 549950)
Что это значит?

Метод, который меняет массив, не создавая новый

Rise 13.01.2023 19:09

Bonky,
Понятно.

Цитата:

Сообщение от Bonky
попалась задача

Старая задача наверно. Сегодня это можно делать так:
let strings = ["кришна", "кришна", "харе", "харе",
  "харе", "харе", "кришна", "кришна", ":-O"
];
 
alert([...new Set(strings)]); // кришна, харе, :-O

рони 13.01.2023 19:11

Bonky,
обсуждалось не раз, push "экономнее" splice.

Bonky 13.01.2023 19:13

Цитата:

Сообщение от рони (Сообщение 549954)
Bonky,
обсуждалось не раз, push "экономнее" splice.

Понятно, спасибо!

Alexandroppolus 13.01.2023 21:00

Цитата:

Сообщение от Bonky
какое из решений является более экономным по ресурсам?

Оба решения так себе, работают за O(n^2). То которое из учебника, лучше переписать как Rise советовал. Твой вариант можно ускорить, если не пользоваться сплайсом:
function unique(arr) {
    arr.sort();
    let p = 0;

    for (let i = 1; i < arr.length; ++i) {
        if (arr[i] !== arr[p]) {
            p++;
            arr[p] = arr[i];
        }
    }

    arr.length = p + 1;
}


Это на случай, когда надо именно пофильтровать переданный массив, а не создать новый. Но такое редко бывает.

voraa 13.01.2023 21:08

Цитата:

Сообщение от рони
обсуждалось не раз, push "экономнее" splice.

push то быстрее splice
А вот что быстрее push + includes или splice - это еще надо выяснять.

Bonky 14.01.2023 02:58

Цитата:

Сообщение от Alexandroppolus (Сообщение 549959)
Это на случай, когда надо именно пофильтровать переданный массив, а не создать новый. Но такое редко бывает.

Ух, классное решение, спасибо!


Часовой пояс GMT +3, время: 06:09.