プログラミング作法 第2章 アルゴリズムとデータ構造を読んだ
探索
- データ量が
少ない 時は 逐次探索・線形探索で 十分高速 - 大きめの
配列では 二分探索を 使う - 真ん中の
要素を 調べ、 探している 値より 大きかったら 前半、 小さかったら 後半を 調べて、 見つかるか 存在しないと 分かるまで 探索する - この
方 法を 使うには 配列が ソートされており、 配列の 長さが わかっている 必要が ある - ステップ数は
log2n(nを 2で 除算できる 回数)
- 真ん中の
ソーティング
- クイックソート
- ピボットの
要素を とり、 それより 大きいグループと 小さい グループに 分ける 処理を 再起的に 行う ことで ソートする - 挿入法や
バブルソートと 比較して 桁違いに 高速 - 動作が
入力データに 依存する アルゴリズムも ある
- ピボットの
O記法
- 計算量は
nの 関数と して 表現される - 最悪な
ケースと 期待される 動作は 区別する
リスト
- 配列との
違いは サイズと ソートの 容易さ - 配列は
決まった サイズに なるが、 リストは 中身を 記憶する サイズ+ポインタを 記憶する サイズ - リストは
ポインタを 交換する ことで 順序を 変更できるが、 配列は ブロック移動作業の コストが 高い - リストの
末尾に 要素を 追加する 作業は 通常O(n)に なるが、 別途末尾の ポインタを 管理する 等の 対応で O(1)に する ことも できる
- リストの
- 配列は
ツリー
- リストや
配列では O(n)かかる 処理も、 ツリーなら O(logn)で 済むようになる - バランス木
- ルートから
リーフまでの 個々の 経路が ほぼ 同じ 長さの ツリー - 項目を
検索する 作業が O(logn)で 済む
- ルートから
ハッシュテーブル
- 配列と
リストと 数学的処理を 組み合わせ、 効率よく 動的データを 記憶し取得できる データ構造 - 応用例と
して、 キーに 対して 何らかの 値を 関連づける シンボルテーブルが ある - キーを
ハッシュ関数に 渡して ハッシュ値を 生成し、 情報が 記憶されている テーブルの インデックスと して 使用 - ハッシュテーブルは
リストの 配列 - ハッシュ値を
共有する 項目同士を チェインする リストが 入る
- ハッシュ値を
- シンボルテーブルに
ハッシュ値を 記憶しておく