PDA

Просмотр полной версии : Оптимизация получения массива с уникальными элементами


__i
07.02.2006, 15:13
есть массив в произвольным набором элементов, нужно из него удалить повторяющиеся элементы (т.е. чтоб все элементы были уникальными), я сделал так:


Array.prototype.removeDouble = function(pole) {
if (pole=='undefined')
var s = this.sort();
else
var s = this.sortOn(pole);
var i = 1;
while (i<s.length) {
if (s[i-1] == s[i]) {
s.splice(i, 1);
} else {
i++;
}
}
return s;
};


но этот код как мне кажеться не очень оптимальный т.к. нам приходиться сортировать массив.

у меня есть идея для второго варианта, -
несортируя в цикле ищем похожие элементы и удаляем их
(я не писал поленился), разница между вторым и первым будет всего в 1м цикле (в первом варианте мы на 1 раз больше проходим циклом while и то это спорный вариант, я не знаю каким алгоритмом реализована сортировка во флеше, если "пузырком" проходов по массиву будет больше, а если "Быстрая сортировка", то меньше),

Прошу предложить более оптимальный способ, если он есть

olegn
07.02.2006, 19:18
Если не важно, как будут расположены элементы в возвращаемом массиве, то первый вариант представляется самым оптимальным, тем более что метод sort работает быстро.
Однако если нужен универсальный метод для расширения класса Array, то первый вариант независимо от его производительности вообще не подходит и как вариант не должне рассматриваться.
Потому что в результате возвращается совсем не изначальный массив (из которого просто-напросто удалены одинаковые элементы), а возвращается массив с другим порядком элементов. И если где-то в коде хранится обращение к элементу этого массива по индексу, то после вызова метода обращение может вернуть не тот элемент.

__i
07.02.2006, 19:28
ну на счет перемешивания элементов, я в курсе %)), мне вобщем нужно что-то на подобии типа "множество" в Паскале.

Antares
07.02.2006, 19:30
ну так напиши. Я давно себе переписал collections framework из Java, разве что особо крутые карты не стал трогать