4.1 配列の定義とその特性
配列は、同じ型の要素の順序付けされたセットを表すデータ構造で、連続したメモリセルに配置されます。配列の各要素には独自のインデックスがあり、それを使ってアクセスします。
ここに4つの要素(1, 2, 3, 4)が含まれる単純な配列があります。
配列の特性:
- 固定サイズ: 配列のサイズは作成時に設定され、プログラム実行中に変更することはできません。
- 要素の均一性: 配列のすべての要素は同じ型である必要があります(例: 整数、文字列)。
- メモリ内の連続配置: 配列の要素は連続したメモリセルに保存され、インデックスによる高速なアクセスを可能にします。
- インデックスによる高速アクセス: 配列の任意の要素へのアクセスは一定時間
O(1)
で行われます。
4.2 配列の使用例
もう知っているかもしれない配列の使用例を見てみましょう:
固定長データの保存
曜日や月:
# 曜日の配列を作成
days_of_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
print(days_of_week[2]) # 出力: Wednesday
行列や多次元配列
3x3の行列:
# 3x3の行列を作成
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[1][1]) # 出力: 5
ソートアルゴリズムでの使用
数列のソート:
# 数列のソート
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort() # 配列をソート
print(numbers) # 出力: [1, 2, 5, 5, 6, 9]
一時データの保存用バッファ
ファイルからデータを読み取るためのバッファ:
# 1024バイトのバッファを作成
buffer = [0] * 1024
print(len(buffer)) # 出力: 1024
4.3 配列の基本操作
重要! Pythonのクラスlistは動的配列です、作業中にそのサイズを変更できます。動的配列については、数回の講義で詳しく学びます。
基本操作: インデックスでのアクセス、挿入、削除
インデックスでのアクセス
インデックスを使用して、配列要素にアクセスします。
# インデックスによる配列要素へのアクセス
arr = [10, 20, 30, 40, 50]
print(arr[2]) # 出力: 30
print(arr[-1]) # 出力: 50 (最後の要素)
挿入
配列に要素を挿入すると、その位置を空けるために後続のすべての要素を移動させる必要がある場合があります。
例(配列の中央に要素を挿入):
# 配列に要素を挿入
arr = [10, 20, 30, 40, 50]
arr.insert(2, 25) # 位置2に25を挿入
print(arr) # 出力: [10, 20, 25, 30, 40, 50]
削除
配列から要素を削除すると、空いた位置を埋めるためにその後の要素をすべて移動させる必要がある場合があります。
例(要素の削除):
# 配列から要素を削除
arr = [10, 20, 30, 40, 50]
arr.pop(2) # 位置2の要素を削除
print(arr) # 出力: [10, 20, 40, 50]
4.4 配列を使用する利点と欠点
配列を使用する利点と欠点を考えてみましょう:
利点:
- インデックスによる高速アクセス: 配列の任意の要素へのアクセスは一定時間
O(1)
で行われ、データを読み取るのに非常に効率的です。 - 実装の簡単さ: 配列は理解しやすく、使いやすいため、さまざまなタスクで簡単に実装および適用できます。
- 低オーバーヘッド: 配列は、リンクリストのようなより複雑なデータ構造と比較して、メモリをあまり占有しません。
欠点:
- 固定サイズ: 配列のサイズは作成時に設定され、変更することはできません。したがって、必要な配列のサイズを事前に知っておく必要があります。または、必要に応じて拡大できる動的配列を使用する必要があります。
- 挿入および削除のコスト: 要素の挿入および削除には時間がかかる場合があります。これは、要素を移動する必要があるためです。最悪の場合、配列の中央に要素を挿入または削除するには
O(n)
の時間がかかります。 - メモリの非効率的な使用: 配列が完全に使用されていない場合、残りのメモリセルは未使用のままになり、メモリの非効率的な使用につながる可能性があります。
GO TO FULL VERSION