Transcript
Page 1: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

1 KYOTO UNIVERSITY

KYOTO UNIVERSITY

DEPARTMENT OF INTELLIGENCE SCIENCE

AND TECHNOLOGY

アルゎリズムずデヌタ構造①抂芁

鹿島久嗣蚈算機科孊コヌス

https://bit.ly/2mM5P9H

Page 2: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

2 KYOTO UNIVERSITY

▪担圓教員鹿島久嗣工孊郚情報孊科蚈算機科孊コヌス

–連絡先 [email protected]

▪サポヌトペヌゞhttps://bit.ly/2mM5P9H

▪評䟡方法2回のテストの総合点

–䞭間テスト12/2(月)

–期末テスト1/27(月)#未確定

–出垭点なし

講矩に぀いおの情報:䞭間テスト日皋に泚意せよ

Page 3: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

3 KYOTO UNIVERSITY

▪基本

杉原厚吉 「デヌタ構造ずアルゎリズム」共立出版

–本講矩の倚くの内容はこの本に䟝る

–ずおも読みやすい

▪より高床な内容Cormen, Leiserson, Rivest, & Stein 「Introduction to Algorithms」

–翻蚳「アルゎリズムむントロダクション」近代科孊瀟

–講矩内容は郚分的に参照

参考曞:暙準的なものであればなんでもよい

Page 4: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

4 KYOTO UNIVERSITY

1. 算法ずは・算法の良さの枬り方アルゎリズムずデヌタ構造、蚈算のモデル、蚈算耇雑床、 

2. 基本算法挿入、削陀、敎列、怜玢、 

3. 基本デヌタ構造リスト、スタック、キュヌ、ヒヌプ、 

4. 算法の基本蚭蚈法再垰、分割統治、動的蚈画、 

5. 探玢二分探玢、ハッシュ、 

内容前半:アルゎリズムの基本的な抂念、評䟡法、基本的な道具

Page 5: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

5 KYOTO UNIVERSITY

6. グラフ算法深さ・幅優先探玢、最短路、最倧流

7. 蚈算耇雑床PずNP、NP完党、NP困難

8. 難しい問題の解き方分枝限定法、貪欲法

9. 発展的話題近䌌アルゎリズム、オンラむンアルゎリズム

内容埌半:グラフ・蚈算量・難しい問題ぞの察凊法

※倉曎・远加の可胜性あり

Page 6: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

6 KYOTO UNIVERSITY

アルゎリズムずデヌタ構造は

Page 7: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

7 KYOTO UNIVERSITY

▪プログラムの良し悪しずは

–正しく動く想定したように動く

–速く動くプログラムは速いほど良い

–省資源メモリや電気代

–䟋お店の顧客管理

▪特定のプログラム蚀語やハヌドりェアずはなるべく独立に

–プログラムの良し悪しを枬りたい

–ひいおは良いプログラムを曞きたい

動機:「良い」プログラムを曞きたい

Page 8: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

8 KYOTO UNIVERSITY

▪アルゎリズムalgorithmずは

–プログラム蚀語CやPythonなどやハヌドりェアCPUやメモリなどずは別に、どのような手続きを衚珟しようずするかずいう「問題の解き方の手順曞」

–もうすこし厳密にいうず、「䞎えられた問題を解くための機械的操䜜からなる、有限の手続き」

•機械的操䜜四則挔算やゞャンプなど•かならず有限ステップで終わるべし

↕•手続きprocedure有限ステップでの終了が保蚌されない

アルゎリズム:䞎えられた問題を解くための有限の手続き

Page 9: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

9 KYOTO UNIVERSITY

▪倚くのプログラムは「デヌタ」を扱う

–デヌタは繰り返し䜿甚するもの

–䜿甚の仕方が予め決められおいるわけではない

▪アルゎリズムがうたく動くためには、デヌタをどのようにもっおおくかデヌタ構造が重芁

–名前を、入力順に栌玍アむり゚オ順

▪デヌタ構造はアルゎリズムず切り離せないもの

–お互いの良さに圱響を䞎え合う

デヌタ構造:デヌタを管理し、アルゎリズムを効率化する

Page 10: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

10 KYOTO UNIVERSITY

▪問題べき乗蚈算

–入力 2぀の正敎数 𝑎 ず 𝑛

–出力𝑎𝑛

–仮定蚱されるのは四則挔算のみずする

いきなり𝑛乗するのはダメ

▪四則挔算が䜕回必芁か

アルゎリズムの䟋:指数挔算のアルゎリズム

Page 11: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

11 KYOTO UNIVERSITY

▪𝑎𝑛 = ((
 (((𝑎 × 𝑎) × 𝑎) × ⋯) × 𝑎)で蚈算

▪𝑛 − 1回の掛け算でできる

指数挔算のアルゎリズム①:単玔な掛け算の繰り返しによる解法は効率が悪い

Page 12: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

12 KYOTO UNIVERSITY

▪𝑘 = log2𝑛回の掛け算でできる

–仮定 𝑛 = 2𝑘

▪なお、 𝑛 ≠ 2𝑘の堎合も3log2𝑛回の挔算で可胜

– 𝑛を2進衚珟するlog2𝑛回の割り算

•䟋 𝑛 = 22 = 10110

– 1が立っおいる桁数に察し2の冪を求めるlog2𝑛回の掛け算

–すべお足すlog2𝑛回の足し算

指数挔算のアルゎリズム②:ちょっず工倫するず、各段に高速化できる

Page 13: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

13 KYOTO UNIVERSITY

▪𝑛 = 1024 = 210のずき、掛け算の回数は

–① 1023回倧䜓 𝑛回

–② 10回倧䜓 log 𝑛回

アルゎリズムの重芁性:アルゎリズムの工倫で蚈算効率に倧きな差が生じる

Page 14: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

14 KYOTO UNIVERSITY

▪前のアルゎリズムの䟋では1回の蚈算のみを察象ずしおいた

▪デヌタに察しお繰り返し蚈算を行う堎合には、予めデヌタを凊理しおうたい構造デヌタ構造を䜜るこずで、その埌の蚈算を高速に行えるようになるこずがある

▪䟋えば、 𝑆回蚈算するずしお

① 1回分の蚈算時間 × 𝑆回

② デヌタ構造の構築にかかる蚈算時間 +デヌタ構造を利甚した1回分の蚈算時間 × 𝑆

で①② ずなる堎合にはデヌタ構造を考えるこずが有効

デヌタ構造の䟋:デヌタに察しお繰り返し操䜜を行う堎合に重芁

Page 15: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

15 KYOTO UNIVERSITY

▪𝑛人の顧客情報 𝑛𝑖 , 𝑝𝑖 𝑖=1,
,𝑛が茉った名簿を考える

– 𝑛𝑖名前、 𝑝𝑖情報

–䟋 (元田䞭将倧, [email protected])

▪客が来るたびに名前を聞いお入力するず、その人の情報が埗られるシステムを考える

–𝑆人分の問い合わせ𝑛𝑘1 , 𝑛𝑘2 , 
 , 𝑛𝑘𝑆が順に䞎えられる

–それぞれに察しお 𝑝𝑘𝑗 を返す

具䜓的な問題䟋:店舗における顧客情報管理システム

Page 16: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

16 KYOTO UNIVERSITY

▪名簿の䞊び順が登録順でたらめの堎合を考える

▪アルゎリズムずしおは、前から順に探しおいく

▪この堎合、各問い合わせで、最悪𝑛回のチェックが必芁

–名簿䞊の䜍眮ペヌゞを指定しおチェックするこずは単䜍時間でできるものずする

▪合蚈玄 𝑛𝑆回のチェックが最悪ケヌスで必芁ずなる

単玔なアルゎリズム䞊び順がでたらめな堎合は最悪で玄𝑛𝑆回のチェックが必芁

Page 17: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

17 KYOTO UNIVERSITY

▪予め名簿を蟞曞順に䞊べおおくずする

▪問い合わせ名を名簿の「ほが真ん䞭」の人の名前ず比范

–前者が蟞曞順で前ならば、目的の人は名簿の前半分にいるはず

–今埌は前半分だけを調べればよい

–こんどは前半分の「ほが真ん䞭」の人ず比范

–・・・

–最倧でも、蚈𝑆 log 𝑛回のチェックで可胜

ちょっず頭を䜿ったアルゎリズム蟞曞順に䞊んでいる堎合は𝑆 log 𝑛回のチェックで可胜

Page 18: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

18 KYOTO UNIVERSITY

▪蚈𝑆 log 𝑛回のチェックで発芋可胜

ちょっず頭を䜿ったアルゎリズム蟞曞順に䞊んでいる堎合は𝑆 log 𝑛回のチェックで可胜

Page 19: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

19 KYOTO UNIVERSITY

▪「デヌタをどのように管理するか」デヌタ構造

▪賢いほうのアルゎリズムのの恩恵にあずかるにはデヌタが予め敎列゜ヌトされおいる必芁がある

–䞀般に敎列は 𝑛 log 𝑛 回に比䟋する挔算回数が必芁

▪よっお① 𝑛 𝑆 ず② 𝑛 log 𝑛 + 𝑆 log 𝑛の比范

– 𝑆 が倧きくなるず②の方がお埗になっおくる

デヌタ構造の重芁性:デヌタを正しく持぀こずで蚈算コストが倧きく削枛される

𝑛 log 𝑛

𝑛−log 𝑛

𝑛

Page 20: memo - GitHub Pages–𝑛を2進衚珟するlog2 𝑛回の割り算 •䟋𝑛=22=10110 –1が立っおいる桁数に察し2の冪を求める ... memo Author kashima

20 KYOTO UNIVERSITY

▪アルゎリズムは゜フトハヌドにあたり䟝存しない、蚈算機による問題解決の手順曞

▪デヌタ構造は、デヌタの管理を行うアルゎリズム

▪いずれも賢く蚭蚈するず、すごく埗する賢くやらないず、すごく損する

たずめ:アルゎリズムずデヌタ構造を孊ぶ意矩


Recommended