33. 33
T(n) = cn + 2T(n /
2)
T(n / 2) = cn / 2 + 2T(n / 4)
高さ : log2n
最良の場合 : 基準値によって等しく分割される場合
cn
T(n / 2) T(n / 2)
cn
T(n / 4) T(n / 4)
cn/2 cn/2
T(n / 4) T(n / 4)
cn
cn/2 cn/2
c
2c
c c
2c
c c
2c
c c
2c
c c
2c
c c
2c
c c
2c
c c
2c
c
38. 38
def mergesort(data, left, right)
mid = (left + right) / 2 # 中央の index 取得
if left < mid # 左部分を ( 要素があれば ) 再帰ソート
mergesort(data, left, mid); end
if mid + 1 < right # 右部分を ( 要素があれば ) 再帰ソート
mergesort(data, left, mid); end
merge(data, left, mid, right) # 左と中央と右を結合
end
def merge(data, left, mid, right)
temp = Array.new(data.length)
a = left; b = mid + 1 # 左と右のグループのインデックス初期化
for i in 0..(right - left)
if a == mid + 1; temp[i] = data[b]; b += 1
else if b == right + 1; temp[i] = data[a]; a += 1
else if data[a] > data[b]; temp[i] = data[a]; a += 1
else temp[i] = data[b]; b += 1
end
end
for i in left..right
data[i] = temp[i] # 生成した配列をコピー
end
end
62. 62
コードのイメージ
# w : 荷物の重さの配列 ; v : 価値の配列 ; n : 荷物の総数
z = 0
def solve(level)
if level > n # 列挙木の葉に相当する処理の場合
aw = 重さの総和 ; av = 価値の総和
if aw <= c && av > z
z = av # 暫定解を更新
end
else
if 枝狩り条件 1 が成立しない
if 枝狩り条件 2 が成立する
av = 残るすべての荷物を積載した場合の価値の総和
if av > z; z = av; end
else if 枝狩り条件 3 が成立する
x[level] = 0; solve(level + 1);
x[level] = 1; solve(level + 1);
end
end
end
解の候補を出力
end