「DA:graphtree」の版間の差分

提供:classwiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の3版が非表示)
62行目: 62行目:
         j = (i - 1) // 2
         j = (i - 1) // 2
   
   
  # 最大値を取り除いて返す関数
  # 根を取り除いて最大値(元々の根が持っていた値)を返す関数
  def pop():
  def pop():
     out = heap[0]
     out = heap[0]
     x = heap.pop()  #注意:ここのpopはpythonのビルトイン関数であり,今実装しているpopとは違います.
     x = heap.pop()  #注意:ここのpopはpythonのビルトイン関数であり,今実装しているpopとは違います.
    # ヒープが空っぽになったら,残りの処理は必要ないのでreturn
    if len(heap) == 0:
        return out
     heap[0] = x
     heap[0] = x
     i = 0
     i = 0
     while True:
     while True:
         # 左の子のインデックスを取得
         # 左の子のインデックスを取得
         j = i ** 2 + 1
         j = i * 2 + 1
   
   
         # 左の子が存在しないなら,現在のiが葉である
         # 左の子が存在しないなら,現在のiが葉であるため,それ以上入れ替える必要はない
         if j >= len(heap):
         if ##### 埋めてください #####:
             break
             break
   
   
         # 左の子が存在する場合,その値を取得しておく.
         # 左の子が存在する場合,その値を取得しておく.
         y = heap[j]
         y = ##### 埋めてください #####
   
   
         # 右の子(j+1)も存在していて,かつ左の子が持つ値よりも右の子が持つ値の方が大きい場合,
         # 右の子(j+1)も存在していて,かつ左の子が持つ値よりも右の子が持つ値の方が大きい場合,
         # 右の子と親を比較する必要があるので,以下の処理を行う
         # 右の子と親を比較する必要があるので,以下の処理を行う
         if j + 1 < len(heap) and heap[j] < heap[j+1]:
         if ##### 埋めてください ##### and ##### 埋めてください #####:
             y = max(heap[j], heap[j+1])
             y = ##### 埋めてください #####
             j = j + 1
             j = ##### 埋めてください #####
   
   
         # 親の値と,二人の子のうちより大きな値を持つ方を比較して,子の値の方が大きければ,親子を入れ替える
         # 親の値と,二人の子のうちより大きな値を持つ方を比較して,子の値の方が大きければ,親子を入れ替える
         if heap[i] < heap[j]:
         if ##### 埋めてください #####:
             tmp = heap[i]
             ##### 埋めてください #####
            heap[i] = heap[j]
            heap[j] = tmp
         else:
         else:
             break
             break

2025年5月29日 (木) 01:14時点における最新版

隣接リストと隣接行列

## 無向グラフ
# 隣接リスト
V = [[] for i in range(5)]

V[0] = [1, 3, 4]
V[1] = [0, 2]
V[2] = [1, 4]
V[3] = [0]
V[4] = [0, 2]

# 隣接行列
E = [
    [0, 1, 0, 1, 1],
    [1, 0, 1, 0, 0],
    [0, 1, 0, 0, 1],
    [1, 0, 0, 0, 0],
    [1, 0, 1, 0, 0]
]


## 有向グラフ
# 隣接リスト
V = [[] for i in range(5)]

V[0] = [3]
V[1] = [0]
V[2] = [1]
V[4] = [0,2]

# 隣接行列
E = [
    [0, 0, 0, 1, 0],
    [1, 0, 0, 0, 0],
    [0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0],
    [1, 0, 1, 0, 0]
]

ヒープ

# ヒープの中身を木構造っぽく表示する関数
def show(d=0):
    if 2 ** d > len(heap): return
    i = 2 ** d - 1
    j = 2 ** (d + 1) - 1
    print(heap[i:j])
    show(d+1)

# 新しい要素を挿入
def push(x):
    i = len(heap)
    heap.append(x)
    j = (i - 1) // 2
    while i > 0:
        if heap[i] > heap[j]:
            tmp = heap[i]
            heap[i] = heap[j]
            heap[j] = tmp
        i = j
        j = (i - 1) // 2

# 根を取り除いて最大値(元々の根が持っていた値)を返す関数
def pop():
    out = heap[0]
    x = heap.pop()  #注意:ここのpopはpythonのビルトイン関数であり,今実装しているpopとは違います.

    # ヒープが空っぽになったら,残りの処理は必要ないのでreturn
    if len(heap) == 0:
        return out

    heap[0] = x
    i = 0
    while True:
        # 左の子のインデックスを取得
        j = i * 2 + 1

        # 左の子が存在しないなら,現在のiが葉であるため,それ以上入れ替える必要はない
        if ##### 埋めてください #####:
            break

        # 左の子が存在する場合,その値を取得しておく.
        y = ##### 埋めてください #####

        # 右の子(j+1)も存在していて,かつ左の子が持つ値よりも右の子が持つ値の方が大きい場合,
        # 右の子と親を比較する必要があるので,以下の処理を行う
        if ##### 埋めてください ##### and ##### 埋めてください #####:
            y = ##### 埋めてください #####
            j = ##### 埋めてください #####

        # 親の値と,二人の子のうちより大きな値を持つ方を比較して,子の値の方が大きければ,親子を入れ替える
        if ##### 埋めてください #####:
            ##### 埋めてください #####
        else:
            break
        i = j

    return out

# テスト
heap = []

push(19)
push(12)
push(15)
push(10)
push(7)
push(6)
push(1)
push(3)
push(7)
push(5)
push(3)
push(2)

push(20)
m = pop()
print('取得した最大値:', m)

print()
print('現在の木構造')
show()