Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

配列

配列(Array) は、同じ型の要素をメモリ上に連続して並べたデータ構造。

  • 要素はメモリ上で連続して配置される

  • インデックスで任意の要素に O(1)O(1) でアクセスできる

  • 固定長(静的配列)と可変長(動的配列)がある

計算量

操作計算量備考
アクセス a[i]O(1)O(1)メモリアドレスの計算で直接参照
末尾への追加(動的配列)平均 O(1)O(1)容量不足時は O(n)O(n) の再確保
先頭・途中への挿入O(n)O(n)シフトが必要
先頭・途中からの削除O(n)O(n)シフトが必要
線形探索O(n)O(n)
二分探索(ソート済み)O(log⁡n)O(\log n)

Python の array モジュール

array.array は、C言語の配列に近い型付き配列を提供する。

  • 全要素が同じ型(C言語の数値型)でなければならない

  • list よりメモリ効率が良い(Pythonオブジェクトのオーバーヘッドなし)

  • 数値の大量処理に向いているが、numpy ほど高機能ではない

主な型コード:

型コードC 型Python 型サイズ
'b'signed charint1 byte
'i'signed intint2〜4 bytes
'f'floatfloat4 bytes
'd'doublefloat8 bytes

Python の list

Python の list は動的配列(dynamic array) として実装されている。

  • 要素はメモリ上に連続して配置される(各要素はPythonオブジェクトへのポインタ)

  • 容量が不足すると、より大きいメモリ領域を確保して全要素をコピーする

  • append は平均 O(1)O(1) (O(n)O(n)だがたまにしか発生しないので平均は低い)

  • insert(0, x) は O(n)O(n)

  • 異なる型の要素を混在できる

動的配列の成長戦略

CPythonの list は容量不足時に現在のサイズの約1.125倍(+ α)に拡張する。 拡張時に全要素をコピーするため O(n)O(n) かかるが、拡張の頻度が指数的に減るため、 append の 償却計算量 (amortized time complexity、平均でみたとき) は O(1)O(1) になる。

list vs array vs numpy.ndarray

特性listarray.arraynumpy.ndarray
要素の型任意(混在可)同一の数値型同一の数値型
メモリ効率低い高い高い
数値演算速度遅いやや遅い速い(ベクトル化)
多次元配列不可(ネスト)不可可
用途汎用コレクション数値の省メモリ保存数値計算・科学計算