0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

アルゴリズム体操5

Last updated at Posted at 2019-12-18

Rotate Array

##説明

整数型の配列と整数N(回転数)の二つの引数が渡されたとき、配列の要素をN回(マイナスは左へ、プラスは右へ)
回転させた配列にしよう。

##例
以下の配列が渡されたとしよう。
Screen Shot 2019-12-18 at 10.24.31.png
もし、回転数Nが−1の時は、全ての要素が左側へ一つずつずれる。
Screen Shot 2019-12-18 at 10.25.05.png
また、もし回転数Nが2の場合は、全ての要素が右側へ一つずつ二回ずれる。
Screen Shot 2019-12-18 at 10.27.40.png

Try It Yourself (Brute Force)

この問題でまず私が最初に思い浮かんだ、力任せアルゴリズムは回転後に
必ず二つの左側、右側の部分配列が現れるので、その二つの配列を作る。
(例のN=2のケースでは、left_sub_array = {9 , 40}で、right_sub_array = {1, 10, 20, 0, 59, 86, 32, 11})
そして、左側と右側の部分配列に保存してある回転後の要素を元の配列に順番に更新していく。
もし、Nがマイナスの時は左回転を右回転のアルゴリズムに適用できる様にする。
###実行時間(Runtime Complexity) O(n)
###空間計算量(Memory Complexity) O(n)
###実装
Screen Shot 2019-12-18 at 10.54.04.png

###TEST
Screen Shot 2019-12-18 at 11.29.13.png

###OUTPUT
Screen Shot 2019-12-18 at 11.30.31.png

###見直し
要素の順序を入れ替えていくには、全ての要素の位置を並び替える必要があるため、実行時間O(n)が限界である。
ただ、空間計算量はO(1)にすることができる。つまりは渡されたデータ構造のみを使う。

##最適化: Memory Complexity O(n) -> O(1)

  1. 元の配列の要素を反転します。
  2. 0からN-1までの要素を反転します。
  3. NからLength-1までの要素を反転します

###例
先の例と同じ配列が渡されたとする。また、回転数はN=2とする。
Screen Shot 2019-12-18 at 11.16.56.png

  1. まず、元の配列の要素全てを反転させる。
    Screen Shot 2019-12-18 at 11.18.54.png
  2. それから、index 0 から N-1(2 - 1 = 1)までの要素を反転させる。
    Screen Shot 2019-12-18 at 11.20.46.png
  3. 最後にN(2)から配列の末尾までの要素を反転させる。
    Screen Shot 2019-12-18 at 11.22.30.png
    これで、空間計算量が定数O(1)で最適化できる。
    ###実装
    Screen Shot 2019-12-18 at 11.34.01.png

###OUTPUT (TESTのコードは同じ)
Screen Shot 2019-12-18 at 11.35.56.png

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?