10.1 動的配列の特徴
動的配列は、プログラムの実行中にサイズを変更できるデータ構造です。要素のコレクションを効率的に管理し、配列のサイズを事前に決定することなく要素を追加および削除できます。
Pythonでは、動的配列はリスト(組み込みクラスlist)であり、任意の位置で要素を追加、削除、変更できます。
動的配列の特徴:
- 可変サイズ: 動的配列は必要に応じて大きくなったり小さくなったりします。
- インデックスによる高速アクセス: 要素へのアクセスは定数時間
O(1)
で行われます。 - 自動メモリ管理: Pythonはリストのメモリの割り当てと解放を自動的に管理します。
- 要素操作の便利なメソッド: 組み込みメソッドにより、要素の追加、削除、変更が簡単に行えます。
Pythonにおける動的配列の作成と使用例:
# リストの作成
dynamic_array = [1, 2, 3, 4, 5]
# 要素の追加
dynamic_array.append(6)
print(dynamic_array) # 出力: [1, 2, 3, 4, 5, 6]
# 要素の削除
dynamic_array.remove(3)
print(dynamic_array) # 出力: [1, 2, 4, 5, 6]
# インデックスによるアクセス
print(dynamic_array[2]) # 出力: 4
# 要素の変更
dynamic_array[2] = 10
print(dynamic_array) # 出力: [1, 2, 10, 5, 6]
10.2 動的配列の利点と欠点
動的配列には利点と欠点があります。それらを詳しく見ていきましょう。
利点:
- 柔軟性: プログラムのニーズに応じて動的にサイズを変更できるため、メモリを効率的に管理し可変データ量を処理できます。
- インデックスによる高速アクセス: 静的配列と同様に、インデックスによって要素に高速にアクセスできます(定数時間
O(1)
)。 - 使いやすさ: Pythonの組み込みメソッド(append, remove, insertなど)により、要素の操作が簡単で、コードの可読性と保守性が向上します。
- 自動メモリ管理: Pythonは動的配列のメモリを自動的に管理するので、プログラマーは手動でメモリを割り当てたり解放したりする必要がありません。
欠点:
- メモリの再割り当て: 動的配列のサイズが増加するとメモリを再割り当てする必要があり、新しいメモリ領域に要素をコピーすることが伴います。これにより、一時的にプログラムの実行が遅くなることがあります。
- 要素の挿入と削除のコスト: 配列の途中での要素の挿入と削除は、要素のシフトを必要とし、
O(n)
時間を要します。 - 少しのオーバーヘッド: Cのような低レベル言語と比較して、Pythonの動的配列は自動メモリ管理や例外処理に関連する追加のオーバーヘッドがあります。
10.3 使用例と応用
Pythonにおける動的配列の使用例をいくつか見ていきましょう。
1. 動的なタスクリストの実装:
tasks = []
# タスクの追加
tasks.append("Task 1")
tasks.append("Task 2")
tasks.append("Task 3")
# タスクの完了とリストからの削除
completed_task = tasks.pop(0)
print(f"Completed: {completed_task}")
print(f"Remaining tasks: {tasks}") # 出力: Remaining tasks: ['Task 2', 'Task 3']
2. 動的なオブジェクトリストの実装:
students = []
# 学生の追加
students.append("Alice")
students.append("Bob")
students.append("Charlie")
# 学生の削除
students.remove("Bob")
print(f"Students after removal: {students}") # 出力: Students after removal: ['Alice', 'Charlie']
# 特定の位置に学生を追加
students.insert(1, "David")
print(f"Students after insertion: {students}") # 出力: Students after insertion: ['Alice', 'David', 'Charlie']
GO TO FULL VERSION