Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Taki ciekawy problem

 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych
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

PostWysł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 profil autora
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

PostWysł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
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
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
Regulamin