2025-01-09

プログラミング作法 第2章 アルゴリズムとデータ構造を読んだ

技術書

探索

  • データ量が少ない時は逐次探索・線形探索で十分高速
  • 大きめの配列では二分探索を使う
    • 真ん中の要素を調べ、探している値より大きかったら前半、小さかったら後半を調べて、見つかるか存在しないと分かるまで探索する
    • この方法を使うには配列がソートされており、配列の長さがわかっている必要がある
    • ステップ数はlog2n(nを2で除算できる回数)

ソーティング

  • クイックソート
    • ピボットの要素をとり、それより大きいグループと小さいグループに分ける処理を再起的に行うことでソートする
    • 挿入法やバブルソートと比較して桁違いに高速
    • 動作が入力データに依存するアルゴリズムもある

O記法

  • 計算量はnの関数として表現される
  • 最悪なケースと期待される動作は区別する

リスト

  • 配列との違いはサイズとソートの容易さ
    • 配列は決まったサイズになるが、リストは中身を記憶するサイズ+ポインタを記憶するサイズ
    • リストはポインタを交換することで順序を変更できるが、配列はブロック移動作業のコストが高い
      • リストの末尾に要素を追加する作業は通常O(n)になるが、別途末尾のポインタを管理する等の対応でO(1)にすることもできる

ツリー

  • リストや配列ではO(n)かかる処理も、ツリーならO(logn)で済むようになる
  • バランス木
    • ルートからリーフまでの個々の経路がほぼ同じ長さのツリー
    • 項目を検索する作業がO(logn)で済む

ハッシュテーブル

  • 配列とリストと数学的処理を組み合わせ、効率よく動的データを記憶し取得できるデータ構造
  • 応用例として、キーに対して何らかの値を関連づけるシンボルテーブルがある
  • キーをハッシュ関数に渡してハッシュ値を生成し、情報が記憶されているテーブルのインデックスとして使用
  • ハッシュテーブルはリストの配列
    • ハッシュ値を共有する項目同士をチェインするリストが入る
  • シンボルテーブルにハッシュ値を記憶しておく