2010-05-31 9 views

Odpowiedz

12

Istnieje wiele powodów, dla których ktoś chciałby losowo przetasować uporządkowaną sekwencję elementów. Na przykład talię kart.

Tasowanie nie jest trywialnym algorytmem, podobnie jak sortowanie nie jest tak powszechne, że konieczne jest korzystanie z funkcji bibliotecznej.

Co do tego, dlaczego lista - oczywiście musi to być uporządkowana kolekcja, a więc nie zbiór ogólny. Tylko lista i jej podtypy są gwarantowane. Klasa Collections nie dostarcza operacji dla tablic, ale możesz (i prawdopodobnie powinieneś, dla wydajności) przekazać ArrayList do tej metody.

+1

+1 za ostatni akapit – jensgram

+0

... w rzeczywistości wdrożenie jest dość banalne. Każdy element otrzymuje nowy indeks, jeśli gniazdo jest już zajęte, kolekcja (lub iterator) oblicza następny wolny slot. –

+0

@Andreas_D nie lekceważ tego, musisz uważać, aby użyć algo, w którym wszystkie permutacje są równie prawdopodobne, więc nie jest to całkiem banalne - patrz http://pl.wikipedia.org/wiki/Fisher-Yates_shuffle – Jesper

5

Um, jeśli masz kolekcję, a chcesz ją przetasować ...

Najbardziej oczywistym przykładem może być gra karciana, w której musisz obiekty reprezentujące poszczególne karty, a zbiór reprezentujący pokład chcesz potasować.

Innym przykładem może być prezentowanie użytkownikowi wielu odpowiedzi w kwestionariuszu, a nie chcesz, aby istniały jakiekolwiek błędy w wyniku uporządkowania odpowiedzi - dlatego prezentujesz każdemu użytkownikowi przetasowany zestaw odpowiedzi do wyboru.

1

Wyobraź sobie, że modelujesz talię kart. Shuffle będzie jedną z pierwszych funkcji, które napiszesz.

Za każdym razem, gdy chcesz losować zawartość kolekcji, użyjesz shuffle.

1

kilka pomysłów, jak można użyć tej metody:

  • karty Mieszaj w grze
  • Randomize tablicę w przypadku testowanego przez algorytm sortowania
  • tasowanie przypadków testowych w zestaw testowy do uczynienia na pewno nie zależą od siebie
  • Jeśli spróbujesz rozwiązać problem NP-zupełny, np. sprzedawca podróżujący, jednym podejściem jest pobranie danych wejściowych, przetasowanie kilkukrotnie, a następnie użycie wyniku o najkrótszej długości. To daje rozwiązanie, które działa w czasie O (N) (gdzie N jest liczbą węzłów).