データ構造
立命館大学理工学部数理科学科三回生
谷口泰地
目次
•木、二分木
•プライオリティキュー、
ヒープ
•応用問題
データ構造って??
データ構造とはデータの持ち方のことである。
保存の方法
自分が行う処理に適したデータの持ち方を選ぶ
データ構造の前にまずは、「木」から
「木」とはグラフ理論で出てくるグラフの一種
By wiki
グラフ…nodeとedgeの集合からなる空間
無向…edgeに向きがない
閉路…逆戻りせず一周回ってこれる道
連結…一方のnodeから別のnodeへedgeを通って移動できる
数学、特にグラフ理論の分野における木(き、英: tree)とは、
連結で閉路を持たない(無向)グラフである。
nodeの一つ
edgeの一つ
?????
nodeの一つ
edgeの一つ
一般的なグラフ
閉路がある
Edgeに向きがある
連結…どの二点間にも道がある。
•閉路がない
•向きがない
•連結
木
根付き木 根
基準
親
子
兄弟
二分木…一つのnodeに引っ付いているedgeが二つ以下
データ構造は自分が行いたい処理
に適したものを選ぶ
データ構造:プライオリティキュー
やりたい処理
• 数を追加する
• 最小の数値を取り出す
1,2,4 1,2,3,4
1,2,3,4 2,3,4
1を取り出す
3を追加
データ構造:プライオリティキュー
やりたい処理
• 数を追加する
• 最小の数値を取り出す
二分木を使うと便利!
(二分)ヒープと呼ばれる
ヒープ
• 親のほうが若い
• 左にノードが詰まっている
特徴
ヒープ
1. 数字の追加
2. 最小値の取り出し
ヒープ
1. 数字の追加
2. 最小値の取り出し
一番下の段のでき
るだけ左に付ける
ヒープ
1. 数字の追加
2. 最小値の取り出し
自分より年寄りの親が
いなくなるまで親と入
れ替える
ヒープ
1. 数字の追加
2. 最小値の取り出し
ヒープ構造の維持!
ヒープ
1. 数字の追加
2. 最小値の取り出し
ヒープ
1. 数字の追加
2. 最小値の取り出し
根の値を取り出す
A
ヒープ
1. 数字の追加
2. 最小値の取り出し
根に最後尾の
nodeをコピー
ヒープ
1. 数字の追加
2. 最小値の取り出し
最後尾のnodeを
削除
ヒープ
1. 数字の追加
2. 最小値の取り出し
逆転がなくなる
まで小さい方と
入れ替える
ヒープ
1. 数字の追加
2. 最小値の取り出し
ヒープ構造の維持!
ヒープ構造の実装
• ポイント
1. 上からかつ左から順にノードに番号を
付ける
2. 自分(n番目)の子のうち、左のノード
の番号は2*n+1
3. 自分(n番目)の子のうち、右のノード
の番号は2*n+2
ヒープ構造の実装
A
GH
FB C D E
ヒープ構造の実装
• Pythonを使った実装を行いました。
• クラスを使ってヒープ構造を保存しました。
• https://github.com/takutori/Implementation
/tree/master/Pro_con を見てねっ!!
ヒープ構造に追加され
て削除されていく様
ヒープソート
ヒープ構造の「最小を取り出
す」操作を用いて、配列を小
さい順に並び変える。
ヒープの応用問題
• 問題文
ドラックで距離Lの道を移動します。初めトラック
にはガソリンがP積まれています。このトラックは
距離1走るとガソリン1減る。途中でガソリンが0に
なってしまうとトラックは停止し、移動に失敗する。
途中にガソリンスタンドはN個あり、各ガソリンス
タンドiはのスタート点から距離A_1の地点にあり、
B_iだけガソリンを補給できる。トラックは移動を
完了できるか?その際、最小で何回のガソリンの補
給が必要か?完了できる場合は最小の補給回数を、
できない場合は-1を出力せよ。
1<=N<=10000
1<=L<=1000000
1<=P<=1000000
1<=A_1<L
1<=B_i<100
解き方
1. トラックを走らせる
2. 通ったガソスタを記憶
3. トラックガス欠
4. 通ってたガソスタの中で一番給油できる量を給油
5. ゴールするまで1に戻る、通ったガソスタをすべて使ってしまっ
たらアウト
解き方
1. トラックを走らせる
2. 通ったガソスタを記憶
3. トラックガス欠
4. 通ってたガソスタの中で一番給油できる量を給油
5. ゴールするまで1に戻る、通ったガソスタをすべて使ってしまっ
たらアウト
解き方
1. トラックを走らせる
2. 通ったガソスタを記憶
3. トラックガス欠
4. 通ってたガソスタの中で一番給油できる量を給油
5. ゴールするまで1に戻る、通ったガソスタをすべて使ってしまっ
たらアウト
解き方
1. トラックを走らせる
2. 通ったガソスタを記憶
3. トラックガス欠
4. 通ってたガソスタの中で一番給油できる量を給油
5. ゴールするまで1に戻る、通ったガソスタをすべて使ってしまっ
たらアウト
これ!!!
解き方
1. トラックを走らせる
2. 通ったガソスタを記憶
3. トラックガス欠
4. 通ってたガソスタの中で一番給油できる量を給油
5. ゴールするまで1に戻る、通ったガソスタをすべて使ってしまっ
たらアウト
解き方
ポイント!
通ったガソスタの給油量をヒープ構造で保管し、ガ
ス欠するたびにヒープ構造から最大値を取り出す。
実装はhttps://github.com/takutori/Implementation/tree/master/Pro_conを見てね!
Heap

Heap

Editor's Notes

  • #8 こうゆう人いますか???汗