Wpis z mikrobloga

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.

Przykład:
Tablica: [1, 2, 3, 4, 5]
k: 2

Wynik: [4, 5, 1, 2, 3]

Udanej zabawy :)

#programowanie
  • 18
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Adaslaw: daj coś gdzie trzeba pomyśleć, a nie jakąś algorytmikę, gdzie byle ChatGPT to rozwiązuje z palcem w danych.

def rotate_right(arr, k):
n = len(arr)
k = k % n # obsługa k >
  • Odpowiedz
@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ę
  • Odpowiedz
  • 0
@mk321: całkiem spoko algorytm. Robi 3 przebiegi po tablicy, zamiast jednego przebiegu, ale złożoność czasowa wciąż pozostaje O(n).
  • Odpowiedz
  • 0
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ę? :)
  • Odpowiedz
Robi 3 przebiegi po tablicy, zamiast jednego przebiegu, ale złożoność czasowa wciąż pozostaje O(n).


@Adaslaw: O(n + k + (n - k)) = O(2n) = O(n)
  • Odpowiedz
  • 1
O(n + k + (n - k)) = O(2n) = O(n)


@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).
  • Odpowiedz
  • 0
możemy policzyć jaką długość ma cykl przy pierwszej iteracji, potem podzielimy len tablicy przez długość cyklu i wyjdzie ilość iteracji


@MonsieurLaBoule:
Na szybko myślę, że masz rację i to powinno zadziałać poprawnie.
  • Odpowiedz
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
  • Odpowiedz
@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).
  • Odpowiedz