Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
みんなで書こう二分探索
Search
matumoto
June 10, 2021
Technology
75
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
みんなで書こう二分探索
2021/7月の大LTでの発表資料です
イベントページはこちら
https://zli.connpass.com/event/216615/
matumoto
June 10, 2021
More Decks by matumoto
See All by matumoto
Go標準パッケージのI/O処理をながめる
matumoto
0
470
testingを眺める
matumoto
1
220
sync/v2 プロポーザルの 背景と sync.Pool について
matumoto
0
820
Goトランザクション処理
matumoto
1
93
いまいちどスライスの 挙動を見直してみる
matumoto
0
430
Go1.22のリリース予定の機能を見る
matumoto
0
93
GoのUnderlying typeについて
matumoto
0
250
Typed-nilについて
matumoto
0
390
GoのType Setsという概念
matumoto
0
62
Other Decks in Technology
See All in Technology
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
140
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
710
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
2.2k
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
240
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
1
2.3k
リアーキテクチャ後の障害ゼロを目指したShadow Testingの取り組み
nihonbuson
PRO
1
160
SREは、MCPとAutopilotをこう使え!
kazumax55
3
900
空間オーディオで過去の 自分(ゴースト)と競うランニング 〜HealthKitのルートを足音に変える実装〜
nao_randd
0
230
HRC_Frontend_Conference_Fukuoka_2026.pdf
ts020
0
750
あるけみー式LTスライド作成術
alchemy1115
2
220
おい、エージェントを使って終わらせろ
nwiizo
1
680
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
170
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
380
The agentic SEO stack - context over prompts
schlessera
0
940
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
How to train your dragon (web standard)
notwaldorf
97
6.8k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Mind Mapping
helmedeiros
1
360
We Have a Design System, Now What?
morganepeng
55
8.3k
Transcript
みんなで書こう二分探索 会津大学2年松本響輝
二分探索って? ・二分していく探索です それ以上でもそれ以下でもない 探索する区間の長さをNとして なんと計算量オーダーがO(logN)ではやい! 半分,半分,半分,半分,......................
強い方のツイートで一時期盛り上がりました
どういう動き方か
どう動くの? 端っこを決めて、その真ん中で区間を分けていく。 使う方 使う方 使う方
なにを求められるのか
なにができるの ・ある境界を求められる 例 A = {3, 5, 10, 20, 33,
90, 98}の配列で値が15以上を満たす最小の index を返す場合 left : 0 right : 6 mid : 3 ← ( left + right ) / 2 A mid は20なので、15以上! ということは、探索する区間を左側にずらす→ right を mid にする
A = {3, 5, 10, 20, 33, 90, 98}の配列で値が15以上を満たす最小の index
を返す場合 left : 0 right : 3 ← mid mid : 1 ← ( left + right ) / 2 A mid は5なので、15以上じゃない! ということは、探索する区間を右側にずらす→ left を mid + 1にする
A = {3, 5, 10, 20, 33, 90, 98}の配列で値が15以上を満たす最小の index
を返す場合 left : 2 ← mid + 1 right : 3 mid : 2 ← ( left + right ) / 2 A mid は10なので、15以上! ということは、探索する区間を右側にずらす→ left を mid + 1にする
A = {3, 5, 10, 20, 33, 90, 98}の配列で値が15以上を満たす最小の index
を返す場合 left : 3 ← mid + 1 right : 3 mid : 3 ← ( left + right ) / 2 A mid は20なので、15以上! left と right が同じになったので left を返す( right でもよい)
なにを求めるの? ・ある境界を求められる つまり、条件を定めたときの境界を求めることができる ・ソート済みの配列の中で値が10以上を満たす最小の index ・0~n以下の素数の中で200000以上の最小の素数 条件が有効でない部分 条件が有効な部分 ※境界は整数でないこともあります
なにがうれしいのか
なにがうれしい? ・応用ができる! 例:値の検索 配列の中で値が x 以上を満たす最小の index → index 番目が
x ならOK、そうでないならその配列にはない ・計算量が少ない! 最悪でも計算量がO(logN) 0~1018くらいの区間だったとしても十分に高速(そんな大きい数を扱う職場...)
None
実装は? 1. 二分探索を使わない 2. 標準の関数を使う 3. 自分で作る
1.二分探索を使わない
1.二分探索を使わない (´・ω・`) え?
2.標準の関数を使う
2.標準の関数を使う • C++ ◦ lower_bound ◦ upper_bound • Python ◦
bisect • java ◦ Arrays.binarySearch ただ、配列に対して二分探索はできるが それ以外への二分探索ができない...
3.自分で作る
3.自分で作る(C++) 関数にするより、テンプレを覚えて書いた方が汎用性がよい! そんなあなたにめぐる式二分探索! ※競技プログラミング界隈はキャラがおおいがち 因幡めぐるアカウント様( https://twitter.com/meguru_comp)より
めぐる式二分探索の前に.. ・二分探索の実装上の工夫(先人たちの汗と涙の知恵) • 区間は半開区間[ left, right )で扱う 閉区間[ left, right
] これは left 以上 right 以下 半開区間 [ left, right ) これは left 以上 right 未満 今まで [ left, right ] → [ left, mid - 1 ]だったが [ left, right ) → [ left, mid )と簡潔に! ※ left を mid にする場合もおなじ ついでに、長さが N の配列のとき [ 0, N - 1 ] としてたのが [ 0, N ) にできる
めぐる式二分探索とは • めぐる式二分探索の特徴 ・ループの条件に絶対値を使っている ・ok, ng などの変数がある ・半開区間 ・最終的には ok
に求めたい値が入っている ・判定部分を関数にしている(←これについては諸説ありです) (ok, ng 以外の変数名の候補としては valid, invalid がある)
valid, invalid(ok, ng)みたいな変数には何の値が入るの? • ある条件を元にその境界を求めたい→二分探索でのis_valid関数を作る • validにはis_valid(valid)としたときに必ずtrueとなる値を入れる • invalidにはis_valid(invalid)としたときに必ずfalseとなる値を入れる •
例 ◦ n要素のソート済み配列 aからx以上の要素の最小のインデックスを見つけたい ▪ (配列aにはx以上の要素が少なくとも 1つは存在するものとする ) ◦ is_valid関数はindexを受け取ってa[i] >= x かどうかを判定するように作る ◦ validの初期値にはn-1を入れておく ◦ invalidの初期値には-1を入れておく(今回は invalidが開区間なので0じゃない) ◦ これであとは二分探索するだけ ▪ ※実際には、配列aの末尾に番兵として INFを挿入してvalid=nとする方が多いと思います
閉区間の実装と比較 ・+1, -1 を考えるのが混乱させる ・left か right のどちらにほしい値があるのか考える必要がある
閉区間の実装と比較 ・is_valid 関数を作ると、条件だけ考えることができる ・最終的にほしい値が valid だと分かりやすい ←の is_valid 関数は C++
のラムダ式です
これであなたも快適な二分探索ライフを! ご清聴ありがとうございました