Pythonで学ぶ配列回転の反転アルゴリズム:効率的な左回転の実装方法
はじめに
Pythonでは、回転した配列を反転(リバース)する処理が必要になることがあります。本記事では、反転アルゴリズム(Reversal Algorithm)を使って配列を左回転する方法を解説します。この手法では、リストを走査して要素を入れ替えるメソッド、リストを回転させるメソッド、そして結果を表示するメソッドの3つを定義し、シンプルなループとインデックス操作だけで実装できます。
反転アルゴリズムの仕組み
反転アルゴリズムによる左回転は、次の3つのステップで構成されます。
- まず、先頭から「d − 1」番目までの部分を反転する
- 次に、「d」番目から末尾までの部分を反転する
- 最後に、配列全体を反転する
この3段階の反転により、追加の配列を作ることなく、配列全体を左方向へd要素分だけ回転させることができます。
サンプルコード
def reverse_list(my_list, begin, end):
while (begin < end):
temp = my_list[begin]
my_list[begin] = my_list[end]
my_list[end] = temp
begin += 1
end = end-1
def left_rotate(my_list, to_rotate):
n = len(my_list)
reverse_list(my_list, 0, to_rotate-1)
reverse_list(my_list, to_rotate, n-1)
reverse_list(my_list, 0, n-1)
def print_it(my_list):
for i in range(0, len(my_list)):
print(my_list[i])
my_list = [34, 42, 56, 78, 9, 0, 23]
print("The list is :")
print(my_list)
print("The left_rotate method is being called")
left_rotate(my_list, 3)
print("The list after rotation is : ")
print_it(my_list)
実行結果
The list is : [34, 42, 56, 78, 9, 0, 23] The left_rotate method is being called The list after rotation is : 78 9 0 23 34 42 56
コードの解説
- reverse_list:指定された範囲(begin〜end)の要素を両端から順にスワップしていくことで、リストの一部を反転するメソッドです。
- left_rotate:上記の3ステップを実行し、ピボットとなる位置の値に基づいてリストを左回転させるメソッドです。
- print_it:リストの各要素を1行ずつコンソールに出力するメソッドです。
- サンプルとして7つの整数を含むリストを定義し、最初にその内容をコンソールに表示します。
- left_rotateメソッドを呼び出して3要素分の左回転を行い、回転・反転後の要素をコンソールに表示します。
まとめ
反転アルゴリズムは、追加の配列を必要とせず、時間計算量O(n)・空間計算量O(1)で配列を回転できる効率的な手法です。実装もシンプルなため、技術面接や競技プログラミングでも頻繁に活用されます。ぜひ自分のコードにも取り入れてみてください。
-
【Python】配列の全要素の積をnで割った余りを求めるプログラムの書き方
本記事では、以下の問題に対する解決策について詳しく解説します。問題文複数の数値からなる配列と整数 n が与えられたとき、配列内のすべての要素を掛け合わせた結果を n で割った余りを出力する必要があります。アプローチまず、arr[i] % n のように各要素の余りを個別に計算します。次に、その余りを現在の結果に掛け合わせます。掛け算を行うたびに再度剰余演算を適用することで、オーバーフローを回避できます。この手法は、モジュラー算術(合同式)の分配則に基づいています。( a * b) % c = ( ( a % c ) * ( b % c ) ) % c実装例def findremainder(ar
-
Pythonで学ぶ挿入ソート(Insertion Sort)の仕組みと実装方法
この記事では、Python 3.xにおける挿入ソート(Insertion Sort)の基本的な考え方と、実際のコードによる実装方法をわかりやすく解説します。 挿入ソートのアルゴリズム 挿入ソートは、配列を「整列済みの部分」と「未整列の部分」に分け、未整列の要素を一つずつ取り出して、整列済み部分の正しい位置に挿入していくシンプルなソート手法です。処理の手順は以下の通りです。 1. 各反復ごとに整列済みの配列を少しずつ拡大しながら、入力要素を走査する。 2. 現在の要素(キー)を、整列済み配列内の最大値と比較する。 3. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要