中野 よくばり法 実施5.28予定 作成 - gunma universitynakano/al/al_note3v4.pdf ·...
TRANSCRIPT
アルゴリズムI
中野
Note 3 よくばり法
実施5.28予定
作成 2020.4.6
update2020.5.7 update5.21
よくばり法(貪欲法, greedy algorithm)
多くのアルゴリズムは、幾つかの繰り返しステップからなる。
各ステップで、解の一部を順次選択する。
多くの最適化問題は、動的計画法より、はるかに簡単な方法で解ける。
(もし、マトロイドの性質を持てば! )
よくばり法は、各ステップで、局所的に最適な選択を繰り返し、
最後に大域的に最適な解を求める。ただし、この方法によって、最後
に、必ず、大域的な最適解にたどりつくことを証明しなくてはならな
いことに注意しよう!
(富士山と八ヶ岳の例)
つまり、よくばり法が適用できる問題と、
できない問題がある。
バイトスケジューリング
仕事の集合を S={ a1, a2,..., an } とする。
仕事 ai の開始時刻を siとし、終了時刻を fiとする。
必ず si ≦ fi とする。
2つの仕事aiとajが、
fi ≦ sj、 もしくは、
fj ≦ si のとき、
2つの仕事は、compatibleという。
仕事の集合が与えられたとき、どの2つの仕事も compatible な
部分集合で、かつ、要素の個数が最大のものを選びたい。
1 2 3 4 5 6 7 8 9 10 11
si
fi
1
4
3
5
0
6
5
7
3
8
5
9
6
10
8
11
8
12
2
13
12
14
例
バイトスケジューリング(DP法)
部分問題 Si,jを次のように定義する。
Si,j = { ak | fi ≦ sk < fk ≦ sj}
すなわち, Si,j は、仕事ai の終了後に始まり、
仕事aj の開始前に終了する仕事の集合である。
ダミーの2つの仕事 a0 と an+1を加え、
f0 = 0 および sn+1 = ∞ とすると、
S0,n+1 = S である。
Si,j の部分集合で、どの2つの仕事も compatible であり、
かつ、要素の数が最大のもの(のひとつ)を Ai,j とする。
A0,n+1 が元の問題の解(のひとつ)である。
S中の要素は fiによってソートずみであるとしよう。
ai aj
Si,j
a0 an+1
S0,n-1 =Sa1 a2a3a4 a5
バイトスケジューリング(DP法)
もし、Ai,j に含まれる要素のひとつ
akがわかれば、
Ai,j = Ai,k ∪ { ak} ∪ Ak,j
である。
(つまり, ちょっと小さな問題を2つ解けばよい.)
akは,すぐにはわからない。
しかし、すべての k について調べて
最大のものを選べばよいから,
Ai,j = maxk {| Ai,k ∪ { ak} ∪ Ak,j |}
である。
O(n3)時間アルゴリズム
ai ajSi,j
Si,kSk,j
ak
バイトスケジューリング(よくばり法)
次が言える。
Si,j 中の要素は fiによってソートずみであるとする。
このとき、fm = min { fk | ak ∈ Si,j } とする。
( amは問題をみただけでわかることに注意.
am ≠ ai+1かもしれないことに注意! ) すると、
(C1) am ∈ Ai,j となる 最適解Ai,j が存在する。
(Ai,j と同じ数の仕事を含む(同点の他の最適)解が
ほかにもあるかもしれないことに注意。)
(C2) Ai,m = φ である。
すなわち、解の一部(つまりam)を、簡単な計算で
求めることができる! (amは必ず解に含まれるのである!)
さらに、2つに分割した一方の部分問題は φ である!
つまり、2に分割した問題の一方のみ解けばよい。
(元のままだと、多くの分割の可能性を調べて、かつ、それぞれ、
2つの部分問題の解が必要だったのに!)
ai ajSi,j
am
(C1) am ∈ Ai,j となる 最適解Ai,j が存在する。
(C1の証明)
任意の最適解 Ai,j について考えよう。
解 Ai,j 中で、終了時刻が一番早い仕事を akとしよう。
(akは、Si,j 中で、終了時刻が一番早い仕事では
ないかもしれないことに注意!)
2つの場合に分けて証明する。
場合1: ak = am の場合。
(C1)は成立する。
場合2: ak ≠ am の場合。
A'i,j = ( Ai,j - {ak} ) ∪ am
とすると、A'i,j も Si,j の解である。
(Ai,j 中のどの2つの仕事もcompatibleであったし、
かつ、fm ≦ fk であるから。)
すなわち(C1)は成立する。(証明終)
ai ajSi,j
am
(C2) Ai,m = φ である。
(C2の証明)
(もし、そうでないなら、
amの選び方に矛盾する。)(証明終)
ai ajSi,j
am
バイトスケジューリング(よくばり法)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
a1a2
a3
a4a5
a6a7
a8
a9a10
a11
バイトスケジューリング(よくばり法)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
a1a2
a3
a4a5
a6a7
a8
a9a10
a11
バイトスケジューリング(よくばり法)
Recursive-Activity-Selector(s,f,i,j) {s,fは配列}
begin
m = i + 1
while m < j かつ sm < fi
do m = m+1 { amがみつかるまでスキップする}
if fm ≦ sj
then
begin
am を出力 (解に追加)
Recursive-Activity-Selector(s,f,m,j) {第三引数がmとなることに注意}
end
end
O(n) 時間
スキャンのみ
よくばり法
よくばり法は、次の3ステップからなる。
1. (最適化)問題を、解の一部の(よくばり)選択と、(少し小さな)部分問題にわける。
2. 元の問題の最適解が、1の(よくばり)選択と、部分問題の解から構成できることを証明する。
3. 上記にもとづき、繰り返し、(よくばり)選択をすることにより、元の問題を解く。
よくばり法の選択は、部分問題の解に依存しないことに注意。
(つまり、こちらは、部分問題の解をみることなく選択できる!)
動的計画法でも選択をするが、この選択は部分問題の解に依存する。
(つまり、こちらは、部分問題の解をみないと選択できない!)
よくばり法では、2.の証明をしないと、正しい解が求まるかどうか、わかりません。
局所的に最適な選択 = よくばり選択
大域的な最適解 = 元の問題の解
ナップサック問題(よくばり法が、うまくいかない例)
1番からn番までの n個の物がある。1≦i≦nなる各iについて、i番の物の重さはwi kgであり、値段はvi万円である。ナップサックを用いて、合計 W kg までの物を運べるとする。このとき、値段が最大となるような物の組み合わせを選びたい。最大の値段はいくらか?
問題の具体例w1=1, w2=2, w3=5, w4=6, w5=7 (単位 kg)v1=1, v2=6, v3=18, v4=22, v5=28 (単位 万円)
W kgまで運べる
ナップサック問題(よくばり法が、うまくいかない例)
問題の具体例
w1=1, w2=2, w3=5, w4=6, w5=7 (単位 kg)
v1=1, v2=6, v3=18, v4=22, v5=28 (単位 万円)
もし、重さあたりの価値の高いものから順に選ぶと。。。
1番は 1万円/kg
2番は 3万円/kg
3番は 3.6万円/kg
4番は 約 3.66万円/kg
5番は 4万円/kg
なので、W=11のとき、5,2,1番を選ぶ。合計は、35万円で10kg。
(5番を選ぶと4番は重量オーバーで選べない。)
しかし、3,4番を選ぶと、40万円、11kg。
つまり、局所的に最適なよくばり選択をしても、大域的な最適解とならない!
(目先の得ばかり気にしていたため、全体では損した。)
この問題は、よくばり法ではダメ。(よくばり法で最適な解を求められる証明がないのです。)
W kgまで運べる
ハフマン符号
ハフマン符号は、データ圧縮のための手法のひとつである。
データは文字列であるとする。ハフマン符号は、各文字の出現頻度をもとに、各文字の最適な二進符号を決める。
問題の例
データファイルは、10万文字からなり、a-fの6種類の文字のみ含むとする。
出現頻度(%)
固定長符号
可変長符号
記号
45 13 12 16 9 5
000 001 010 011100 101
0101 100 11111011100
a b c d e f
ハフマン符号
データファイルは、10万文字からなり、a-fの6種類の文字のみ含むとする。
もし、固定長符号で符号化すれば、各文字に3bit必要であるので、30万bit必要である。もし、可変長符号で、頻度の高い文字に短い符号を、頻度の低い文字に長い符号を割りあてれば、データを圧縮でき、22万4千bitでよい。(約25%節約できた!)( 0.45・1 + 0.13・3 + 0.12・3 + 0.16・3 + 0.9・4 + 0.5・4 )
x 100,000 = 224,000
出現頻度(%)
固定長符号
可変長符号
記号
45 13 12 16 9 5
000 001 010 011100 101
0101 100 11111011100
a b c d e f
Prefix code
どの符号も、他の符号の接頭語になっていないような符号をPrefix codeという。
Prefix codeであるような、データ圧縮の最適な符号があることが知られている。
ファイル(=文字列)の符号は、ファイル中の各文字の符号の連接であるとする。
(例 abc --> 0 101 100)
Prefix codeの復号(decode)は、簡単である。
符号化されたファイルから、1文字分の符号を
切り出すことを繰り返せばよい。
(どの符号も、他の符号の接頭語になっていないので、
符号の切り出し方が2つ以上あることはない!)
(例 0101100 --> 0 101 100 --> a b c)
(これに対し、Prefix codeでないときは
aの符号が0, bの符号が01, cの符号が1のとき、
文字列01...の復号は切り出し方が複数あるので困る!)
出現頻度(%)
固定長符号
可変長符号
記号
45 13 12 16 9 5
000 001 010 011100 101
0101 100 11111011100
a b c d e f
Prefix codeの2分木表現
1文字分の符号を、簡単に切り取るために、符号を2分木で表現しよう。
葉に文字が対応する。各辺に、0もしくは1の符号がつく。
根から葉までの道が、葉に対応する文字の符号に対応する。
( 0 は左へ、1は右に対応する。)(内点に文字が割り当てられていない)
出現頻度(%)
可変長符号
記号
45 13 12 16 9 5
0101 100 11111011100
0 1
0 1a
1
1
a b c d e f
10 0
bc d
f e
10
Prefix codeの2分木表現
符号を表現する2分木と、各文字の出現頻度が
与えられれば、ファイルを符号化するのに必要な
bit数が計算できる。
符号を表現する2分木を T とする。
文字の集合を C とする。
C 中の各文字c の出現頻度が f(c) であるとする。
( f(c)は0以上1以下の数である。)
dT(c) は、cに対応する葉の、深さであるとする。
(葉の深さとは、葉から根までの道上にある辺の数である。)
B(T) = Σc∈C f(c) dT(c) とすると
B(T)は1文字を符号化するのに必要な平均のbit数である。
必要なbit数は、ファイルの文字数 x B(T) である。
出現頻度(%)
可変長符号
記号
45 13 12 16 9 5
0101 100 11111011100
0 1
0 1a
1
1
a b c d e f
10 0
bc d
f e
10
B(T)の値が最小の木が、最適な符号に、対応する。
最適な符号を求めるアルゴリズム(Huffman code, 1952年)
HUFFMAN(C)
n = | C | { Cは文字の集合 }
Q = C
for i=1 to n-1 do
f[x] = mina∈Q{ f[a] } なるxを選ぶ {頻度の少ない2つの点x,yを選び}
Q = Q - {x}
f[y] = mina∈Q{ f[a] } なるyを選ぶ
Q = Q - {y}
新しい点 z を生成する。 {新しい点zに併合する}
f[z] = f[x] + f[y] {x,yの親がzとなる}
Q = Q + {z}
f[a] = mina∈Q{ f[a] } {最後の1点を根として出力}
return a
end
x y
z
x y
頻度の少ないxとyを選ぶ
新しい点zに併合する
ハフマン符号(具体例)
出現頻度(%)
記号
45 13 12 16 9 5
a b c d e f
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 1
最小 2nd
14
ステップ1
ステップ2
ハフマン符号(具体例)
出現頻度(%)
記号
45 13 12 16 9 5
a b c d e f
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 1最小2nd 14
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 114
0 125
ステップ1
ステップ2
ステップ3
ハフマン符号(具体例)
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 114
0 125
最小
2nd
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 114
0 125 0
130
ステップ4
ステップ5a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 114
0 125 0
130
ステップ6
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 114
0 125 0
1300
155
2nd
最小
ステップ7
ハフマン符号(具体例)
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 114
0 125 0
1300
155
ステップ8
最小
2nd
a: 45 b: 13 c: 12 d: 16 e: 9 f: 5
0 114
0 125 0
1300
155
ステップ10 完成!
0
1100
出現頻度(%)
可変長符号
記号
45 13 12 16 9 5
0100 101 11011101111
a b c d e f
ハフマン符号
Qをヒープとして実装すれば、
このアルゴリズムの計算時間は、
ヒープの生成 O(n) 時間
頻度最小のデータを2つ除去し1つ挿入する O(log n) x n-1 回
よって、合計 O(n log n)時間かかる
ハフマン符号(正当性の証明)
補題 1
Cを文字の集合とする。各文字c∈Cの出現頻度は f[c]であるとする。x,y∈C は、出現頻度が最小の2つの文字であるとする。
このとき、最適なPrefix codeで、xとyの符号の長さが同じであり、最後のbitのみ異なるものが存在する。
証明
任意の、最適なPrefix codeに対応する木 T が与えられたとき、xとyは、最も深い兄弟の葉に対応する文字
であるように、木を改造できることを示す。
a,bは、木T の最も深い兄弟の葉に対応する文字であるとする。
f[a]≦f[b]であり、f[x]≦f[y]と仮定してよい。
xとyは、出現頻度が最小の文字であるから、f[x]≦f[a] かつ、 f[y]≦f[b]である。
T中のaとx, bとyを交換してできた木を T''とする。
このとき、B(T)≧B(T'')である。
(aとxを交換すると (f(a)-f(x))× (aとxの深さの差) だけ Bの値が減ります。)
(bとyを交換すると (f(b)-f(y))× (bとyの深さの差) だけ Bの値が減ります。)
また、Tは最適であるので(B(T)の値は最小であり) B(T)≦B(T'')である。
すなわち、B(T) = B(T'')である。
すなわち、T'は補題を満たす木である。
0 1
x y
0 1
a b
x y
0 1
x y
a b
T T”
ハフマン符号(正当性の証明)
補題 2
Cを文字の集合とする。
各文字c∈Cの出現頻度は f[c]であるとする。
X,y∈C は、出現頻度が最小の2つの文字であるとする。
C‘ = C – {x,y} + {z} とし、C’中の文字のfの値は、Cと同じとする。
ただし、f[z] = f[x] + f[y] とする。
T‘ は C’の最適なPrefix codeに対応する木であるとする。
T は T‘ を次のように改造して得られる木であるとする。
葉z を、xとyを子にもつ内点と置き換える。
このとき、Tは、Cの最適なPrefix codeに対応する木である。
(すなわち、よくばり選択と、部分問題の解(T’)から、元の問題の解Tが構成できる!)
(しかも、部分問題の解を知ることなく、よくばり選択ができる。)
0 1x y
0 1x y
T’ (C’の最適な符号)
T(Cの符号)
z
改造
0 1x y
T”(Cの最適な符号)
0 1x y
T’’’(Cの符号)
改造
(3)背理法によるTは最適でないと仮定する
(4) Cの最適な符号をT”とする
(5)T’’’をつくる
このとき、B(T''') = B(T'') - f(x) - f(y)< B(T) - f(x) - f(y) = B(T‘) 矛盾!
(1)(2)
ペナルティスケジューリング
仕事の集合 S={ a1,a2,...,an}、
それぞれの締切時刻 d1,d2,...,dn、
それぞれのペナルティ w1,w2,...,wn、
が与えられたとする。
締切時刻は、1以上n以下の整数である。
各仕事をするのに、1単位時間かかるとする。一度に、ひとつの仕事
のみができるとする。
締切に遅れた仕事に対しては、ペナルティを払わなくてはならない。
ペナルティの総和が最小のスケジュールを求めたい。
ペナルティスケジューリング (例)
仕事の集合 S={ a1,a2,...,a7}、
それぞれの締切時刻 d1=4,d2=2,d3=4,d4=3,d5=1,d6=4,d7=6、
それぞれのペナルティw1=70,w2=60,w3=50,w4=40,w5=30,w6=20,w7=10
1 2 3 4 5 6 7時
a1,a2,a3,a4,a5,a6,a7の順だと
o o o x x x x なので
ペナルティは40+30+20+10=100
ペナルティスケジューリング (つづき)
仕事の順列を決めると、スケジュールが決まり、ペナルティの総和が決まること
に注意しよう。
仕事の順列が与えられたとしよう。この順列中で、
もし仕事が締切時刻より後に完了すれば、その仕事は lateであるという。
もし仕事が締切時刻以前に完了すれば、その仕事は earlyであるという。
任意の順列は、ペナルティの総和を保存したまま, early-first 形に変換できる。
つまり、順列の先の方に earlyのみを集められる。
(もし、そうでない場合は、先の方に現れるlateと後の方に現れるearlyをswitchす
ることを繰り返せばよい。switchしても、late,earlyは変化しない。)
o o o x o x o x x x x o x
o earlyx late
ペナルティスケジューリング (つづき)
仕事の順列を決めると、スケジュールが決まり、ペナルティの総和が決まること
に注意しよう。
仕事の順列が与えられたとしよう。この順列中で、
もし仕事が締切時刻より後に完了すれば、その仕事は lateであるという。
もし仕事が締切時刻以前に完了すれば、その仕事は earlyであるという。
任意の順列は、ペナルティの総和を保存したまま, early-first 形に変換できる。
つまり、順列の先の方に earlyのみを集められる。
(もし、そうでない場合は、先の方に現れるlateと後の方に現れるearlyをswitchす
ることを繰り返せばよい。switchしても、late,earlyは変化しない。)
o o o x o x o x x x x o x
o earlyx late
交換
ペナルティスケジューリング (つづき)
任意の順列は、earlyな仕事が、ペナルティの総和を保存したまま,
締切時刻の早い順にソートされた順になるように変換できる。
(もし、そうでない場合は、時刻kに終了するearlyな仕事asと、
時刻k+1に終了するearlyな仕事at があり、dt < ds である。
このとき、atはearlyであるので、dt ≧ k+1 である。
よって、dt < ds より、ds > k+1 である。
つまり、as と at を 交換してもよい。
このように、上記を繰り返すことにより、締切時刻のソート順に変換できる。)
as
as の締切dsは5時より後at の締切dtは5時より後
時刻 3 4 5 at
締切10 締切5
ペナルティスケジューリング (つづき)
つまり、問題が与えられたとき、earlyな仕事の集合さえ求められれば、
問題の解、すなわち、仕事の順列は求めることができる。
(earlyの仕事を締切順に並べ、その後に、lateの仕事を任意の順
に並べればよい。)
以上により、次のような、よくばり法によるアルゴリズムが設計できる。
ペナルティスケジューリング (つづき)
DeadlineScheduling
n = | S | { Sは仕事の集合である}
{仕事akの締切はdkとし、仕事akのペナルティをwkとする}
仕事a1,a2,...,anは、ペナルティの大きい順に並んでいるとする。
E = φ
for i=1 to n do
if E ∪ { ai } の全てをearlyにできる
then E = E ∪ { ai }
return E
ペナルティスケジューリング (証明)
このアルゴリズムが、なぜ、最適解(earlyにする仕事の集合)を求めるのか証明しよう。
仕事a1,a2,...,anは、ペナルティ wiが大きい順に並んでいるとする。
すなわち、w1 ≧ w2 ≧ ... ≧ wn とする。
アルゴリズムは、各aiが最適解にはいるかを順に判断する。
このとき、akについて、はじめて判断を間違えたと(背理法のための)仮定しよう。
すなわち、
(場合1)アルゴリズムは、akが最適解に入るとしたが、akは最適解にはいらない、
もしくは、
(場合2)アルゴリズムは、akが最適解に入らないとしたが、akは最適解にはいる、
のいずれかが生じたとしよう。
いずれの場合も矛盾が生じることを、以下に示そう。
ペナルティスケジューリング (証明 つづき)
場合1:アルゴリズムは、akが最適解に入るとしたが、akが最適解に入らないとすると、
矛盾が生じることを示そう。仮定より、akより前の判定は正しい。
最適解が akより、ペナルティの大きな仕事のみからなるとすると矛盾である。
(最適解に、仕事 akを追加しても、アルゴリズムより全てをearlyにできるので、
最適解よりペナルティの小さな解ができることになってしまう。)
最適解中のearlyな仕事も締切時刻の早い順にソートされているとする。
最適解中の仕事のうち、akよりペナルティが小さく、かつ締切が最も早いものをajとする。ajの終了時刻をdjとする。
aj
early大 大大大 大小小
ペナルティスケジューリング (証明 つづき)
もし、dj ≦ dkならば矛盾である。
(最適解から、仕事 ajを削除し、そこにakを追加すれば、
最適解よりさらにペナルティの小さな解ができることになってしまうから。)
よって、dj > dkである。
最適解から、仕事 ajを削除し、かわりにakを加えたスケジュールを作ろう。
仕事akより前の部分は、元の最適解のままであるので、やはりすべてearlyである。
仕事ak以前の部分は、アルゴリズムがakが最適解に入ると判定したときの
earlyな仕事の部分集合であるから、akも含めて、すべてearlyである。
仕事akより後の部分は、元の最適解のままであるので、やはりすべてearlyである。
すなわち、最適なスケジュールよりも、もっとペナルティの少ないスケジュールがあることになり、
矛盾である。
aj
early大 大大大 大小小
ペナルティスケジューリング (証明 つづき)
場合2:アルゴリズムは、akが最適解に入らないとしたが、akは最適解にはいる。
アルゴリズムは、akについて初めて判定を間違えたのであるから、これ以前の判定は正しい。
このとき、akを、解に追加することはできない。
(追加するとすべてをearlyにできないのでakを捨てたはず。)
よって、この場合は生じない。
すなわち、場合1と場合2のいずれも生じない。
すなわちアルゴリズムは判定を間違えない。
0
ペナルティスケジューリング (例)
仕事の集合 S={ a1,a2,...,a7}、
それぞれの締切時刻
d1=4,d2=2,d3=4,d4=3,d5=1,
d6=4,d7=6、
それぞれのペナルティ
w1=70,w2=60,w3=50,w4=40,
w5=30,w6=20,w7=10
a1
1
a2
0 1a1
2
すべて間に合うOK
OK締切順に並べる
a2
0 1a1
2 OK締切順に並べるa3
3
a2
0 1a4
2 OKa1
3 4a3 締切順に並べる
ペナルティスケジューリング (例 つづき)
仕事の集合 S={ a1,a2,...,a7}、
それぞれの締切時刻
d1=4,d2=2,d3=4,d4=3,d5=1,
d6=4,d7=6、
それぞれのペナルティ
w1=70,w2=60,w3=50,w4=40,
w5=30,w6=20,w7=10
a2
0 1a4
2 OKa1
3 4a3 締切順に並べる
a2
0 1a4
2 だめa1
3 4a3 締切順に
5a5
a4
0 1a1
2 だめa3
3 4a6
5a2
a5すてる
a6すてる
a4
0 1a1
2a3
3 4a7
5a2
a4 a1 a3 a7a2 a5 a6
early lateペナルティ 50
理解認識クイズ)
(1)仕事の集合{a1,a2,…,a10}がある
仕事 1 2 3 4 5 6 7 8 9 10
開始時刻 0 0 2 2 4 4 5 7 8 9
終了時刻 4 2 4 3 5 6 9 9 10 10
どの2つの仕事も compatible であるような、
要素の数が最大の仕事の集合を選べ。
理解認識クイズ) 仕事 1 2 3 4 5 6 7 8 9 10
開始時刻 0 0 2 2 4 4 5 7 8 9
終了時刻 4 2 4 3 5 6 9 9 10 10
0 1 2 3 4 5 6 7 8 9 10
a2
a1
a3
a4
a5
a6
a7
a8
a9
a10
理解認識クイズ) 仕事 1 2 3 4 5 6 7 8 9 10
開始時刻 0 0 2 2 4 4 5 7 8 9
終了時刻 4 2 4 3 5 6 9 9 10 10
0 1 2 3 4 5 6 7 8 9 10
a2
a1
a3
a4
a5
a6
a7
a8
a9
a10
理解認識クイズ(準備中)
(2) a-hの文字からなるデータファイルの、先頭の54文字を調べたら、各文字の出現回数は、次のようであった。
ハフマン符号を求めよ。
記号 a b c d e f g h
出現回数 1 1 2 3 5 8 13 21