1. はじめに
お久しぶりです! けんちょんです。
これまで 3 年間にわたって、Qiita に、アルゴリズムに関するさまざまな話題を投稿し続けてきました:
- アルゴリズムとは何か!?
- 計算量オーダーの求め方を総整理!
- 動的計画法超入門!
- 再帰関数を学ぶと、どんな世界が広がるか
- スタックとキューを極める!
- ソートを極める!
- DFS (深さ優先探索) 超入門!
- 実世界で超頻出!二部マッチングの解法を総整理!
このたび、それらの記事を有機的にまとめ上げ、さらに多数のトピックを追加する形で、アルゴリズム入門書を上梓させていただくことになりました!
発売予定日は 2020/9/30 となっています。講談社サイエンティフィク様からの発売となります。今回の記事では、この本を通してお届けしたいメッセージや、想定読者、内容などについて簡単に紹介させていただきます。
2. 本書の内容と対象読者
2-1. 本書の内容
まだ発売前であることから、内容や難易度について、疑問が当然生まれてくることと思います。章構成はざっくり以下の感じです。
まず、1, 2 章でアルゴリズムと計算量について解説します。そして、3〜7 章が、早くも本書のメインパートといえる部分であり、「アルゴリズムの設計技法」について詳しく解説します。
これらの設計技法に関する話題は、多くの書籍では、最後の方で簡単に説明するのみにとどめています。しかし本書は、現実世界の問題を解決するための「実践的なアルゴリズム設計技法の鍛錬」を目指しています。そこで、アルゴリズム設計技法について前半で詳しく解説する構成としました。そして、これらの設計技法が後半の章でも随所に使われていくことを示していきます!
その後、以下のテーマを順に解説していきます!
章 | テーマ | 備考 |
---|---|---|
8〜11 章 | データ構造 | 設計したアルゴリズムを効果的に実現するために! |
12 章 | ソート | ソートを通して、さまざまなアルゴリズム設計技法を学びます |
13〜16 章 | グラフ | 世の中の問題は、グラフの問題ととらえることで見通しよく解決できるものも多いです! |
最後に、17 章で PとNPに関する話題を解説し、世の中には「効率的に解くアルゴリズムを設計することができそうにない難問」が多数あることを見ます。18 章で、これらの難問に取り組むための方法論をまとめます。
競プロをやっている方向け
扱っている題材の難易度については、こんな感じのイメージです!
難易度が近い螺旋本は、スタンスが異なる部分もありますので、よい形で共存できたら、という想いです。
- 螺旋本と比べると、「動的計画法」「貪欲法」「二分探索法」などの設計技法に関する話題をより重視しています
- 螺旋本は「ライブラリを揃えていく」という思想なので、設計技法よりもライブラリになるものを重視する立場です
- 本書では、紙面の都合で「計算幾何学」と「整数論」には触れられませんでしたが、これらは螺旋本には載っています
2-2. 本書の対象読者
本書は、「アルゴリズムを自分の道具としたい」という想いを抱く、ほとんどすべての方に向けて執筆しました。
- 好奇心に溢れる、中学生・高校生の方
- 大学の講義の参考書として読み進めたい、大学生の方
- ソフトウェアエンジニアとしてステップアップしたい、社会人の方
- AtCoder などの競技プログラミングで、より良い成績をおさめたい方
- 「データ構造とアルゴリズム」という分野を、基礎から学び直したい方
- 企業などにおける研究開発に、アルゴリズム的視点を役立てたい方
など、さまざまなターゲット層を想定しています。ぜひ、手に取ってみてください。
3. 本書の目標
アルゴリズムに関する書籍はすでに多数発売されています。そんな中でも独自の価値を生み出すことができるよう、以下の目標の実現に向けてひたすら頑張りました!
- アルゴリズムを学びたいという、いかなる方の想いにも全力で応えたい!
- 実際のプログラミング言語で書かれた、C++ ソースコードを用いて解説する!
- 単なるアルゴリズム紹介では終わらない、アルゴリズムの使い方を説く!
- 初めてアルゴリズムを学ぶ方でも読めるよう、イラストを用いたわかりやすい説明を目指す!
- 難しい内容を曖昧にして誤魔化すことはしない、正確でしっかりとした内容を!
これらすべての達成を目指すことは、非常に困難でした。しかしながら、監修していただいた秋葉拓哉氏をはじめ、たくさんの方々にレビューしていただいたおかげで、納得のいく形を生み出すことができました。これからも、読者の方々の感想をお聞きして、さらに精進していきたい所存です。
4. アルゴリズムを学ぶということ
アルゴリズムとは一言で言えば「問題を解くための手順」です。以下の記事では、具体例とともに紹介しています。
最近は AtCoder への注目が集まっていることなどもあり、アルゴリズムの重要性が強く認識されるようになってきています。アルゴリズムを学ぶ意義は、人によってさまざまなものが考えられます。
- コンピュータ科学のあらゆる分野を学ぶうえでの、「重要な基礎」を磨く!
- 現実世界のさまざまな問題に取り組むうえでの、「問題解決方法の幅」を大きく広げる!
本書を執筆するにあたっては、1 つの信念がありました。それは「アルゴリズムは実際の問題の解決に活かしてナンボである」ということです。クイックソートといった、既存のアルゴリズムをわかりやすく解説するのみに終始せず、それらの数理をしっかりと解説し、動的計画法などのアルゴリズム技法を詳しく解説するように試みました。
私自身も、アルゴリズムを学びはじめてから、現実世界の問題に取り組む上での世界観に革命が起きたのを覚えています。アルゴリズムを学ぶ以前は、問題を解決するという行為を、高校数学における「公式」のようなものを与えることである、というイメージでとらえていました。つまり、その問題に対する解を具体的に得ることが問題解決だというイメージでした。しかしアルゴリズムを学んでからは、具体的な解を書き下すことができなくても、解を得るための「手順」を与えることができればよい、という見方ができるようになり、問題解決手段が大きく拡がりました!!
このような問題解決能力は、AI や IoT といった分野の流行に依らない、一生モノのスキルとなります。
5. おわりに
最後になりますが、本書を執筆するにあたっては、たくさんの方のお世話になりました。本当に本当に大変な試みでしたが、みなさんのおかげでなんとか形にすることができました。explicit にお世話になった方々については、本書の謝辞に述べさせていただいております。
ここでは、競プロコミュニティへの感謝を述べさせていただきたい気持ちです。本書は、これまで Qiita 上に蓄積してきたアルゴリズム執筆活動をまとめ上げることで生まれました。記事への感想を寄せていただいたり、疑問点を質問していただいたりしたおかげで、説明の仕方も洗練させることができました。そしてなにより、執筆のモチベーションを大きく支えていてだきました。
本書を通して、アルゴリズムを設計したり学んだりする面白さを少しでも実感していただけたならば、とても幸せな気持ちです。