跳到主要内容

東京大学 新領域創成科学研究科 メディカル情報生命専攻 2024年8月実施 問題9

Author​

祭音Myyura

Description​

ゲノム解析パイプラインにおける計算タスク間の依存関係を有向非巡回グラフ G=(V,E)G = (V, E) で表す。 頂点 v∈Vv \in V は個々の計算タスクを表している。計算タスク viv_i の出力を計算タスク vjv_j の入力とするために vjv_j より先に viv_i の計算が終了している必要がある場合には辺 vi→vjv_i \to v_j を加えて依存関係の制約を表す。 グラフ GG は非巡回グラフであり、閉路を含まない。

(1) 計算タスクの順列であって依存関係の制約に違反しない計算順序を「正しい計算順序」と呼ぶことにする。以下のグラフにおいて、正しい計算順序を1つ示せ。

(2) 任意の有向非巡回グラフ GG が与えられたとき、正しい計算順序を一つ出力する時間計算量 O(∣V∣+∣E∣)O(|V| + |E|) のアルゴリズムを示せ。ただし、入力グラフは隣接リスト表現で与えられており、∣V∣|V|、∣E∣|E| はそれぞれ VV、EE の要素数を表す。

(3) 任意の有向非巡回グラフ G=(V,E)G = (V, E) および各計算タスク v∈Vv \in V に対して非負の計算時間 T(v)T(v) が与えられている。計算機は無限にあり、計算タスクは任意の数だけ同時並行で実行できるものとする。また、計算機間でデータを移動するための通信時間は無視する。依存関係の制約に違反せずに全ての計算が終わるまでの最短時間を求める時間計算量 O(∣V∣+∣E∣)O(|V| +|E|) のアルゴリズムを示せ。ただし、入力グラフは隣接リスト表現で与えられているものとする。

题目描述​

用有向无环图 G=(V,E)G=(V,E) 表示基因组分析流水线的任务依赖:顶点 vv 是计算任务;若任务 vjv_j 需要以 viv_i 的输出为输入,因而 viv_i 必须先完成,则加入边 vi→vjv_i\to v_j。图中无有向环。

  1. 把不违反任何依赖边的任务排列称为“正确计算顺序”。对上图所示 DAG 给出一种正确顺序;图还包含与主分量分离的边 v11→v12v_{11}\to v_{12},因此顺序必须覆盖 v1,…,v12v_1,\ldots,v_{12} 的全部任务。
  2. 对以邻接表表示的任意 DAG,给出输出一种正确计算顺序的算法,时间复杂度须为
    O(∣V∣+∣E∣).O(|V|+|E|).
  3. 对每个任务 vv 给定非负运行时间 T(v)T(v)。假设计算机数量无限,任意多个满足依赖的任务可并行执行,且忽略计算机间通信时间。设计一个在
    O(∣V∣+∣E∣)O(|V|+|E|)
    时间内求全部任务完成所需最短时间的算法。

Kai​

(1)​

解答例: v1, v5, v8, v11, v2, v6, v12, v7, v9, v3, v10, v4

(2)​

アルゴリズムの手順:

  1. 初期化: 各頂点 v∈Vv \in V の入次数(自身を終点とする辺の数)を計算し、配列などに保存する。キューの準備: 入次数が0のすべての頂点をキュー QQ に追加する。
  2. リストの準備: 計算順序を記録するための空のリスト LL を用意する。
  3. 探索処理: キュー QQ が空になるまで以下の操作を繰り返す。
    1. QQ から頂点 uu を取り出し、LL の末尾に追加する。
    2. グラフの隣接リストを参照し、uu を始点とする各辺 u→vu \to v について、頂点 vv の入次数を1減らす。
    3. 入次数が0になった頂点 vv があれば、それを QQ に追加する。
  4. 出力: リスト LL を正しい計算順序として出力する。

時間計算量の見積もり:

  • ステップ1の入次数の計算は、すべての辺を1回ずつ調べるため O(∣V∣+∣E∣)O(|V| + |E|) です。
  • ステップ3のループ処理では、各頂点が正確に1回キューに入り、LL に追加されるため O(∣V∣)O(|V|)、各辺 u→vu \to v も始点 uu が処理される際に正確に1回評価されるため O(∣E∣)O(|E|) です。
  • したがって、全体の時間計算量は O(∣V∣+∣E∣)O(|V| + |E|) となります。

(3)​

無限の計算機があり並行処理が可能な場合、全体の最短計算時間は「DAG上の最長経路(クリティカルパス)」の長さに等しくなります。

アルゴリズムの手順:

  1. (2)のアルゴリズムを実行し、グラフ GG の頂点をトポロジカルソートした順序のリスト LL を取得する。

  2. 各頂点 vv の「計算が完了する最短時間」を保持する配列 dpdp を用意し、すべての v∈Vv \in V について dp[v]=T(v)dp[v] = T(v) で初期化する。

  3. トポロジカルソートされたリスト LL の先頭から順に頂点 uu を取り出し、以下の更新処理を行う。

    1. 隣接リストを参照し、uu から出る各辺 u→vu \to v の先の頂点 vv について、以下の漸化式で完了時間を更新する。
    dp[v]=max⁡(dp[v],dp[u]+T(v))dp[v] = \max(dp[v], dp[u] + T(v))

    (これは、vv の計算を始めるためには、先行するすべてのタスク uu の計算が終わるのを待つ必要があるためです)

  4. すべての頂点の処理が終わった後、配列 dpdp に格納されている値の最大値 max⁡v∈Vdp[v]\max_{v \in V} dp[v] を求めて出力する。これが全体の最短完了時間となる。

時間計算量の見積もり:

  • ステップ1のトポロジカルソートは O(∣V∣+∣E∣)O(|V| + |E|) です。
  • ステップ2の初期化は O(∣V∣)O(|V|) です。
  • ステップ3の更新処理では、トポロジカルソートの順に各頂点を1回ずつ訪問し、その頂点から出るすべての辺を1回ずつ評価するため、全体で O(∣V∣+∣E∣)O(|V| + |E|) です。
  • ステップ4の最大値の探索は O(∣V∣)O(|V|) です。したがって、全体の時間計算量は O(∣V∣+∣E∣)O(|V| + |E|) となります。