我最近在閱讀Programming Pearls書中的解決方案時瞭解瞭如何在線性時間內旋轉數組。使用Juggling算法旋轉陣列
的代碼來解決這個問題如下:
/*Function to left rotate arr[] of siz n by d*/
void leftRotate(int arr[], int d, int n)
{
int i, j, k, temp;
for (i = 0; i < gcd(d, n); i++)
{
/* move i-th values of blocks */
temp = arr[i];
j = i;
while(1)
{
k = j + d;
if (k >= n)
k = k - n;
if (k == i)
break;
arr[j] = arr[k];
j = k;
}
arr[j] = temp;
}
}
我有一個關於這個算法的兩個問題 -
- 怎樣的GCD決定旋轉 所需的週期數陣列?
- 爲什麼一旦我們完成了一個循環,我們就從下一個元素開始新的 循環。下一個元素是否已經是已處理循環的一部分? ?
我的感覺,我缺少關於工作GCD,模和週期一些基本的東西。
以下問題解答了我的第一個問題,但仍然無法理解。
Juggling algorithm of string rotation
所以,這將是有益的,如果有人能在淺白和後面怎麼都凝膠在一起,使這種算法的工作原理解釋。
爲小數組寫出所有步驟可能也會幫助您理解算法。 –
使用k =(j + d)%n代替檢查k> = n並且減去它是否更好? – avmohan
使用減法代替MOD操作是一個微妙的優化 - 因爲MOD(%)操作比使用減法和if檢查使用更多的CPU週期。從算法中可以看出,k永遠不會大於2 * n。所以,做一個減法就足夠了。 – Balasubramanian