Drobiazgi
Odwracamy, obracamy...
Dana jest
-elementowa tablica
którą chcemy odwrócić, czyli spowodować, że jej elementy będą zapisane w kolejności ![|a[n];a[n −1]; :::;a[1]:](/math/temat/informatyka/algorytmy/2016/01/27/Odwracamy_obracamy_/3x-8d66b826766d0f12e412cfa451e4c3abe561de48-im-65,9A,A1-FF,FF,FF.gif)
Najłatwiej to zrobić w miejscu (czyli używając jedynie stałej liczby komórek pamięci dla zmiennych pomocniczych), korzystając z instrukcji
zamieniającej miejscami wartości dwóch elementów:
![for i = 1 to⌊n/2⌋ do swap(a[i],a[n + 1− i]);](/math/temat/informatyka/algorytmy/2016/01/27/Odwracamy_obracamy_/2x-eeca35f3c96f78919d0c4aa76297bb54621f036a-dm-33,33,33-FF,FF,FF.gif)
Nietrudno się przekonać, że powyższy kod wywołuje instrukcję zamiany jedynie
razy, co w przypadku odwrócenia tablicy jest wynikiem optymalnym.
A teraz trudniejsze zadanie: chcemy tę samą tablicę obrócić o
komórek w lewo, czyli ustawić jej elementy w kolejności
I tym razem spróbujmy to zrobić, używając jedynie instrukcji zamiany.
Można w tym celu trzykrotnie wywołać omówioną przed chwilą procedurę odwracania tablicy:
Ten kod wykona
instrukcji zamiany, co w zależności od parzystości liczb
i
da nam
lub
instrukcji. Pytanie: czy da się mniej?
Poniższy kod obraca tablicę, dzieląc ją na
cykli o długości
i wykonując obrót każdego z nich niezależnie, do czego potrzebuje
instrukcji zamiany:
![for i = 1 to nwd(n, k) do for j = 1 to n/ nwd(n, k)− 1 do swap(a[i +n ( j −1) ⋅k],a[i +n j⋅k]);](/math/temat/informatyka/algorytmy/2016/01/27/Odwracamy_obracamy_/4x-1f59b0acf527d3ca888e45eaa03768f686d61d24-dm-33,33,33-FF,FF,FF.gif)
Operacja
oznacza tu
Zatem w tym rozwiązaniu użyjemy w sumie
instrukcji zamiany. A czy ten wynik da się poprawić?