循環移動問題思考!

考慮一個問題:將一個具有n個元素的數組向左循環移動i個位置。有許多應用程序會調用這個問題的算法, 例如在文本編輯器中移動行的操作,磁盤整理時交換兩個不同大小的相鄰內存塊等。所以,這個問題的算法要求有較高的時間和空間性能。
     可以通過下面的方法解決這個問題:先將數組中的前i個元素存放在一個臨時數組中,再將餘下的n-i個元素左移i個位置, 最後將前i個元素從臨時數組複製回原數組中後面的位置。但是這個算法使用了i個額外的存儲單元,使得空間性能降低。
     還有一個方法可以解決這個問題:先設計一個函數將數組向左循環移動一個位置,然後再調用該算法i次, 顯然,這個算法的時間性能不好。
     要在有限的資源中解決這個問題,似乎很困難。現在我們換一個角度看這個問題: 將這個問題看作是把數組ab轉換成數組ba(a代表數組的前i個元素,b代表數組中餘下的n-i個元素), 先將a逆置得到arb,再將b逆置得到arbr,最後將整個arbr逆置得到(arbr)r=ba。設Reverse函數執行將數組元素逆置的操作, 對abcdefgh向左循環移動3個位置的過程如下:
     Reverse(0, i-1); //得到cbadefgh
   Reverse(i, n-1); //得到cbahgfed
   Reverse(0, n-1); //得到defghabc

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章