Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
計算量オーダーの話
Search
tsuda.a
May 25, 2024
Programming
1
180
計算量オーダーの話
計算量オーダーについて説明してみました。
tsuda.a
May 25, 2024
Tweet
Share
More Decks by tsuda.a
See All by tsuda.a
NPUわからん
tsudaahr
0
62
クラウド初学者が抱える不安について
tsudaahr
0
98
キューとは何か
tsudaahr
0
110
等幅は死んだ(ぇ
tsudaahr
0
28
いくら眺めてもエラーの理由がわからないコードについて
tsudaahr
0
65
何のために文字数をカウントするのか?
tsudaahr
0
24
文字 is 何?
tsudaahr
0
49
16進数は何型
tsudaahr
0
4
全銀トラブルとC言語とバッファオーバーフロー
tsudaahr
0
25
Other Decks in Programming
See All in Programming
freee 技術の日 2024 Day1 進化していくシステムアーキテクチャ
usami
1
650
Exploring the OpenTelemetry Client Library for Go
akarin
0
260
freeeにおけるSecurity Championの仕事
otyamura
0
580
Make CPU #3 dalance
dalance
1
450
Goキャッシュライブラリgolang-lruをLet Read and Understand!!
taniyarn
2
180
エンジニア向け 株式会社バックテック 会社紹介資料 / for Engineers
backtech
1
390
앱 성능 영혼까지 끌어올리기
veronikapj
0
670
DroidKnights 2024 : Compose Material3 커스텀 디자인 시스템 구축기
kwondae
0
300
Table-driven testing に縛られないGoのテストパターン
abekoh
7
1.4k
Is Efficiency a Good Thing?
hollycummins
1
170
BigQueryとDataformとTROCCO®による事業グロース
nihemak
0
110
『改訂新版前処理大全』の話と Apache Parquet の話 #TokyoR
bob3bob3
0
170
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
What's in a price? How to price your products and services
michaelherold
238
11k
Building Applications with DynamoDB
mza
89
5.8k
The Cult of Friendly URLs
andyhume
74
5.8k
Large-scale JavaScript Application Architecture
addyosmani
505
110k
5 minutes of I Can Smell Your CMS
philhawksworth
199
19k
How to train your dragon (web standard)
notwaldorf
77
5.3k
Making Projects Easy
brettharned
110
5.6k
Principles of Awesome APIs and How to Build Them.
keavy
122
16k
Fashionably flexible responsive web design (full day workshop)
malarkey
399
65k
The MySQL Ecosystem @ GitHub 2015
samlambert
244
12k
Unsuck your backbone
ammeep
664
57k
Transcript
計算量オーダーの話 LTDD 2024-5 #2 中国地方DB勉強会 #1 @tsuda_ahr
最初に免責 • 概念的なわかりやすさ(?)を重視して、誇張した表現を多用しています。 • いやその表現、誇張を超えて嘘だよね、みたいなのもあります。-_-; • なので正しくはこうだ!みたいなものは、各自調査/発信してください(汗
情報処理技術者試験の問題例 (1) https://www.ipa.go.jp/shiken/mondai-kaiotu/ug65p90000002h5m-att/2012h24a_fe_am_qs.pdf • 平成24年秋の基本情報技術者試験 午前問題より
情報処理技術者試験の問題例 (2) • 令和6年春 応用情報技術者試験 午後問題 問3 より
O(n), O(n2) ってなんだ? • 計算量の指標 • データが n 件あったとき、何回計算するか?
O記法、と言う • ランダウの記号、とも言うらしい。 https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%82%A6%E3%81%AE%E8%A8%98%E5%8F%B7
たとえばこんなイメージ n=10 n=100 n=10000 O(1) 1回 1回 1回 O(n) 10回
100回 10000回 O(n2) 100回 10000回 1億回 O(log n) 4回 7回 14回 データの個数 計算回数 計算量 オーダー表記 O(n) O(n2) O(log n)
例1) 配列へのアクセス • 添え字を指定すれば一発でアクセスできるので、計算量オーダーは O(1) • 例)要素 5 のデータを参照したい 0
1 2 3 4 5 6 7 8 9 ・・・ AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII JJJJ
例2) 線形探索 • n 件あれば、n 回ループする可能性があるので、計算量オーダーは O(n) • 例) “HHHH”
を探したい (上の要素から順に探す) 0 1 2 3 4 5 6 7 8 9 ・・・ AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII JJJJ
ん?平均回数でみると、O(0.5n)になるのでは? • 係数部分は省略するらしいです。 • なので 0.000001n だろうと 10000000n だろうと O(n)
と表現する らしい。
例3) ソート(バブルソート) • 二重ループになるので、計算量オーダーは O(n2) n = len(body) for x
in range(0, n) : for y in range(1, n) : if (body[y - 1] > body[y]) : body[y - 1], body[y] = body[y], body[y - 1] 二重ループ Python によるコード例
ループのネストが増えると? • 三重ループだと O(n3), 四重ループだと O(n4)・・・という感じになってい きます。
log が出てくるケースは? • O(log n) とか O(n log n) とか書かれているのは何?
例4) 二分岐探索 • 二分岐探索について考えてみます。 注) 二分岐探索(Binary Tree)は、データベースでよくつかわれている B 木とは 違います。
前提 • HHHH を探したい。(=探索キー) • ただし、探索対象はソート済みとする。 • 探索対象は以下。 AAAA BBBB
CCCC DDDD EEEE FFFF GGGG HHHH 探索対象
探索方法 • まず真ん中あたりを決めて、そのデータと探索キーの大小を比較する。 • 小さければ前半を、大きければ後半を探す。 • それを一致するまで繰り返し行う。 AAAA BBBB CCCC
DDDD EEEE FFFF GGGG HHHH AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH 探索1回目 探索2回目 探索3回目 探索4回目
木構造で見るとこんな感じ • こういう木構造に見えるので「二分木」と呼ばれる AAAA BBBB CCCC DDDD EEEE FFFF GGGG
HHHH より小さい より大きい より小さい より小さい より大きい より大きい より大きい
探索回数は? • たとえばデータが 8 の場合、4 回の検索でたどりついた。 • 16 の場合は 5
回 • 32 の場合は 6 回 • 65536の場合は? →たぶん 17 回 • 16777216の場合は? →たぶん 25回 • ということは、n = 2x のデータに対して x + 1 回でたどり着いている。 • n から x を求めたい場合 x = log 2 (n) となる。
さてデータベースの場合 • 探索にかかる時間は、 • フルスキャン → O(n) • インデックススキャン →O(log
n) みたいな感じです。
つまり、 • 100万件のデータがあった場合の最悪ケースの探索回数は以下 注) 実際のインデックスは二分木ではなく B 木だったり、ディスクに記録されている インデックスデータすべてをいきなりメモリ上に展開するわけでもなかったり、 ディスクからメモリに展開するためのディスク I/O
があったりその他云々いろい ろあるので、上記のような単純な話ではありません(汗 実行計画 探索方法 探索回数 テーブルフルスキャン 線形探索 100万回 インデックススキャン 木による探索 20回
圧倒的じゃないかインデックスは! • よし、じゃあインデックスを貼りまくれば万事解決!!
そんなわけない(汗 • 二分木探索のとき、必要だったのは「ソートされた」データでした。 • つまりインデックスにデータを追加するとき、インデックスのデータはソートさ れた状態を維持しなくてはならない。 • ソートされた状態を維持したままデータを追加するのはコストがかかる。 • したがってインデックスを作ると、検索
(select) のときは早いけど、データ の挿入(insert)や更新(update) のときに激重になる。
なので • インデックスを貼る場合は、検索頻度と更新頻度を考慮して、貼るカラムを選 定する必要があります。
こちらからは以上です • 探索とかソートする際は計算量を気にしましょう。