|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
dzendras
Germański oprawca
Dołączył: 07 Mar 2006
Posty: 1326
Przeczytał: 0 tematów
Skąd: Chorzów
|
Wysłany: Śro 14:41, 11 Paź 2006 Temat postu: Taki ciekawy problem |
|
|
W związku z tym, że termin warunku zbliża się wielkimi krokami, a jest pewien problem, na który się natknąłem i nie udało mi się do tej pory znaleźć rozwiązania prosiłbym Was o jakieś wskazówki.
Zadanko pochodzi z Diksa:
Opracuj stabilny algorytm sortowania ciągu zero-jedynkowego. Algorytm powinien działać w miescu (złożoność pamięciowa O(1)) i mieć pesymistyczną złożoność czasową O(n*lgn).
Będę wdzięczny za wszelkie sugestie.
|
|
Powrót do góry |
|
|
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Rogal
Zjeb z kaszanką
Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów
Skąd: koło podbiegunowe
|
Wysłany: Śro 16:05, 11 Paź 2006 Temat postu: |
|
|
Nie bardzo rozumiem treść zadania prawdę mówiąc, a konkretnie o co chodzi z tą stałą złożonością pamięciową. Zakładam, że ciąg mogę zczytać do pamięci. Prawdę mówiąc w przeciwnym wypadku nie wobrażam sobie algorytmu o złożoności czasowej O(n logn).
Aha, algorytmu liniowo logartymicznego nie wymyśliłem, mam za to liniówkę :D
1. Iterujesz po całej tablicy i zliczasz ilość zer. Zapamiętujesz tą wartość!
2. Iterujesz po tablicy drugi raz i wartość każdego jej elementu zamieniasz na pozycję, jaką dany element powinien mieć w posortowanym ciągu. Znając ilość zer można to zrobić bardzo łatwo, idea podobna do counting sorta.
3. Zauważasz, że teraz masz jakąś permutację, np. tablica ma postać {2, 5, 0, 3, 1, 4} - chcesz z tego dostać permutację neutralną (czy jak tam się to zwało) - {0, 1, 2, 3, 4, 5}. Więc piszemy prosty algorytm liniowy który nam to zamieni (pseudokod):
Kod: | for(int i=0; i<dlugosc_ciagu; ++i) {
int j = ciag[i];
while(j != i) {
int p = ciag[j];
ciag[j] = j;
j = p;
}
ciag[i] = j;
} |
4. Znając ilość zer w ciągu wyjściowym możemy spowrotem zamienić wartości w tablicy na zera i jedynki...
Jedynym wąskim gardłem jest pkt. 3. Działa on na tej zasadzie, że wyszukuje cykle w permutacji (każda permutacja to suma cykli) i odpowiednio przestawia elementy wzdłuż cyklu. Łatwo sprawdzić, że faktycznie jest to liniowe.
|
|
Powrót do góry |
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
|