雑に読む「問題解決力を鍛える!アルゴリズムとデータ構造」
問題解決力を鍛える!アルゴリズムとデータ構造を雑に読む
雑に読む「達人に学ぶDB設計徹底指南書」にインスパイアされた
2020
https://bookclub.kodansha.co.jp/product?item=0000275430
注意:章末問題の回答が書いてある可能性があります(あっている保証はないです)
目標基素.icon
何日かに1回読む
コードはマネでもいいから書く
本書はC++になっているけどGoかTypeScriptで書こうかな。
Wandboxとかを使えば、C++でも環境構築なしに試せるtakker.icon
実例大事
使えないと意味ない(過激派)
https://github.com/drken1215/book_algorithm_solution
著者の補足資料
アルゴ式というサイトは、この本をベースに問題を作成しているlsajfk.icon
アルゴ式
著者らの立ち上げた会社だ基素.icon
目次
前書き
アルゴリズム設計技法を大切にしている本らしい基素.icon
1,2で準備して、3-7はいきなりこの本の核心である設計技法
https://gyazo.com/40d2a2766f3e4e16edaa0dff19cc0afc
理解を試す問題の難易度説明
星4(難しいが理解が格段に深まる)まで解けたらいいなー基素.icon
std::sort()の計算量がO(NlogN)であることが仕様として保証されていること (p.14). Kindle 版.
Goだとどうなるの?基素.icon
Go 標準のソート・アルゴリズム
基本はクイックソートで平均O(nlogn)
std::sort()の計算量は平均の話?
「平均が」と書いてない本の側が悪いnishio.icon
最悪ケースでどうかを議論したりすることもある
本書での「計算量」は最悪時間計算量らしい(後から出てくる)けどここは違うのかも基素.icon
雑に読む「問題解決力を鍛える!アルゴリズムとデータ構造」#63f79f36774b1700008f17c6
クイックソートの最悪計算量はO(N^2)の気がするけどなぁnishio.icon
雑読「問題解決力を鍛える!アルゴリズムとデータ構造」:1章 アルゴリズムとは
雑読「問題解決力を鍛える!アルゴリズムとデータ構造」:2章 計算量とオーダー記法
3章 設計技法(1):全探索
3.1 全探索を学ぶ意義
遅くてもNが十分小さいなら実用できる
問題が深く理解できて高速なアルゴリズム設計に結びつく
どうしたら全ての場合を考慮し尽くせるかを検討するのは有効
3.2 全探索(1):線形探索法
3.3 線形探索法の応用
3.4 全探索(2):ペアの全探索
3.5 全探索(3):組合せの全探索
3.6 まとめ
4章 設計技法(2):再帰と分割統治法
4.1 再帰とは
4.2 再帰の例(1):ユークリッドの互除法
4.3 再帰の例(2):フィボナッチ数列
4.4 メモ化して動的計画法へ
4.5 再帰の例(3):再帰関数を用いた全探索
4.6 分割統治法
4.7 まとめ
5章 設計技法(3):動的計画法
よく見るやつ基素.icon
O(NP) algorithmで文字列比較に対して適用したやつを触ったけど、一般的に動的計画法が何なのかはよく分からなかったtakker.icon
過去の計算結果を利用して全体の計算量を減らす系のアルゴリズムの多くに動的計画法って名前がついてるので一般的に説明しづらいnishio.icon
対象が文字列だろうがグラフだろうが点群だろうが動的計画法は使われうる、抽象度の高い概念
5.1 動的計画法とは
5.2 最初の例題
5.3 動的計画法に関連する諸概念
5.4 動的計画法の例(1):ナップサック問題
5.5 動的計画法の例(2):編集距離
5.6 動的計画法の例(3):区間分割の仕方を最適化
5.7 まとめ
6章 設計技法(4):二分探索法
6.1 配列の二分探索
6.2 C++のstd::lower bound()
6.3 一般化した二分探索法
6.4 さらに一般化した二分探索法
6.5 応用例(1):年齢当てゲーム
6.6 応用例(2):std::lower bound() の活用例
6.7 応用例(3):最適化問題を判定問題に
6.8 応用例(4):メディアンを求める
6.9 まとめ
7章 設計技法(5):貪欲法
7.1 貪欲法とは
7.2 貪欲法が最適解を導くとは限らないこと
7.3 貪欲法パターン(1):交換しても悪化しない
7.4 貪欲法パターン(2):現在がよいほど未来もよい
7.5 まとめ
8章 データ構造(1):配列、連結リスト、ハッシュテーブル
8.1 データ構造を学ぶ意義
8.2 配列
8.3 連結リスト
8.4 連結リストの挿入操作と削除操作
8.5 配列と連結リストの比較
8.6 ハッシュテーブル
8.7 まとめ
9章 データ構造(2):スタックとキュー
9.1 スタックとキューの概念
9.2 スタックとキューの動作と実装
9.3 まとめ
10章 データ構造(3):グラフと木
10.1 グラフ
10.2 グラフの例
10.3 グラフの実装
10.4 重み付きグラフの実装
10.5 木
10.6 順序木と二分木
10.7 二分木を用いるデータ構造の例(1):ヒープ
10.8 二分木を用いるデータ構造の例(2):二分探索木
10.9 まとめ
11章 データ構造(4):Union-Find
11.1 Union-Findとは
11.2 Union-Findの仕組み
11.3 Union-Findの計算量を削減する工夫
11.4 Union-Findの工夫その1:union by size
11.5 Union-Findの工夫その2:経路圧縮
11.6 Union-Findの実装
11.7 Union-Findの応用:グラフの連結成分の個数
11.8 まとめ
12章 ソート
12.1 ソートとは
12.2 ソートアルゴリズムの良し悪し
https://youtu.be/QJcU7jO5HZ8
ソートして返すAPIがソートしなくなったら高速化した話
12.3 ソート(1):挿入ソート
12.4 ソート(2):マージソート
12.5 ソート(3):クイックソート
例: クイックソートのアルゴリズムを書いてください。
クイックソートの時間計算量は何ですか?
どのようなときに平均計算量になりますか?
どのようなときに最悪計算量になりますか?
ピボットはどのように選びますか?
再帰をする場合、どのようなことに気を付けますか?
定数倍高速化したい場合、どのような工夫をしますか?
https://nodchip.hatenadiary.org/entry/2023/03/03/205125#Google-でのお仕事
12.6 ソート(4):ヒープソート
12.7 ソートの計算量の下界
12.8 ソート(5):バケットソート
12.9 まとめ
13章 グラフ(1):グラフ探索
13.1 グラフ探索を学ぶ意義
13.2 深さ優先探索と幅優先探索
13.3 再帰関数を用いる深さ優先探索
13.4 「行きがけ順」と「帰りがけ順」
13.5 最短路アルゴリズムとしての幅優先探索
13.6 深さ優先探索と幅優先探索の計算量
13.7 グラフ探索例(1):s-tパスを求める
13.8 グラフ探索例(2):二部グラフ判定
13.9 グラフ探索例(3):トポロジカルソート
13.10 グラフ探索例(4):木上の動的計画法
13.11 まとめ
14章 グラフ(2):最短路問題
14.1 最短路問題とは
14.2 最短路問題の整理
14.3 緩和
14.4 DAG上の最短路問題:動的計画法
14.5 単一始点最短路問題:ベルマン・フォード法
14.6 単一始点最短路問題:ダイクストラ法
14.7 全点対間最短路問題:フロイド・ワーシャル法
14.8 参考:ポテンシャルと差分制約系
14.9 まとめ
15章 グラフ(3):最小全域木問題
15.1 最小全域木問題とは
15.2 クラスカル法
15.3 クラスカル法の実装
15.4 全域木の構造
15.5 クラスカル法の正当性
15.6 まとめ
16章 グラフ(4):ネットワークフロー
16.1 ネットワークフローを学ぶ意義
16.2 グラフの連結度
16.3 最大流問題と最小カット問題
16.4 フォード・ファルカーソン法の実装
16.5 応用例(1):二部マッチング
16.6 応用例(2):点連結度
16.7 応用例(3):プロジェクト選択問題
16.8 まとめ
17章 PとNP
17.1 問題の難しさの測り方
17.2 PとNP
17.3 P ≠ NP予想
17.4 NP完全
17.5 多項式時間帰着の例
17.6 NP困難
17.7 停止性問題
17.8 まとめ
18章 難問対策
これは何?基素.icon
競プロ対策とか?takker.icon
いやこれ競プロに出せない系ではnishio.icon
18.1 NP困難問題との対峙
18.2 特殊ケースで解ける場合
18.3 貪欲法
18.4 局所探索と焼きなまし法
18.5 分枝限定法
18.6 整数計画問題への定式化
18.7 近似アルゴリズム
18.8 まとめ
この本が終わったら
アルゴリズムイントロダクション 第3版 総合版とか?
辞書だなぁ基素.icon
アルゴリズム体操
なにこれ?w基素.icon