「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 配列データ構造の詳細

配列データ構造の詳細

2024 年 9 月 2 日に公開
ブラウズ:516

配列とは何ですか?

  • 配列は要素のコレクションであり、それぞれがインデックスまたはキーによって識別されます。
  • 配列のサイズは固定かつ動的です
  • 同種の要素 → 配列内のすべての要素は同じデータ型です。
  • 異種要素 → 同じ配列内で異なるデータ型を許可します。
// 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

配列の特徴

  • インデックス作成: ほとんどのプログラミング言語ではゼロベースのインデックス作成。
  • サイズ: 固定サイズ (静的)。動的に変更できません (動的配列を持つ言語を除く)。
  • メモリ割り当て: 配列要素に対する連続したメモリ割り当て。つまり、各要素はメモリ内で前の要素のすぐ隣にあります。これが可能なのは、すべての要素が同じサイズであり、システムがそのインデックスを使用して任意の要素のメモリ アドレスを計算できるためです。

Deep dive into Array Data Structure

配列演算

  • 挿入: 通常、要素の移動が含まれ、時間の計算量は 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 




          

            
        
リリースステートメント この記事は次の場所に転載されています: https://dev.to/chandra179/deep-dive-into-array-data-structor-1g82?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3