配列とは何ですか?
- 配列は要素のコレクションであり、それぞれがインデックスまたはキーによって識別されます。
- 配列のサイズは固定かつ動的です
- 同種の要素 → 配列内のすべての要素は同じデータ型です。
- 異種要素 → 同じ配列内で異なるデータ型を許可します。
// Homogeneous
int[] intArray = new int[5]; // Array of integers String[]
stringArray = new String[5]; // Array of strings
// Heterogeneous
mixedArray = [1, "hello", 3.14, True] # Mixed data types in one list
配列の特徴
- インデックス作成: ほとんどのプログラミング言語ではゼロベースのインデックス作成。
- サイズ: 固定サイズ (静的)。動的に変更できません (動的配列を持つ言語を除く)。
- メモリ割り当て: 配列要素に対する連続したメモリ割り当て。つまり、各要素はメモリ内で前の要素のすぐ隣にあります。これが可能なのは、すべての要素が同じサイズであり、システムがそのインデックスを使用して任意の要素のメモリ アドレスを計算できるためです。

配列演算
- 挿入: 通常、要素の移動が含まれ、時間の計算量は O(n) です。
- 削除: 挿入と同様に、要素を移動する必要がある場合があります。最後のインデックスを除く
- トラバーサル: すべての要素を反復処理し、時間の計算量は O(n) です。
- アクセス時間: インデックスを使用して要素にアクセスする場合の複雑さは O(1) です。
配列の種類
- 1 次元配列: リストのような最も単純な形式。
- 多次元配列: 配列の配列 (2D 配列など)。
- ギザギザ配列: 異なる長さのサブ配列を持つ配列。
- 動的配列 (Java の ArrayList など): サイズが動的に増加する可能性のある配列。
配列の利点
- 効率: 要素のアクセス時間は O(1) です。
- メモリ使用率: 連続ストレージによるメモリの効率的な使用。
- 使いやすさ: データの管理と、並べ替えや検索などの操作を簡素化します
配列の欠点
- 固定サイズ: 一度宣言したサイズは変更できません。動的配列
を除く
- 挿入/削除コスト: 要素の挿入または削除、特に中央の場合は O(n)。
- メモリの無駄遣い: 未使用の要素がまだスペースを占有しています。
配列の実世界への応用
- データの保存: 要素のコレクションを保存するためのプログラミングで一般的です。
- 並べ替えアルゴリズム: 多くの並べ替えアルゴリズムは配列用に設計されています (例: QuickSort、MergeSort)。
- 行列演算: 2D 配列は、数学やグラフィックスの行列演算に使用されます。
- スタックとキューの実装: 基本的なデータ構造は配列を使用して実装できます。
配列のベストプラクティス
- 不必要なコピーを避ける: 要素のコピーが必要な操作には注意してください。
- 必要に応じて動的配列を使用する: サイズが不明な場合は、動的配列を使用してください。
- 組み込み関数の活用: 配列操作に言語固有の関数を利用します。
- 境界チェック: IndexOutOfBoundsException を回避するために、常に境界条件をチェックします。
GO の静的および動的配列の例
package main
import (
"fmt"
"unsafe"
)
func main() {
// Static Array
var staticArr [5]int64
staticArr[0] = 1
staticArr[1] = 2
staticArr[2] = 3
staticArr[3] = 4
staticArr[4] = 5
elementSize := unsafe.Sizeof(staticArr[0])
totalSize := elementSize * uintptr(len(staticArr))
fmt.Printf("Memory used by static array: %d bytes\n", totalSize)
fmt.Println()
// Dynamic Array (Slice)
dynamicArr := make([]int32, 0, 5)
before := unsafe.Sizeof(dynamicArr[0])
beforeTotal := before * uintptr(len(dynamicArr))
fmt.Printf("Memory used by dynamic array (before): %d bytes\n", beforeTotal)
// Append elements to dynamic array
for i := 0; i