Jak ktoś lubi rozgrzewki z #algorytmika / #algorytmy to może się rozgrzać na zadaniu:
Mamy tablicę z n liczbami naturalnymi, np.: [1, 2, 3, 5, 6, 8, 11, 1]. Mamy też liczbę k > 0.
Napisz algorytm, który przesunie elementy w tablicy (w prawo lub w lewo - tu nie jest to istotne), o k pozycji. Naturalnie należy uniknąć alokowania pomocniczej tablicy o rozmiarze n.
@Adaslaw: Po prostu zapamiętujesz pierwszy / ostatni element w tablicy, przesuwasz wszyskie pozostałe elementy w tablicy a potem wstawiasz wcześniej zapamiętany element na pierwsze / ostatnie miejsce w tablicy. Powtarzasz odpowiednią liczbę razy. Złożoność obliczeniowa O(n) - liczba kroków algorytmu jest zdominowana przez liczbę przesunięć, a im większa tablica, tym więcej tych przesunięć. Złożoność pamięciowa O(1), zawsze pamiętasz tylko jeden element. Może można prościej, ale jest środek nocy i wolę
jeśli zrobił się cykl i nie wszystkie przepisane to zaczynami początkowe i + 1
@MonsieurLaBoule: Całkiem spoko algorytm zaproponowałeś. Jednak nie rozwikłałeś tu jednej kwestii. Napisałeś "to zaczynami początkowe i + 1". OK, ale tak sobie zaczynamy od kolejnych i+1, ale kiedy to kończymy? :) Na którym 'i' kończymy tę zabawę? :)
@mk321: Faktycznie, robi 2 przebiegi po tablicy, a nie jak napisałem wcześniej 3. Ale jak już się wcześniej zgodziłem, złożoność czasowa pozostaje O(n).
Po prostu zapamiętujesz pierwszy / ostatni element w tablicy, przesuwasz wszyskie pozostałe elementy w tablicy a potem wstawiasz wcześniej zapamiętany element na pierwsze / ostatnie miejsce w tablicy. Powtarzasz odpowiednią liczbę razy. Złożoność obliczeniowa O(n) - liczba kroków algorytmu jest zdominowana przez liczbę przesunięć, a im większa tablica, tym więcej tych przesunięć. Złożoność pamięciowa O(1), zawsze pamiętasz tylko jeden element.
Może można prościej, ale jest środek nocy i wolę oglądać film dokumentalny
@null_ptr: bo takie przesunięcie elementów to permutacja, a te można reprezentować jako macierze. Ja kombinowałem jeszcze z rozkładem permutacji na transpozycje, wtedy naraz zamieniamy tylko dwa elementy, to chyba też da złożoność czasową O(n).
Mamy tablicę z n liczbami naturalnymi, np.: [1, 2, 3, 5, 6, 8, 11, 1].
Mamy też liczbę k > 0.
Napisz algorytm, który przesunie elementy w tablicy (w prawo lub w lewo - tu nie jest to istotne), o k pozycji.
Naturalnie należy uniknąć alokowania pomocniczej tablicy o rozmiarze n.
Przykład:
Tablica: [1, 2, 3, 4, 5]
k: 2
Wynik: [4, 5, 1, 2, 3]
Udanej zabawy :)
#programowanie
def rotate_right(arr, k):n = len(arr)
k = k % n # obsługa k >
Może można prościej, ale jest środek nocy i wolę
@MonsieurLaBoule:
Całkiem spoko algorytm zaproponowałeś.
Jednak nie rozwikłałeś tu jednej kwestii. Napisałeś "to zaczynami początkowe i + 1". OK, ale tak sobie zaczynamy od kolejnych i+1, ale kiedy to kończymy? :) Na którym 'i' kończymy tę zabawę? :)
@Adaslaw: O(n + k + (n - k)) = O(2n) = O(n)
rotate = lambda tab, k: tab[-k:] + tab[:-k]O ile rozumiem Twoją propozycję, to takich przesunięć wszystkich elementów całej tablicy będzie 'k'. To trochę dużo ;)
@mk321: Faktycznie, robi 2 przebiegi po tablicy, a nie jak napisałem wcześniej 3.
Ale jak już się wcześniej zgodziłem, złożoność czasowa pozostaje O(n).
@MonsieurLaBoule:
Na szybko myślę, że masz rację i to powinno zadziałać poprawnie.
Komentarz usunięty przez autora
@Adaslaw: Nie czaje co to znaczy przesunac o k pozycji. Dlaczego jest taki wynik?