BOOK SEARCH
データ構造とアルゴリズム ―上達のための基本・常識―
Jay Wengrow(著)/黒川 利明(訳)
Jay Wengrow(著)/黒川 利明(訳)
定価 4,950 円(本体 4,500 円+税)
A5判/384ページ
刊行日:2023年07月01日
ISBN:978-4-254-12287-9 C3004
ネット書店で購入する amazon e-hon 紀伊國屋書店 honto Honya Club Rakutenブックス くまざわ書店
書店の店頭在庫を確認する 紀伊國屋書店
内容紹介
データ構造とアルゴリズムの基本を解説。式や変数はほぼ使わず,初学者でも直観的にわかるように具体的な数値やデータ,図,グラフを使って説明。初学者に最適な入門書〔内容〕データ構造やアルゴリズムの重要性/O表記/ハッシュテーブル/スタック/キュー/再帰/動的計画法/連結リスト/ヒープ/二分木/グラフ/領域計算量。
編集部から
"A Common-Sense Guide to Data Structures and Algorithms, Second Edition: Level Up Your Core Programming Skills, 2nd Edition" by Jay Wengrow (Pragmatic Bookshelf, 2020)の翻訳.
目次
1. なぜデータ構造は重要か
1.1 データ構造
1.2 配列:データ構造の基礎
1.2.1 データ構造の演算
1.3 処理速度の測定
1.4 読み
1.5 探索
1.6 挿入
1.7 削除
1.8 集合:1つの規則で効率がどれだけ変わるか
1.9 まとめ
1.10 練習問題
2. なぜアルゴリズムは重要か
2.1 順序付き配列
2.2 順序付き配列を探索
2.3 二分探索
2.3.1 コード実装:二分探索
2.4 二分探索と線形探索の比較
2.4.1 簡単なテスト
2.5 まとめ
2.6 練習問題
3. そうだ,O表記だ
3.1 O表記:N要素に関してどれだけのステップ数か
3.2 O表記の精神
3.2.1 O表記の精神のさらに深いところ
3.2.2 同じアルゴリズム,異なるシナリオ
3.3 第3の種類のアルゴリズム
3.4 対数
3.5 O(logN)の説明
3.6 実際の例
3.7 まとめ
3.8 練習問題
4. コードをO表記で速くする
4.1 バブルソート
4.2 バブルソートの実際
4.2.1 バブルソートのコード実装
4.3 バブルソートの性能
4.4 2乗の問題
4.5 線形の解
4.6 まとめ
4.7 練習問題
5. O表記でのコード最適化とO表記なしでのコード最適化
5.1 選択ソート
5.2 選択ソートの実際
5.2.1 選択ソートのコード実装
5.3 選択ソートの性能
5.4 定数を無視
5.5 O表記のカテゴリ
5.5.1 実際的な例
5.5.2 重要なステップ
5.6 まとめ
5.7 練習問題
6. 楽観的シナリオで最適化
6.1 挿入ソート
6.2 挿入ソートの実際
6.2.1 挿入ソートのコード実装
6.3 挿入ソートの性能
6.4 平均的な場合
6.5 実際的な例
6.6 まとめ
6.7 練習問題
7. 通常のコードでO表記
7.1 偶数の平均
7.2 ワードビルダー
7.3 配列のサンプル
7.4 平均温度を摂氏で表示
7.5 衣類のラベル
7.6 1を数える
7.7 回文チェッカー
7.8 すべての積を求める
7.8.1 複数データセットの場合
7.9 パスワード破り
7.10 まとめ
7.11 練習問題
8. ハッシュ表で高速検索をこなす
8.1 ハッシュ表
8.2 ハッシュ関数によるハッシング
8.3 楽しみと利益を兼ねてだが主として利益のためにシソーラスを作る
8.4 ハッシュ表の検索
8.4.1 一方向の検索
8.5 衝突の処理
8.6 効率的なハッシュ表の作成
8.6.1 バランスが重要だ
8.7 データをうまく構成するためのハッシュ表
8.8 速度向上のためのハッシュ表
8.8.1 配列の部分集合
8.9 まとめ
8.10 練習問題
9.スタックとキューでエレガントなコードを作る
9.1 スタック
9.2 抽象データ型
9.3 スタックの実際
9.3.1 コード実装:スタックによるコードリンター
9.4 制約付きデータの重要性
9.4.1 スタックのまとめ
9.5 キュー
9.5.1 キューの実装
9.6 キューの実際
9.7 まとめ
9.8 練習問題
10.再帰で再帰的に再帰する
10.1 ループしないで再帰
10.2 基底の場合
10.3 再帰コードを読む
10.4 コンピュータから見た再帰
10.4.1 呼び出しスタック
10.4.2 スタックオーバーフロー
10.5 ファイルシステムの横断
10.6 まとめ
10.7 練習問題
11. 再帰的に書くことを学ぶ
11.1 再帰カテゴリ:実行を繰り返す
11.1.1 再帰技法:余分な引数を渡す
11.2 再帰カテゴリ:計算
11.2.1 計算の2つの方式
11.3 トップダウン再帰:新たな考え方
11.3.1 トップダウン思考プロセス
11.3.2 配列の和
11.3.3 文字列の反転
11.3.4 Xを数える
11.4 階段の問題
11.4.1 階段問題の基底
11.5 アナグラムの生成
11.5.1 アナグラム生成の効率
11.6 まとめ
11.7 練習問題
12. 動的計画法(ダイナミック・プログラミング)
12.1 不必要な再帰呼び出し
12.1.1 maxの再帰を調べる
12.2 O表記のちょっとした修正
12.3 再帰の性能
12.4 重複下位問題
12.5 メモ化による動的計画法
12.5.1 メモ化の実装
12.6 ボトムアップ方式による動的計画法
12.6.1 ボトムアップ方式によるフィボナッチ
12.6.2 メモ化とボトムアップの比較
12.7 まとめ
12.8 練習問題
13. 速度を求める再帰アルゴリズム
13.1 分割
13.1.1 コード実装:分割
13.2 クイックソート
13.2.1 コード実装:クイックソート
13.3 クイックソートの性能
13.3.1 クイックソートの鳥瞰図
13.3.2 クイックソートのO表記
13.4 最悪シナリオでのクイックソート
13.4.1 クイックソート対挿入ソート
13.5 クイック選択
13.5.1 クイック選択の性能
13.5.2 コード実装:クイック選択
13.6 他のアルゴリズムへの鍵としてのソート
13.7 まとめ
13.8 練習問題
14. 節点に基づいたデータ構造
14.1 リンク付きリスト
14.2 リンク付きリストの実装
14.3 読み込み
14.3.1 コード実装:リンク付きリストの読み込み
14.4 探索
14.4.1 コード実装:リンク付きリストの探索
14.5 挿入
14.5.1 コード実装:リンク付きリストの挿入
14.6 削除
14.6.1 コード実装:リンク付きリストの削除
14.7 リンク付きリストの演算性能
14.8 リンク付きリストの実際
14.9 二重リンク付きリスト
14.9.1 コード実装:二重リンク付きリストの挿入
14.9.2 前後の移動
14.10 二重リンク付きリストによるキュー
14.10.1 コード実装:二重リンク付きリストによるキュー
14.11 まとめ
14.12 練習問題
15. 二分探索木ですべてを高速化する
15.1 木
15.2 二分探索木
15.3 探索
15.3.1 二分探索木での探索の性能
15.3.2 logNレベル
15.3.3 コード実装:二分探索木の探索
15.4 挿入
15.4.1 コード実装:二分探索木の挿入
15.4.2 挿入の順序
15.5 削除
15.5.1 2つの子のある節点の削除
15.5.2 後継節点を見つける
15.5.3 右の子がある後継節点
15.5.4 完全な削除アルゴリズム
15.5.5 コード実装:二分探索木での削除
15.5.6 二分探索木での削除の性能
15.6 二分探索木の実際
15.7 二分探索木の横断
15.8 まとめ
15.9 練習問題
16. ヒープで優先順を保持する
16.1 優先度付きキュー
16.2 ヒープ
16.2.1 ヒープ条件
16.2.2 完全木
16.3 ヒープの性質
16.4 ヒープの挿入
16.5 最終節点を探す
16.6 ヒープでの削除
16.7 ヒープと順序付き配列の比較
16.8 最終節点の問題,再訪
16.9 ヒープとしての配列
16.9.1 配列に基づいたヒープでの横断
16.9.2 コード実装:ヒープの挿入
16.9.3 コード実装:ヒープの削除
16.9.4 別のヒープ実装
16.10 優先度付きキューとしてのヒープ
16.11 まとめ
16.12 練習問題
17. trieをしても苦にならない
17.1 trie
17.1.1 trie節点
17.1.2 trieクラス
17.2 単語の格納
17.2.1 アスタリスクの必要性
17.3 trieの探索
17.3.1 コード実装:trieの探索
17.4 trieの探索の性能
17.5 trieへの挿入
17.5.1 コード実装:trieの挿入
17.6 自動補完の構築
17.6.1 全単語を集める
17.6.2 再帰の効果をみる
17.7 自動補完が完成する
17.8 値をもったtrie:よりよい自動補完
17.9 まとめ
17.10 練習問題
18. すべてをグラフで連結する
18.1 グラフ
18.1.1 グラフと木の比較
18.1.2 グラフの用語
18.1.3 基本的なグラフの実装
18.2 有向グラフ
18.3 オブジェクト指向によるグラフの実装
18.4 グラフ探索
18.5 深さ優先探索
18.5.1 深さ優先探索の効果をみる
18.5.2 コード実装:深さ優先探索
18.6 幅優先探索
18.6.1 幅優先探索の効果をみる
18.6.2 コード実装:幅優先探索
18.6.3 DFS対BFS
18.7 グラフ探索の効率
18.7.1 O(V+E)
18.8 重み付きグラフ
18.8.1 重み付きグラフのコード
18.8.2 最短経路問題
18.9 ダイクストラのアルゴリズム
18.9.1 ダイクストラのアルゴリズムのセットアップ
18.9.2 ダイクストラのアルゴリズムのステップ
18.9.3 ダイクストラのアルゴリズムの効果をみる
18.9.4 最短経路を求める
18.9.5 コード実装:ダイクストラのアルゴリズム
18.9.6 ダイクストラのアルゴリズムの性能
18.10 まとめ
18.11 練習問題
19. メモリ制約を扱う
19.1 空間計算量のO表記
19.2 時間と空間のトレードオフ
19.3 再帰の隠れコスト
19.4 まとめ
19.5 練習問題
20. コード最適化の技法
20.1 前提条件:現在のO表記の決定
20.2 出発点:想定しうる最良のO表記
20.2.1 想像を広げる
20.3 マジック検索
20.3.1 著者のマジック検索
20.3.2 追加データ構造を持ち込む
20.3.3 2つの和問題
20.4 パターンの認識
20.4.1 コインゲーム
20.4.2 例を作り出す
20.4.3 和の入れ替え問題
20.5 貪欲アルゴリズム
20.5.1 配列の最大値
20.5.2 部分区画の和の最大値
20.5.3 貪欲な株価予想
20.6 データ構造の変更
20.6.1 アナグラムチェッカー
20.6.2 グループの整列
20.7 まとめ
20.8 終わりに
20.9 練習問題
A. 練習問題の解答
索 引