9 / 9
Sep 2020

Link do zadania5

Mój pomysł na zadanie jest taki aby na początku zmapować sobie wszystkie wczytane litery z podanego stringa.
Kluczem w mapie jest litera, a wartością lista pozycji na jakich ta litera występuje.
Przy zamianie liter pobieram sobie indeksy zamienianych liter z mapy, podmieniam odpowiednie litery i aktualizuję mapę.
Czyli złożoność czasowa zamiany liter wynosi O(1) Jakim więc cudem algorytm nie przechodzi próby czasu.i wykłada się na 7 teście? Wygląda na to że samo mapowanie liter jest zbyt wolne…
Odniesie się ktoś do tego?
Konstruktywna krytyka również mile widziana.

  • created

    Aug '20
  • last reply

    Sep '20
  • 8

    replies

  • 532

    views

  • 4

    users

  • 1

    like

  • 3

    links

Co to znaczy aktualizuję mapę?
Masz dwie listy, w których musisz znaleźć określoną wartość, skasować ją i wstawić nową. Zrobisz to w stałym czasie?

Robię to poprzez wbudowaną metodę:

    list1.remove(wartosc1)
    list1.append(wartosc2)
    list2.remove(wartosc2)
    list2.append(wartosc1)

Wiem że set() byłby szybszy, ale z setu nie można pobrać indeksu na którym występuje szukany element.

Nie zastanawiałem się nad tym, nie wiem jak działa wbudowana metoda usuwania, ale masz rację z pewnością to trochę trwa. Zastąpiłem więc remove() poprzez del, które usuwa po indeksię więc dużo szybciej.
Niestety wstawienie i sortowanie później już jest nie do przejścia…

Czyli cały algorytm jest do niczego? Nieprawdopodobne żę da się coś szybszego wymyślić

8 days later

Piszesz w Pythonie? Wnioskuję po remove i append. Jeśli wiesz, że ta lista zawiera tylko liczby to nie używaj list. Są szybsze kolekcje tablicowe do operacji na liczbach: https://docs.python.org/3/library/array.html2
wczytanie początkowego stringa (może być długi) też da się zrobić szybciej niż przez input. Może by dało się (da się) już podczas wczytywania tego stringa znak po znaku budować ten słownik? Bo tak pewnie budujesz po jego wczytaniu co oznacza dwukrotne przejście po nim.

Nie musisz wiedzieć jak działa by znać złożoność. Złożoność podstawowych operacji jest powszechnie dostępna:
https://wiki.python.org/moin/TimeComplexity2

Wydaje mi się jednak że cały algorytm jest zbyt wolny, bo najlepszy wyniki wynosi 0.23s, a jak przepisałem do C++ mój algorytm to też nie wyrabia się w czasie. Użyłem mapy<char, set>.

Jest dostepne omowienie tego zadania z uzyciem
drzewa pozycyjnego.

Bardzo Ci dziękuję za nakierowanie na rozwiązanie, sam nigdy bym do tego nie doszedł. Niby były na studiach algorytmy i struktury danych ale o drzewach pozycyjnych nie słyszałem.
A szczególnie Ci jestem wdzięczny za to że mogę się nauczyć czegoś nowego i nie stać w miejscu.
Pozdrawiam serdecznie.