2011-08-07 7 views
6

Opcja 1: Utwórz listę, która implementuje wartość Porównywalne i posortuj ją przy użyciu metody collections.sort (Lista l) za każdym razem, gdy dodasz wartość. Opcja 2: Utwórz TreeSet (który jest cały czas sortowany).Lista z porównywalnym zestawem drzewiastym Vs

Który z nich będzie szybszy? Pytam o to, ponieważ List daje mi opcję ListIterator, której potrzebuję w moim przypadku, ponieważ pozwala mi dodać element podczas iteracji.

+0

Moja struktura danych będzie zawierać około 100-200 niestandardowych obiektów. – aps

+0

jak często planujesz aktualizację swojej kolekcji [w porównaniu do innych OPS]? także, TreeSet zapobiegnie duplikatom, lista nie - jakie są twoje zasady dotyczące tego problemu? – amit

+0

Przepraszam, powiedziałem coś niepoprawnego. W rzeczywistości moje kolekcje będą aktualizowane dość często przez początkowe 10% czasu pracy programu, po czym nie trzeba ich już sortować, ponieważ liczba obiektów stanie się mniej więcej stała. Następnie zaktualizuję właściwości obiektów. – aps

Odpowiedz

13

Najistotniejsze różnice:

Criterion  | List with Collections.sort | TreeSet 
----------------+----------------------------+--------- 
cost of adding | O(n log n)     | O(log n) 
equal sort keys | permitted     | eliminated as duplicates 
iteration  | bidirectional, can insert | unidirectional, can not insert 

Aby wstawić element podczas iteracji bez uzyskania ConcurrentModificationException, można zrobić:

for (E e : new ArrayList<E>(collection)) { 
    // some other code 

    collection.add(anotherE); 
} 
2

Użyj ustawienia drzewa tutaj.

Dodawanie do TreeSet to operacja log(n). Dodawanie do listy to czas stały, ale sortowanie to jest n log(n).

+1

wstawienie w TreeSet będzie sortować automatycznie, więc jego log (n) dla treeset a nlog (n) dla sortowania listy. –

3

Collections.sort wykorzystuje zmodyfikowaną scalania-sort z NLog (n) czas sortowania. Jeśli wywołasz metodę przy każdym dodaniu, możesz uzyskać czas n^2log (n). Podczas wstawiania w TreeSet jest gwarantowany log (n). Więc jeśli wywołasz to przy każdym dodaniu, staje się n.log (n). Sugerowałbym użycie zamiast tego zestawu TreeSet. Ale TreeSet nie zezwala na duplikaty, co może wpłynąć na twoją decyzję.

Jeśli używasz List, to zamiast używać Collections.sort, możesz zrobić jedną rzecz, aby zoptymalizować; jak wiesz, że za każdym razem, gdy wstawiasz element na listę, lista jest już posortowana, więc użycie sortowania wstawiania da ci lepszą wydajność, ponieważ sortowanie wstawiania działa lepiej w takich przypadkach.

+0

Nie potrzebuję duplikatów. Ale potrzebowałem dodać obiekty do kolekcji podczas iteracji. Właśnie dlatego rozważałem List. – aps