Table of Contents
アルゴリズム(2021年度)
本講義では情報科学の重要な基礎となっているアルゴリズムとデータ構造に関して学習します.具体的には,
- アルゴリズムとデータ構造に関する基礎知識を習得する
- Pythonを用いて代表的なアルゴリズム・データ構造を実装する
- 講義内で学習した内容を元に応用的なコーディング課題に取り組む
ことを目的としています.この講義を通して
- 代表的なアルゴリズムの考え方を理解する
- その考え方をコードに落とし込む力を養う
- 競技プログラミング等,様々なコーディング課題に取り組める知識を積み上げる
ことができるように授業が設計されています.
本授業はハイブリッド形式で実施する予定です. 講義はZoomにて配信する予定です.講義の配信動画を視聴するためには,インターネット環境,およびブラウザが必要です.なお,従量課金制による通信費がかからないよう,無料で使えるWifi環境がある場所や定額制のインターネット接続環境で視聴することを強く推奨します.
場所 | ハイブリッド形式で実施.教室:工学部2号館246講義室,オンライン:zoomミーティング |
---|---|
講義室にて受講を希望する方はモバイルアプリMOCHAで入室予約を行ってください. | |
時間 | 水曜日3限(13:00 - 14:45),ただし講義の動画,およびPDFは後からでも見ることが可能. |
講義担当者 | 相田 仁,矢谷 浩司 (koji “at-mark” iis-lab.org) |
TA | 鈴木 凌斗,役山 真柊 (algorithms “at-mark” iis-lab.org) |
ITC-LMS | https://itc-lms.ecc.u-tokyo.ac.jp/lms/course/online?idnumber=2021FEN-EE3d08L10F01 |
期末試験に関するアナウンス
期末試験の座席表はこちらにて公開してます.自分の学籍番号があることを確認してください.抜けている場合,至急矢谷に連絡をしてください.
講義スケジュール
講義配信用ZoomのURLは以下のドキュメントに記載します.ECCSアカウントでログインする必要があります.
講義終了後の録画を見るためのURLも上記ドキュメントに記載してありますので,授業後に確認してください(授業終了から数時間後には共有する予定です).
回 | 日程 | 講義内容 |
---|---|---|
#1 | 4/7 | イントロダクション,計算量 |
trackの利用方法 | ||
#2 | 4/14 | 累積和,整数関連 |
#3 | 4/21 | データ構造 |
#4 | 4/28 | 探索(サーチ) |
#5 | 5/12 | 文字列照合 |
#6 | 5/19 | 整列(ソート) |
#7 | 5/26 | 動的計画法1(基本のDP) |
#8 | 6/9 | 動的計画法2(いろいろなDP) |
#9 | 6/16 | BFS,DFS |
#10 | 6/23 | グラフアルゴリズム1(最短経路問題) |
#11 | 6/30 | グラフアルゴリズム2(最小全域木,トポロジカルソート) |
#12 | 7/7 | グラフアルゴリズム3(最大流問題,最小費用流問題,二部グラフのマッチング問題) |
#13 | 7/14 | 「難しい問題」とは,さいごに(録画にて事前に配信) |
7/14 14:00~ | SOMPOホールディングス株式会社 CDO 楢󠄀﨑浩一様 特別講演 「武器としてのアルゴリズム – DX or Die -」 | |
7/21 | 期末試験 13:00集合 自分の座席を確認した上で,指定されている教室に集合すること. |
講義を受講するにあたり
本講義を受講希望の方は以下のフォームより登録を行ってください.ECCSアカウントでログインしておく必要があります.また,単位習得のためにこの講義を受講する方はUTASでの登録を別途行ってください.
https://iis-lab.org/algorithms-entry
本講義を受講する場合,以下の知識,経験,および実験機器があることを想定しています.
- 基礎的なPythonに関するプログラミング技術がある.
- 電子情報工学科,電気電子工学科の授業でいえば,2年生冬学期のプログラミング基礎演習,ソフトウェア1・2あたりを受講し,理解できていればOKです.
- 基礎部分を補いたい方は,Pythonプログラミング入門もとても良いかと思います.
- trackでコーディングを行えるPC環境がある.OSに関しては問わない.ブラウザはChromeおよびFirefoxを推奨する.
- slackを使うことができる.講義内でアナウンスはこのホームページの他,slackでも行います.
- zoomを使うことができる.講義の配信はzoomにて行います.なお,ECCSアカウントが必要です.
教室入室の事前予約
本講義では,工学部2号館246教室でオフラインでの講義を行い,同時にオンラインでの配信を行います.246教室で受講を希望する方は,モバイルアプリMOCHAをご自身のスマートフォンにインストールし,事前に入室予約を行ってください.
事前に入室予約を行っていない方には,教室の混雑状況によってその場で退室をお願いすることがあります.どうぞよろしくお願い致します.
ECCSアカウント
本講義のオンラインでの受講にはECCSアカウント(xxxx@g.ecc.u-tokyo.ac.jp)が必須です.セットアップ後使用できるようになるまで少し時間がかかりますので,自分のアカウントの詳細がわからない,という人は以下の動画を確認し,講義開始までに準備をしておいてください.
https://www.youtube.com/watch?v=89_fjWDdzQ4&feature=youtu.be
成績評価
成績の評価は以下のように行います.
- コードチャレンジ基本課題(全24課題):36点
- 以下の2つの課題より選択:36点
- コードチャレンジExtra課題(全12課題)
- レポート課題(全2課題)
- 両方提出した場合には点数の高い方を成績に利用
- 期末試験(60〜75分程度を予定,対面で実施予定):28点
ただし,以下の制約に1つでも引っかかる場合,この講義の成績は「未受験」という扱いになります.もし,上記制約に引っかかる場合であっても自分の成績をつけてほしい場合は,個別に期末試験前日までに連絡をしてください.(もちろん成績は総得点によりますので,連絡をしたら必ず単位が来る,ということではありません.)
- コードチャレンジのうち,未着手のままの提出の回数が累積4回以上.
- Extra課題,レポート課題のどちらとも全て未提出.
- 期末試験を受験しなかった.
病欠,公欠等の理由により期限内の提出ができない場合,講義担当者へメールにて連絡をして,対応を相談してください.事前の相談がない場合は救済措置が難しいことをご承知おきください.
講義形式
この講義は毎回2つのパートに分かれています.
- スライドを使った講義パート
- trackを利用したコードチャレンジパート
この講義では両パートに積極的に参加することが求められています.
講義パートの配信方法
講義はZoom webinarを利用した配信します.授業開始5分前くらいからミーティングを開始させますので,準備ができ次第お入りください.
Zoom webinarでは,マイク・ビデオは無効化されています.質問等がある場合は,授業のslackでコメントをしてください.
授業のwebinarに接続できない場合,utacのアカウントでzoomにログインしていることを確認してください.以下の方法でzoomのクライアントアプリでログインを先に行ってから,接続をすると問題なくいくとはずですので,お試しください.
Zoomの通常のサインイン画面からサインインする方法(アプリからサインインする場合はこの方法です)
1. Zoomの通常のサインイン画面で,「SSO」または「SSOでサインイン」と書かれた文字を探して押してください.
・この画面のメールアドレス・パスワード欄にUTokyo Accountの情報を入力してもサインインできません.
2. 表示される画面によって手順が異なります.
・「会社のメール」という欄が表示されたら,[UTokyo Account] を入力してください.
・「会社のドメイン」という欄が表示されたら,u-tokyo-ac-jp と入力してください.
3. UTASなどと同じような東京大学のユーザ名とパスワードを入力する画面(安田講堂の画面)が出たら,UTokyo Account(10桁の共通ID)または xxxxxxxxxx@utac.u-tokyo.ac.jp の情報を入力してください
Q&A
授業中及びその後の授業内容に関する質問は,slackで行ってください.
/anonと打つと,匿名でメッセージを送ることができます.名前を出したくない場合は,その機能を使ってください.
また,講義担当者からは授業の理解度を図るために,授業中にslackで呼びかけを行いますので,リアクションしてもらえると嬉しいです.
レポート課題
成績のうち約1/3は,Extra課題を毎週提出するか,以下に示すレポート課題を期限までに提出することで与えられます.レポート課題を提出した上で,Extra課題を提出している方は,より点数の高い方を成績評価に利用します.
レポート課題の提出にはTurnitinを利用します.以下の提出方法を参考にして,期限内に提出をしてください. Turnitin以外での提出方法は認められません.
コードチャレンジ
本講義のコードチャレンジではtrackというシステムを使います.trackはオンライン上でプログラミングに関する学習を行ったり,指定された課題に対して自分のコードを提出したりすることが出来ます.またコーディング自体をブラウザ上でできるようになっているため,コーディングに必要な環境構築等を行う必要がありません.
本講義ではPython3を使用します.trackではPython3.6.1がサポートされています(2021年3月現在).それ以外の言語の使用は認めません.また,track以外のシステムを用いた課題提出も認めません.
コードチャレンジの種類
コードチャレンジには2種類あります.
- 基本課題: 講義内で紹介された擬似コードの実装や変更を行うもの.授業の内容をしっかり追えばできるようになっており,受講者のほぼ全員に出来てほしい課題.
- Extra課題:授業の内容を踏まえた発展的な課題.競技プログラミングとかにも出てくる内容を含んだ,頑張ればできる腕試し的課題.
基本課題はぜひしっかりと取り組み,解いてください.その上でExtra課題にも取り組んでもらえればと思います.Extra課題はレポート課題との選択肢気になっており,どちらか一方を提出していただければ問題ありません.Extra課題を提出した上でレポート課題を提出した場合は,より点数の高い方を成績評価に利用します.
コードチャレンジへの参加方法
講義パート終了後すぐ,google formにより登録していただいたメールアドレスに対して,trackからのメールを配信します.そのメールに該当する回の課題を行うページへのリンクが記載されています.track上でのコーディング・デバッグ方法,および課題提出方法はこちらのPDFを参照してください.
メールはnoreply@tracks.runより配信されますので,メールクライアント等においてフィルタリング機能を設定している場合には,このメールアドレスからのメールを受信できるように予め設定をしてください.また,アドブロッカーなどを使用していると,ブラウザ上でうまく表示できなかったり,エラーを起こしたりすることがあります.この場合には,アドブロッカーを一時的に停止させてみてください.
trackにおけるトラブルが発生した場合は,slackにてTAさんに連絡をしてください.
コードチャレンジの採点方法
コードチャレンジではいくつかのテストケースが予め設定されています.それらテストケースの通った数を元に,原則[配点]*[テストケース合格率]で点数を計算します.採点に特別な扱いがある場合には,その旨を問題文に記します.
頻繁にテストケースを実行し,デバッグを行ってください.これにより提出間際でのミスを防ぐことができる他,コードが自動保存されるので,万が一提出作業を行えなくても,最終保存されたコードを元に採点が行われます.
採点は最終提出物に対してのみ行われます.したがって,途中でどれだけミスをしていてもペナルティはありません.また,提出までにかかった時間の長短は採点に考慮されません.
Extra課題に関しては提出されたコードに対して後日類似度チェック等を行い,明らかに類似したコードがあった場合は,その全てに対してペナルティを課します.基本課題に関してはほぼ同じようなコードになるはずですので,このルールを直接は適用しませんが,類似度チェックは行う予定です.
講義で使うシステムではコードをテストケースにかけた時点で,自動でバージョン管理します.コピペ等を行なった場合には,不自然にコード行数が増えたり,テストケースにパスする回数が突然増えたりするので,その辺りもチェックします.不自然な編集があった提出に関してはペナルティを適用することがありますので,十分気をつけてください.
コードチャレンジに取り組むにあたって
与えられた基本課題においては,入出力や問題文で指示がある場合を除き,実装すべき処理において標準ライブラリや問題で指定されていない外部の関数やライブラリ等を使用しないでください. そのような提出物はテストケースに合格していても,採点されませんで注意してください.Extra課題においては,適宜外部の関数等を使っても良いものとします.
コードチャレンジの課題によってはコードの一部分(コーディング画面の初期コードとは別のコード)があらかじめ与えられている場合があります. その場合,問題文に明記してありますので,指示に従ってください.
コードチャレンジの課題を見ながら,本やWeb上の情報を参考にすることは問題ありません.ただし,記載されているコードなどをそのまま使うことのないようにしてください.また,友達同士で教え合うのも積極的に行ってください(教えることができる,というのは十分に理解できている証拠でもあります).ただし,書いたコードを直接見せ合うのではなく,考え方だけを共有するようにしてください.
この講義で重要なのは,「自分で手を動かす」ことを大切にすることです.アルゴリズムやコーディングに自信がなくても,授業で紹介されている内容を理解し,努力すれば一定の評価につながるようになっていますので,後から誤解を招きかねない行為をしないようにお願いいたします.
提出物に対しては後日類似度チェックを行います.以下のような提出物は該当するものすべてに対して採点を取り消します.
- 提出物間でほぼ同一のコード
- Webや参考書に記載されているものとほぼ同一であることが判明したコード
- track上での課題取り組み時間(終了時刻 - 開始時刻)が極端に短い
- 与えられたテストケースに通るようにだけ設計されたコード
- その他,明らかに不正行為の証拠があるもの
悪質な場合にはより大きなペナルティになることがあります.十分気をつけてください.
自習のために
コードチャレンジの締め切り後はシステムの仕様上,提出したコードにアクセスすることができません.したがって,自分のコードを後で復習に使いたい方は提出前にローカルにコピーをしてください.
Extra課題に関しては,解答例と簡単な解説をその次の講義回にて共有します.基本課題は授業のスライドにある情報で実装できるようになっていますので,授業のスライドをよく確認してください.
病欠・公欠の申し出
以下の情報をメールにて,algorithms “at-mark” iis-lab.orgに送ってください.可能な限り事前に,事後でも速やかにお願いします.
- 病欠,公欠を希望する授業日
- 病欠,公欠の理由
- 理由が正当なものであることを裏付けるもの(診断書,処方箋,出席する学会のプログラム等のスキャンデータ,感染症に関係するホットラインへの相談記録)
認められた場合,課題提出期限をこちらが指定する日時まで延長します.
大きな怪我や病気などの例外を除き,病欠,公欠を希望する授業日から1週間以上を経過した場合は,認めないものとします.
Academic Misconduct
剽窃や不適切な引用,改竄などはAcademic Misconductとして重い処分を受けます.この講義ではコードチャレンジにおける提出物や,期末試験での答案における不正行為により不当に評価を得ようとする行為に対して特に厳重に処罰します.例えば,
- インターネット上にあるライブラリやサンプルのソースコードを引用することなく用いた,
- 他人が書いたソースコードを無断かつ引用なしに転用した,
- ほかの学生が書いた回答を盗み見て利用した.
などが挙げられます.特に重大なAcademic Misconductが発見された場合,その影響度の大きさに応じて以下の罰則を与えることになります.
- 不正が見つかった課題を不採点(0点扱い,既採点の場合は採点取り消し),
- 今までに提出されたすべての課題を不採点,
- 今までに提出されたすべての課題を不採点,かつ以降の課題提出を認めない.
レポートやソースコードは誤解の生じないように十分注意して作成・管理してください.
参考資料・文献
以下の書籍・リンクはこの講義の資料を作る際に参考にさせていただいたり,講義内容に関する大きな刺激を受けたものになります.以下に挙げているもの以外にも参考になる様々な情報がありますので,興味を持ったトピックに関して色々とご自身で調べていただければと思います.
- プログラミングコンテストチャレンジブック 第2版.秋葉拓哉,岩田陽一,北川宜稔.
- プログラミングコンテスト攻略のためのアルゴリズムとデータ構造.渡部有隆,Ozy,秋葉拓哉.
- 新・明解Pythonで学ぶアルゴリズムとデータ構造.柴田望洋.
- 問題解決力を鍛える!アルゴリズムとデータ構造.大槻兼資,秋葉拓哉.
- 累積和を何も考えずに書けるようにする!
- 二分探索をはじめからていねいに
- 二分探索アルゴリズムを一般化 〜 めぐる式二分探索法のススメ 〜
- ソートを極める! 〜 なぜソートを学ぶのか 〜
- 典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~.
- プログラミングコンテストでの動的計画法
- Candies [Educational DP Contest / DP まとめコンテスト M]
- Union-Find木の解説と例題
- 競技プロ的なアルゴリズムのスライドのまとめ
- Atcoder tags
- ICPC Challenge 実践的プログラミング (全学自由研究ゼミナール)
またpythonの基礎の学習には様々なオンラインコースがありますので,それを活用することをおすすめします.
Q&A
ここでは講義中に出た講義に関係する質問とその返答を取り上げています.
講義に関して
- 数学2Dの演習の授業も同じ曜限に開講されていて、どちらも履修したいのですがそれは可能でしょうか?
- 残念ながら認められません.EEICでは情報よりの興味をお持ちであれば「数学2G+アルゴリズム」を取れるように授業が設計されていますので,ぜひご検討ください.
- 他学部,もしくは他学科の学生ですが単位取得のために講義を受講することは可能ですか?
- 大学院生ですが単位取得のために講義を受講することは可能ですか?
- 所属する研究科,専攻に卒業要件としての単位取得が可能かどうかを確認した上で,UTASでの登録をしてください.
コードチャレンジに関して
- スライドとは違うアルゴリズムで提出してしまったのですが減点等はありますか?
- スライドや問題文の指定と違うアルゴリズムで提出した場合は,テストケースに通っていても採点されないことがありますので,問題文の指示をよくお読みください.
- 聞き逃したかもしれないのですが、採点結果はITC-LMSなどで見れますか?
- 採点は[配点]*[テストケース合格率]が原則ですので,それで自分の点数がわかります.採点を取り消すケースなどが発生する場合は個別に連絡します.
- 採点のフィードバックはありますか
- 私達からの個別のフィードバックはこの講義のサイズでは難しいので,テストケースに通ったかどうかが一応のフィードバックになるようにしてます.
- 課題を終えるまでにかかった時間は評価に入りますか?
- 考慮しません.
- 翌週に模範解答的なものは公開されますか
- はい.Extra課題に関しては公開予定です.
- 課題についてWEB上のコードを参照して、そっくりじゃなくても似ているコードはいけませんか?
- 自分自身で咀嚼した上で書いたコードだと判断してよいと第三者が見て言えるレベルにしてもらえればと思います.
- dequeやheapqなどは使用しない方が良いということでしょうか?
- 基本課題ではその類のものは使用できません.またExtra課題であっても,既存のライブラリの効率性に依存する提出(もしそのライブラリを使わないコードに書き換えた場合,テストケースに通らないことが予想される提出物)は減点の対象となります.
trackに関して
- ネットワーク接続(コンテンツサーバー)の異常で受験できません
- adblock解除で接続できた報告がありましたので,試してみてください.それでもエラーが出る場合はこちらに連絡をください.
- テスト実行で一度保存すればブラウザを一度閉じてもコードが保存されるということでしょうか
- はい.そうです.不安ならローカルにコピーしておいてください.
- SyntaxError: Non-ASCII character ‘\xe3’ in file main.py on line 4, but no encoding declared というエラーが出る
- どこかに日本語が入っているためだと考えられます. # coding: UTF-8を入れるといけるはずです.
- 「解答を完了」したあと、「試験を提出する」を押さないと、採点されなかったりますか?前回は「試験を提出する」を押し忘れたようなきがするのですが
- 期限が来ると自動で提出はされますが,押してもらうほうが確実です.
- デフォルトで書いてあるコードは、特に気にしなくていいものですか?それとも理解しないといけない内容が書かれていますか?
- 気にしなくてよいです.このコードを利用せずに提出しても問題ありません.
- sys.stdin やdefを使わずに、inputなどだけを用いて提出したのですが(テストケースには正解)、それでもよかったでしょうか
- 問題ありません.デフォルトのテンプレートを消した上で,提出してもらって問題ありません.
- Ctrl+sでテスト実行されました
- こちらも便利ですね!
- 後から復習できるようにtrack上の問題文をローカルに保存する方法はありますか?
- とりあえずwebページをPDFとかに保存してもらえればと思います.(何かしらの方法で公開できないか検討中)
- コードを初めからやり直したいときにリセットする方法はありますか?
- 右上の歯車のところにテスト環境を初期化というボタンがあります.
コーディング中のエラーに関して
- Command terminated by Signal 9というエラーが出ます.
- 多くの場合,メモリ制限に引っかかっているものと考えられます.どこか効率的でないメモリの使い方をしていないか,確認してみてください.
- Command terminated by Signal 11というエラーが出ます.
- もし再帰を使っている場合は,以下のようにして再帰回数の上限とスタック領域を拡大してみてください.
import sys
import resource
resource.setrlimit(resource.RLIMIT_STACK, (-1, -1)) # スタック領域を拡大
sys.setrecursionlimit(1000000) # 再帰回数の上限を拡大