2020-06-14 課題¶
- コンテンツの案内ページ
- GitHub へのリンク
- matplotlib を忘れないように、簡単なグラフをいくつか描いてみてください。
- TeX でいろいろな式を書いてみましょう。
- 実際に競プロの問題をいくつか解いてみましょう。まずは Beginners' selection をやっていきます。
- 今回は ABC081B と ABC086C (最後の難しめの問題)をやってみましょう。
- Pythonで10問解いてみた記事もあるので参考にしてください。
- 他にもここのページを一通り眺めてみてください。
自分用メモ¶
- 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
- 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
- https://atcoder.jp/contests/apg4b
- C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
- Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
- https://atcoder.jp/contests/apg4b
- 文と式の説明
- IT 基礎知識みたいなやつ
- 数値計算に関わるクラス・オブジェクトの説明
- まずは辞書・構造体の拡大版として導入するか?
- 変な誤解を生まないような書き方を考える
- 遅延型方程式に対するコメント追加
- import に関する実演
- matplotlib のチュートリアルを読もうの会
- matplotlib 回では実際に matplotlib のチュートリアルを読もう
- 公式情報に触れる重要性
- 古い情報が古いと書いてあったりする:たとえば
pylab
- Gallery
- 見ていて面白い
- 「どこをいじるとどう変わるか」が視覚的にわかる
- 公式情報なのできちんとアップデートしてくれている(はず)
- 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
- Jupyter (IPython)でのはまりどころ解説を作ろう
- いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
- 「セルを上から順に読み込まないと動かない」問題の原因
- カーネル再起動まで変数は残り続ける
Matplotlib¶
- とりあえず本当に簡単な図を描く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 |
|
勉強ネタ紹介¶
- 前回も言ったように、自分に合った、楽しめるネタを探す必要がある
- 勉強しなければいけないことと、やっていて楽しめること・長続きすることが一致しないこともよくある
- 教材がある事案
- 統計学 100 本ノック系:本もある
- 自然言語処理 100 本ノック系:例えばこのページ
- 離散数学:The Haskell Road To Logic, Maths And Programming
- Project Euler
- 最近の私の趣味と実益を兼ねた対象がデータ構造とアルゴリズムなので、ここでもその辺を試してみている
- 例えば上の中でも興味のあるネタがあればそれは取り上げるので、要望があれば挙げてほしい。
- 自然言語処理の UNIX コマンドとか
競プロを 2 題解いてみる¶
- https://qiita.com/KoyanagiHitoshi/items/c5e82841b8d0f750851d の 3 題目と最後の問題
- AOJ も勉強用にお勧め
- 素因数分解など数学ネタもある
- これをもとにした本もある
- 言語が C/C++ なのが難点といえば難点
- C/C++ の方が低レイヤーを意識しやすくなる利点はある
- 最近は Python によるデータ構造とアルゴリズムの本も出ているし、ネット上に資料もある
ABC081B、Shift only¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 |
|
Python の all
¶
Pythonでリストやタプルなどのイテラブルオブジェクトの要素がすべてTrue(真)か、いずれか一つでもTrueか、あるいは、すべてFalse(偽)かを判定するには組み込み関数all(), any()を使う。
1 2 |
|
1 2 |
|
ABC086C、Traveling¶
- 止まれない条件
- 止まってよければ問題は簡単:時間に関する制約だけでいい
- 非現実的な問題設定にしたおかげで難しくなっている
- cf. たいていの場合は現実が難しすぎるから簡単にした問題を解く
- 「距離」
- 京都・札幌・マンハッタンのような碁盤目状に道が整備された街での 2 点間の距離をどう測るといいか?
- 普通の2点間の距離(ユークリッド距離)$\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}$ では不適切。
- $|x_1 - x_2| + |x_1 - x_2|$ で測る方が適切。
- 機械学習でも $L^1$ 正則化などで出てくる。
- 情報系(?)だとマンハッタン距離と呼ぶ。
- 数学では $L^1$ ノルムと呼ぶ。
- 一般には $L^p$ ノルムという概念がある
- 京都・札幌・マンハッタンのような碁盤目状に道が整備された街での 2 点間の距離をどう測るといいか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 |
|
1 2 3 4 5 6 7 8 |
|
現実的なスケジューリングの問題¶
- Google Map の経路探索
- Yahoo 路線情報などの経路探索
- 野球・サッカーなどの年間試合日程
- PASMO などでの運賃清算
PASMO などの運賃計算¶
- 論文が出るほどの問題
- 解説記事
- https://www.orsj.or.jp/~archive/pdf/j_mag/Vol.54_J_001.pdf
- https://www.seikei.ac.jp/university/rikou/pdf/JFST440213.pdf
- https://ci.nii.ac.jp/naid/110008913789
- 何が難しいか:乗車情報を使って東京の複雑な路線図から「最安運賃」を即座に計算させる
- 使える時間は 0.2 秒
- 運賃が高く計算されたら怒られる
- 安ければ文句がでない
- いくらでも変な経路がありうる
- 余計な枝をはじいて重要な部分だけ計算する
- どうやって:これがアルゴリズム研究
- ほぼ純粋なプログラムだけの問題
- テストの視点
- どんな始点・終点であっても問題なく動くか、プログラムを検証する問題もある
- 検証すべきパターンは $10^{40}$ 程度あるとか:解説記事
プロスポーツのスケジュール決定¶
- OR の研究課題
- 多数のステークホルダーの利害調整問題
- ドームなどはコンサートもある
- 著名アイドル・歌手の結成何周年イベントなどは「この時期、できれば第何週」というレベルで細かい指定が入る
- ドル箱はもちろん優先
- 春夏の甲子園の時期は高校野球に占拠される
- 各チームが過酷な移動スケジュールにならないような配慮
- 「九州から北海道に順に移動していき、逆順に移動していく」みたいな形だと移動の負担は少ない
- 必ずしもそううまくは組めない
- 長時間移動だけでも体力消費があり選手パフォーマンスに影響する
- 旅費もかさむ
- ドームなどはコンサートもある
- どうするか?
- これも組み合わせは膨大で、電車ほど激しくはないが短時間で計算させたい
- 最終的には人間の目も入れる必要があるだろう
- コンピューターにいくつか候補を計算させたい
- 適当にイベントと時期に重みづけ(ペナルティ)をつけて「一定程度以上ペナルティが積まれたスケジュールはもう考えない」といった工夫がいる
- いい感じのスケジュールにならなければパラメータ調整して再計算させたい
- このサイクルはなるべく早く回したい
- 高速計算の需要
- この辺は最近はやりの機械学習でもまさに同じような事情がある
プログラミングの一般論¶
- Web システムを例にした速度問題
- データ構造とアルゴリズム
- 連結リストと配列:どんな特性があるか?
- スタックとキュー:いつどこで使うか?どう実装するか?
web システムの事例¶
- 参考
- システムが重いというときどこにどんな原因があるか?
- ソシャゲでもよくある「障害発生」はどこでどう起こるか?
- どこかのサーバーが物理的に壊れることもある
- データ構造とアルゴリズム(いわゆる「プログラミング」)がかかわるのはどこか?
- web サーバーでの処理(プログラム)
- データベースの(インデックス)設計
- ソフトによる問題なら基本的にはどこにでもありうる
データ構造とアルゴリズム¶
- 鶏と卵で、同時に考えるべきテーマ:何かをするためにはどうデータを持ってどんな処理をすれば効率がいいか?
- 効率にもいろいろある
- 単純な処理速度・メモリ消費量・計算量
(連結)リストと配列¶
- 何が違うのか?
- メモリ上の配置やデータの「つなぎ方」
- 状況によって使い分ける
リストの特徴¶
- 要素数は変わることが前提
- データを(先頭に)追加するのは簡単
- データの削除も比較的簡単
- 先頭から 1 つずつ順に処理するならそれなり
- 検索やデータの書き換えが遅い:連結構造をたどる必要がある
配列の特徴¶
- 要素数は固定
- データの追加・削除が重め
- データの参照・書き換えが速い:アドレスが連続なので先頭さえわかれば「そこから何番先」と直指定できる
- 「リストで遅ければ配列で書き直す」みたいなことはよくある
ベクター(参考)¶
- 「要素数可変の配列」
- リストのように要素追加・削除が比較的低コストで、要素の参照・書き換えも配列のように速い
- 何が問題か:要素の追加が楽なように余計なメモリ領域を確保する
- ハードウェア組み込みプログラムのように、メモリがカツカツの状況では使えない
- 「メモリがカツカツ」という意味が理解できるか?