15851 words
79 minutes
Osaka University IST Graduate Entrance Exam (2019)

大阪大学 情報科学研究科 情報工学 2019年度 必須問題&選択問題#

Author#

KardeniaPoyu


1 【必須問題】アルゴリズムとプログラミング#

Description#

配点: (1) 20点, (2) 35点, (3) 15点, (4-1) 15点, (4-2) 15点, (5) 25点

図1に示す ANSI-C 準拠である C 言語のプログラム (program) は、所有している複数のくじ (lottery) のそれぞれが当選 (win) しているかを調べて、当選しているくじ番号 (lottery number) と等級 (grade) をもれなく出力 (output) するものである。くじ番号は 10000 未満の自然数 (natural number) で定められており、いずれのくじ番号のくじもただか一つしか存在しない。所有しているくじ番号が、当選番号 (winning number) と一致した場合に、その当選番号に対応する等級に当選したとする。当選番号は 10000 未満の自然数から重複なく選ばれた NN 個 (NN3N1003 \le N \le 100 の自然数) の数字で、等級は 1等から 3等まであり、1等が1本、2等が1本、3等が N2N-2 本である。

当選番号と等級は図2に示すような形式 (format) のファイル win.txt で与えられ、1行目には当選番号の総数 NN、2行目以降の NN 行は全ての当選番号とその等級 rr (rr1r31 \le r \le 3 の自然数) が書かれている。また、所有しているくじ番号は図3に示すような形式のファイル lots.txt で与えられ、所有しているくじ番号が 1行目から各行に一つずつ書かれている。以下の各問に答えよ。

(1)#

図2の win.txt、図3の lots.txt を与えてプログラムを実行することを考える。プログラムの 36行目で関数 functionA が呼び出されたときに、プログラム 6〜13行目の for 文処理において、i=1i=1 および i=3i=3 の時に、jj に関する for 文が終了した時点で a[0]a[9] および b[0]b[9] の値が以下のようになった。8行目の空欄 (A) を配列 a に関する適切な条件式で埋めよ。

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
i=15308900788835008490586981328899003
i=39003500849055308132889788886989003
b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]
i=13323313333
i=33331333233

(2)#

36行目で呼び出された関数 functionA の処理によって、配列 win および配列 grade はどのようになるか、説明せよ。またその処理の平均時間計算量 (average case time complexity) を、変数 nn を用いて、オーダ表記 (order notation) で表わせ。その理由も答えよ。ただし、win.txt 内では、当選番号は無作為 (at random) な順序で並んでいる。

(3)#

39行目で呼び出された関数 functionB はどのような処理をしているのか、配列 win、変数 lot、変数 n を用いて説明せよ。また、関数の戻り値 (return value) についても言及すること。

(4)#

4〜14行目で定義されている関数 functionA を以下のように変更することで、36行目で functionA を実行する時の平均時間計算量を少なくすることを考える。以下の各小問に答えよ。

void functionA(int a[], int b[], int t, int w){
if(t<w){
int i, j, x, tmp;
i=t; j=w;
x=a[t];
while(1){
while(a[i]<x) i++;
while(a[j]>x) j--;
if(i>=j) break;
tmp=a[i]; a[i]=a[j]; a[j]=tmp;
tmp=b[i]; b[i]=b[j]; b[j]=tmp;
i++; j--;
}
functionA(a, b, [ (あ) ], [ (い) ]);
functionA(a, b, [ (う) ], [ (え) ]);
}
}
(4-1)#

空欄 (あ)(え) に入るものの組み合わせとして、適切なものを下の (i)〜(iv) から一つ選び、答えよ。

(あ)(い)(う)(え)
(i)i-1twj+1
(ii)tj-1i+1w
(iii)ti-1j+1w
(iv)j-1twi+1
(4-2)#

関数 functionA の変更後の平均時間計算量を、変数 nn を用いて、オーダ表記で表わせ。

(5)#

図1のプログラムを、下線(ア)および下線(イ)で示した main 関数中の関数 functionA の引数 (argument) と if 文の条件式のみを変更し、1等に当選している場合にのみ、当選しているくじ番号と等級を出力するようにする。当選番号と等級、および所有しているくじ番号は図2および図3と同じ形式で与えられる。39行目の下線(イ)における判定を平均時間計算量 O(1)O(1) で実現するためには、下線(ア)および下線(イ)をそれぞれどのように変更すればよいか、(ア)には適切な引数を、(イ)には適切な式をそれぞれ答えよ。


Kai#

(1)#

  • 日本語 (Japanese): a[j] > a[j+1]
  • 英語 (English): a[j] > a[j+1]
  • 中文解析 (Chinese Analysis): 该程序通过 functionA 实现冒泡排序,对中奖号码数组 a 进行升序排列。在每一轮的相邻元素比较中,若前一个元素 a[j] 大于后一个元素 a[j+1],则需要将它们交换。因此,空栏 (A) 应填入 a[j] > a[j+1]。 从表格中可以看出,在 i=1i=1 结束后,数组中的最大元素 9003 已经冒泡到了末尾的 a[9];在 i=3i=3 结束后,最大三个元素 7888, 8698, 9003 均已在数组的最右端排好序,这符合冒泡排序的执行结果。

(2)#

  • 日本語 (Japanese): 配列 win の要素は昇順(小さい順)に整列され、配列 grade の要素は win の並び替えと同期して入れ替えられる。 平均時間計算量は O(n2)O(n^2) である。 理由: 外側のループは n1n-1 回実行され、各ステップ ii において内側のループは tt から wiw-i まで実行される。したがって、比較の総数は i=1n1(ni)=n(n1)2\sum_{i=1}^{n-1} (n - i) = \frac{n(n-1)}{2} 回となる。平均してこの比較の半数でスワップ(入れ替え)が発生するため、比較回数・スワップ回数ともに平均時間計算量は O(n2)O(n^2) となる。
  • 英語 (English): The elements of the array win are sorted in ascending order, while the elements of the array grade are swapped in tandem to remain synchronized with their corresponding elements in win. The average-case time complexity is O(n2)O(n^2). Reason: The outer loop runs n1n-1 times, and for each iteration ii, the inner loop runs from tt to wiw-i. Thus, the total number of comparisons is i=1n1(ni)=n(n1)2\sum_{i=1}^{n-1} (n - i) = \frac{n(n-1)}{2}. In the average case, swaps occur for approximately half of these comparisons. Since both the comparisons and swaps scale with n2n^2, the complexity is O(n2)O(n^2).
  • 中文解析 (Chinese Analysis):
    • 数组变化:数组 win 的元素会被按升序(从小到大)进行排列。与此同时,数组 grade 中的等级元素会与 win 数组同步进行位置交换,以维持原有的“中奖号码-中奖等级”的一一对应关系。
    • 时间复杂度:平均时间复杂度为 O(n2)O(n^2)
    • 原因:这是因为外层循环共执行 n1n-1 次,而在第 ii 次循环中,内层循环会执行相邻元素比较共 nin-i 次。因此,总的比较次数为定值 i=1n1(ni)=n(n1)2\sum_{i=1}^{n-1} (n-i) = \frac{n(n-1)}{2}。在输入乱序的平均情况下,大约有半数比较会伴随元素交换,因此总操作次数与 n2n^2 成正比,即为 O(n2)O(n^2)

(3)#

  • 日本語 (Japanese): 整列済みの配列 win から二分探索 (Binary Search) を用いて、値が lot に一致する要素を検索する。 戻り値は、lotwin 内に存在する場合はそのインデックス (位置) を返し、存在しない場合は -1 を返す。
  • 英語 (English): It searches for the value lot in the sorted array win using binary search, where n is the size of the array. The return value is the index of lot in the array win if found, and -1 if not found.
  • 中文解析 (Chinese Analysis): functionB 实现了二分查找(Binary Search)算法。它在大小为 n 且已按升序排列的数组 win 中检索值等于 lot 的元素。由于本题中中奖号码各不相同,若找到匹配项,函数将返回该中奖号码在数组 win 中的对应下标(00n1n-1 之间的整数);若未能检索到,则返回 -1

(4-1)#

  • 日本語 (Japanese): (iii)
  • 英語 (English): (iii)
  • 中文解析 (Chinese Analysis): 此段代码实现的是快速排序的 Hoare 分区方案。双指针 ij 分别自左右两端起向中间逼近,在相遇或交叉(i >= j)时结束。 当循环退出时,数组已被分成两个区间:
    • 左半部分:下标从 ti-1,其中所有的元素值均小于或等于枢轴量 xx
    • 右半部分:下标从 j+1w,其中所有的元素值均大于或等于枢轴量 xx。 因此,下一步递归调用的两个子区间分别为 [t, i-1][j+1, w]。空栏的正确填写方式为:(あ) = t, (い) = i-1, (う) = j+1, (え) = w。这与选项 (iii) 完全相符。

(4-2)#

  • 日本語 (Japanese): O(nlogn)O(n \log n)
  • 英語 (English): O(nlogn)O(n \log n)
  • 中文解析 (Chinese Analysis): 修改后的 functionA 采用了快速排序。在平均情况下,每次划分均能将数组大致等分为两部分,使得递归树的深度为 O(logn)O(\log n)。在每一层递归中,分区的线性扫描操作总计花费 O(n)O(n) 时间。根据主定理,总的平均时间复杂度为 O(nlogn)O(n \log n)

(5)#

  • 日本語 (Japanese):
    • 下線 (ア): grade, win, 0, n-1
    • 下線 (イ): (k = (lot == win[0] ? 0 : -1)) != -1
  • 英語 (English):
    • Underline (ア): grade, win, 0, n-1
    • Underline (イ): (k = (lot == win[0] ? 0 : -1)) != -1
  • 中文解析 (Chinese Analysis):
    • 逻辑分析: 题目限定只能修改 main 函数中 functionA 的参数 (ア) 和 if 条件式 (イ),并要求以平均 O(1)O(1) 的时间复杂度判断所持号码 lot 是否中了 1 等奖。 等级有 1 等、2 等、3 等(对应的等级数值为 1, 2, 3)。由于 NN 个奖项中,1 等奖刚好只有 1 本,2 等奖 1 本,3 等奖 N2N-2 本。 如果我们改变排序时的键值,将等级数组 grade 传作主数组 a,将中奖号码数组 win 传作辅数组 b,即执行: functionA(grade, win, 0, n-1); (ア) 那么,程序会对等级值进行升序排序。排序后,grade 数组中的元素会被整理为: grade[0] = 1(1等), grade[1] = 2(2等), 其余为 3。 相应的,win 数组也作了同步交换,此时 win[0] 中存储的必定是唯一的 1 等奖中奖号码,win[1] 存放的是 2 等奖号码。 因此,我们不再需要进行全局的二分查找,只需在 O(1)O(1) 时间内比对所持号码 lotwin[0] 即可判断是否中了 1 等奖。 为适配后续代码的输出 grade[k](需要打印出中奖等级 1,即 grade[0]),我们需要在比对成功时令 k = 0,失败时令 k = -1。 因此,条件式 (イ) 应写为包含赋值的表达式:(k = (lot == win[0] ? 0 : -1)) != -1

2 【必須問題】計算機システムとシステムプログラム#

Description#

配点: (1-1) 10点, (1-2) 12点, (1-3-1) 12点, (1-3-2) 8点, (1-4-1) 6点, (1-4-2) 12点, (2-1) 20点, (2-2) 10点, (2-3-1) 15点, (2-3-2) 20点

(1)#

計算機 (computer) における整数 (integer) の表現 (representation) と算術演算 (arithmetic operation) に関する以下の各問に答えよ。解答は、全て解答用紙の太線枠内に書くこと。

(1-1)#

10進数 (decimal number) の 15-15 を 8[ビット] の符号絶対値表現 (signed magnitude representation) および 1の補数表現 (one’s complement representation) で表した場合のビット列 (bit string) を示せ。

(1-2)#

8[ビット] の 2の補数表現 (two’s complement representation) で表すことのできる正 (positive) の最大値 (maximum value) および負 (negative) の最小値 (minimum value) のビット列を示せ。また、それらを 10進数の数値で示せ。

(1-3)#

計算機で符号付き整数 (signed integer) の加算を行なう時、多くの場合、2の補数表現が用いられる。2の補数表現を用いた加算に関する以下の (1-3-1)、(1-3-2) に答えよ。

(1-3-1)#

43+(5)43 + (-5) の加算を 8[ビット] の 2の補数表現を用いて行う過程を示せ。最上位ビットからの桁上げ (carry) 出力の扱いも記すこと。

(1-3-2)#

計算機上で符号付き整数の加算に 2の補数表現を用いる利点を一つ示せ。

(1-4)#

二つの整数 A,BA, B を加算し、整数 SS を得る演算を考える。A,B,SA, B, S は同じビット長とする。A,B,SA, B, S のビット列の最上位ビットをそれぞれ a,b,sa, b, s とし、加算器の最上位ビットからの桁上げ出力を cc とする。このとき、以下の (1-4-1)、(1-4-2) に答えよ。

(1-4-1)#

A,B,SA, B, S が符号無し整数の場合、オーバーフロー (overflow) の発生を判定する方法を、変数 a,b,s,ca, b, s, c を用いて示せ。なお、必要の無い変数は使わなくて良い。

(1-4-2)#

A,B,SA, B, S が 2の補数表現で表された符号付き整数の場合、オーバーフローの発生を判定する方法を、変数 a,b,s,ca, b, s, c を用いて示せ。なお、必要の無い変数は使わなくて良い。

(2)#

単一プロセッサ (single processor) のマルチタスク (multitask) 環境における排他制御 (exclusive control) に関する以下の各小問に答えよ。解答は、全て解答用紙の太線枠内に書くこと。

(2-1)#

排他制御を実現する際には、デッドロック状態 (deadlock) や飢餓状態 (starvation) になることを避ける必要がある。それぞれの状態について説明せよ。

(2-2)#

以下に示すプロセス1とプロセス2は、右図に示すようなスタック (stack) の操作を実現する。プロセス1はスタックへのデータのプッシュ (push) を行い、プロセス2はスタックからのデータのポップ (pop) を行う。スタックには事前にデータ d1,d2,,dnd_1, d_2, \dots, d_n が格納されている。top はスタックの先頭 (stack top) のアドレスを表す変数であり、二つのプロセスが共有している。top は事前に xx に設定されている。stack() は引数 (argument) で指定されたアドレスのデータを表す。push_itempop_item はデータを表す変数であり、push_item には事前に値が設定されている。スタックはプロセス1とプロセス2のみが共有しており、スタックの操作を実行するプロセスは他に存在しない。

  • (ア) top = top - 1;

  • (イ) stack(top) = push_item;

  • プロセス1 (Push)

  • (ウ) pop_item = stack(top);

  • (エ) top = top + 1;

  • プロセス2 (Pop)

プロセス1とプロセス2が並行に動作した時に、二つのプロセスの命令実行とプロセス切り替えのタイミングによっては、プロセス1が実行するプッシュ操作とプロセス2が実行するポップ操作のいずれか、あるいは両方が正しく行われないことがある。そのような (ア)(イ)(ウ)(エ) の実行順序 (execution order) のうち、(ア) から開始されるものを一つ示せ。

(2-3)#

セマフォ (semaphore) を用いて、(2-2) におけるプロセス1とプロセス2が並行に動作した時においても、プロセス1が実行するプッシュ操作とプロセス2が実行するポップ操作が正しく行われるようにすることを考える。ここで、セマフォは 0 または 1 の値を取るものとする。P()P() はセマフォを引数とし、セマフォが 0 であれば P()P() を実行したプロセスを休止させ、1 であればセマフォを 1 から 0 にする不可分命令 (atomic operation, atomic transaction) である。V()V() はセマフォを引数とし、同じセマフォを引数として実行された P()P() によって休止されたプロセスがあれば起動し、なければセマフォを 0 から 1 にする不可分命令である。このとき、以下の (2-3-1)、(2-3-2) に答えよ。

(2-3-1)#

プロセス1とプロセス2が並行に動作した時においても、プロセス1が実行するプッシュ操作とプロセス2が実行するポップ操作が正しく行われるように、P()P(), V()V(), およびセマフォ a を用いて、プロセス1とプロセス2に適切な命令を追加したものをそれぞれ示せ。また、a の適切な初期値 (initial value) も示せ。

(2-3-2)#

以下に示すプロセス3とプロセス4は、変数 m を共有している。プロセス3は m の値をインクリメント (increment) し続けるプロセスであり、プロセス4は m の値を表示し続けるプロセスである。m は事前に 1 に初期化されており、m を共有するプロセスは他に存在しない。

while (true) {
m = m + 1;
}
/* プロセス3 */
while (true) {
print(m);
}
/* プロセス4 */

プロセス3とプロセス4が並行に動作した時に、プロセス4における m の値の表示が 1,2,3,1, 2, 3, \dots となるようにしたい。P()P(), V()V(), および二つのセマフォ b, c を用いて、プロセス3とプロセス4に適切な命令を追加したものを示せ。また、b, c の適切な初期値も示せ。


Kai#

(1-1)#

  • 日本語 (Japanese):
    • 符号絶対値表現: 10001111
    • 1の補数表現: 11110000
  • 英語 (English):
    • Signed magnitude representation: 10001111
    • One’s complement representation: 11110000
  • 中文解析 (Chinese Analysis): 对于数值 15-15
    1. 符号绝对值表示法:最高位(MSB,第7位)表示正负符号,0表示正数,1表示负数。其余 7 位存储绝对值 15=(0001111)215 = (0001111)_2。结合后即为 10001111
    2. 1的补码表示法:负数的1的补码为对应正数各位按位取反。正数 +15+15 二进制为 00001111,取反后即为 11110000

(1-2)#

  • 日本語 (Japanese):
    • 正の最大値: ビット列 01111111 (10進数: 127127)
    • 負の最小値: ビット列 10000000 (10進数: 128-128)
  • 英語 (English):
    • Maximum positive value: 01111111 (Decimal: 127127)
    • Minimum negative value: 10000000 (Decimal: 128-128)
  • 中文解析 (Chinese Analysis): 在 8 位二进制的 2的补码(Two’s Complement)表示法下:
    • 正的绝对值最大时,最高位(符号位)为 0,数值位全为 1,即 01111111。十进制值为 271=1272^7 - 1 = 127
    • 负的绝对值最大时(即数值最小),最高位为 1,数值位全为 0,即 10000000。十进制值为 27=128-2^7 = -128

(1-3-1)#

  • 日本語 (Japanese): +43+43 の 2の補数表現: 00101011 5-5 の 2の補数表現: 11111011

    加算過程は以下の通り:

    00101011 (43)
    + 11111011 (-5)
    -----------
    100100110 (38)

    最上位ビットからの桁上げ出力 (carry-out) は 1 であるが、8ビットの加算処理においてこの桁上げは無視(破棄)される。最終的な 8ビットの計算結果は 00100110 となり、これは10進数で 3838 に相当し、計算が正しく行われる。

  • 英語 (English): The 2’s complement representation of +43+43: 00101011 The 2’s complement representation of 5-5: 11111011

    The addition process:

    00101011 (43)
    + 11111011 (-5)
    -----------
    100100110 (38)

    The carry-out from the MSB is 1. In 8-bit arithmetic, this carry-out is ignored (discarded). The final 8-bit result is 00100110, which corresponds to 3838 in decimal.

  • 中文解析 (Chinese Analysis): 计算 43+(5)43 + (-5) 的过程:

    • +43+43 转换为 8 位二进制补码:43=32+8+2+143 = 32 + 8 + 2 + 1 \to 00101011
    • 5-5 转换为 8 位二进制补码:+5+5 的二进制为 00000101,按位取反为 11111010,再加 1 得到 11111011
    • 将两个补码按位相加:
      00101011
      + 11111011
      ----------
      100100110
      相加结果得 9 位二进制数 100100110。在 8 位加算器运算中,最左边的溢出进位(carry-out = 1)被直接忽略丢弃。最后保留的 8 位结果为 00100110,转换为十进制是 32+4+2=3832 + 4 + 2 = 38,数值正确。

(1-3-2)#

  • 日本語 (Japanese): 符号の正負に関わらず、減算(引き算)を加算(足し算)と同じ加算器回路(ハードウェア)を用いて同一に処理できること。
  • 英語 (English): Subtractions can be performed using the same adder hardware circuit as additions, avoiding the need for a separate subtractor circuit.
  • 中文解析 (Chinese Analysis): 利于硬件实现。引入 2的补码后,减法运算可以转换为加法来处理,这样计算机在进行符号数加减时,都可以统一使用同一套加法器电路(Adder),无需再单独设计减法器,大大节省了硬件设计成本和电路复杂度。

(1-4-1)#

  • 日本語 (Japanese): c = 1
  • 英語 (English): c = 1
  • 中文解析 (Chinese Analysis): 对于无符号整数相加,只有在最高有效位(MSB)产生向外的进位时,才会发生溢出。因此判断条件为 c=1c = 1

(1-4-2)#

  • 日本語 (Japanese): (a ∧ b ∧ ¬s) ∨ (¬a ∧ ¬b ∧ s) (あるいは、最高位ビットへの桁上げ入力 cinc_{in} と最高位ビットからの桁上げ出力 cc を用いて $c_{in} \neq c$ とする)
  • 英語 (English): (a ∧ b ∧ ¬s) ∨ (¬a ∧ ¬b ∧ s) (Alternatively, using the carry-in to the MSB cinc_{in} and the carry-out cc, the condition is $c_{in} \neq c$)
  • 中文解析 (Chinese Analysis): 有符号补码加法溢出发生在两个同号数相加却得出异号数结果的时刻:
    • 两个负数相加,结果为正数:符号位 a=1,b=1a=1, b=1s=0s=0,对应 (ab¬s)(a \land b \land \neg s)
    • 两个正数相加,结果为负数:符号位 a=0,b=0a=0, b=0s=1s=1,对应 (¬a¬bs)(\neg a \land \neg b \land s)。 因此,判断公式为 (ab¬s)(¬a¬bs)(a \land b \land \neg s) \lor (\neg a \land \neg b \land s)。此外,也可以通过判断最高位的进位输入 cinc_{in} 与进位输出 cc 是否不相等(即 cinc=1c_{in} \oplus c = 1)来判定。

(2-1)#

  • 日本語 (Japanese):
    • デッドロック (Deadlock): 2つ以上のプロセスが、互いに相手が占有しているリソースの解放を待ち続けることで、すべてのプロセスが永久にブロックされて実行が進まなくなる状態。
    • 飢餓状態 (Starvation): システム全体は動作しており他のプロセスは実行できているが、特定のプロセスが競合やスケジューリングの都合により、必要なリソースを永久に割り当てられず、実行を再開できない状態。
  • 英語 (English):
    • Deadlock: A state in which two or more processes are permanently blocked because each process is holding a resource and waiting for another resource held by another process in a circular chain.
    • Starvation: A state where a specific process is perpetually denied necessary resources to make progress, even though the system as a whole is running successfully and other processes are active.
  • 中文解析 (Chinese Analysis):
    • 死锁(Deadlock):指系统中两个或多个进程因循环等待对方所持有的独占资源而全部陷入无限期挂起、永远无法继续执行的僵死状态。
    • 饥饿(Starvation):指在多任务调度中,某个特定进程由于资源分配优先级或调度算法设计缺陷,导致长时期甚至永久性地无法获得执行所需的资源,从而无法推进。此时系统整体依然在正常轮转并处理其他进程(没有陷入死锁)。

(2-2)#

  • 日本語 (Japanese): 実行順序: (ア) \to (ウ) \to (イ) \to (エ) 理由: top = x の状態からプロセス1が (ア) top = top - 1 を実行すると、topx - 1 になる。この段階でプロセス切り替えが起き、プロセス2が (ウ) pop_item = stack(top) を実行すると、まだデータが書き込まれていない stack(x-1) の未定義の値を読み込んでポップしてしまう。その後、(イ)(エ) が順に実行されると、top は最終的に x に戻るが、プッシュしたはずの push_itemstack(x-1) に放置され、アクセス不可能(消失)になる。
  • 英語 (English): Execution order: (ア) \to (ウ) \to (イ) \to (エ) Reason: Initially top = x. Process 1 executes (ア) top = top - 1, setting top to x - 1. If a context switch occurs here and Process 2 runs (ウ) pop_item = stack(top), Process 2 pops uninitialized, invalid data from stack(x-1) instead of popping the valid item d1 from stack(x). Subsequently, (イ) and (エ) execute, resetting top to x. The pushed item is left at stack(x-1) and becomes inaccessible, resulting in data loss.
  • 中文解析 (Chinese Analysis): 产生异常的执行顺序为:(ア) \to (ウ) \to (イ) \to (エ)。
    • 过程追踪
      1. 初始状态下 top = x
      2. 进程1执行 (ア) top = top - 1,将 top 变更为 x - 1。随后时钟中断触发进程切换。
      3. 进程2执行 (ウ) pop_item = stack(top),即执行 pop_item = stack(x-1)。由于此时新元素还没有被压入,进程2实际上弹出了越界的、未定义的内存垃圾数据。
      4. 进程1重新调度执行 (イ) stack(top) = push_item,把元素写入到 stack(x-1)
      5. 进程2执行 (エ) top = top + 1,将 top 恢复为 x
    • 异常结果:进程2弹出了错误的数据;新压入的数据留在了 stack(x-1) 处,但由于栈顶指针恢复为了 x,这个新数据再也无法被读取,等同于数据被遗弃丢失。

(2-3-1)#

  • 日本語 (Japanese):
    • プロセス1 (Push):
      P(a);
      top = top - 1;
      stack(top) = push_item;
      V(a);
    • プロセス2 (Pop):
      P(a);
      pop_item = stack(top);
      top = top + 1;
      V(a);
    • 初期値: a = 1
  • 英語 (English):
    • Process 1 (Push): [Code above]
    • Process 2 (Pop): [Code above]
    • Initial Value: a = 1
  • 中文解析 (Chinese Analysis): 使用一个互斥二值信号量 a。通过在进/出栈的临界区代码段前后分别插入 P(a)P(a)V(a)V(a) 命令,实现同一时间只允许一个进程对栈结构(top 指针和 stack 数组)进行操作。信号量 a 的初值应设为 1

(2-3-2)#

  • 日本語 (Japanese):
    • プロセス3:
      while (true) {
      P(b);
      m = m + 1;
      V(c);
      }
    • プロセス4:
      while (true) {
      P(c);
      print(m);
      V(b);
      }
    • 初期値: b = 0, c = 1
  • 英語 (English):
    • Process 3: [Code above]
    • Process 4: [Code above]
    • Initial Values: b = 0, c = 1
  • 中文解析 (Chinese Analysis): 为满足输出序列为 1, 2, 3, ... 的同步要求,两进程必须紧密交替执行:进程4先打印当前的 m 值(第一轮为初值1),打印完毕后放行进程3;进程3把 m 增加1(第二轮变为2),然后放行进程4。 我们引入两个控制同步的信号量:
    • b:控制进程3是否被允许进行自增。初值为 0
    • c:控制进程4是否被允许执行打印。因为一开始必须首先打印初值 1,所以初值设为 1,使得第一步 P(c) 可以顺利通过。
    • 工作序列
      1. 进程4运行,P(c) 成功减为 0,打印 m(即 1),随后 V(b) 释放 bb 变为 1)。
      2. 进程3运行,P(b) 成功减为 0,执行 m = m + 1m 变 2),随后 V(c) 释放 cc 变 1)。
      3. 进程4再次被唤醒运行,完成下一轮迭代。

4 【選択問題】計算理論#

Description#

配点: (1-1) 5点, (1-2) 5点, (1-3) 35点, (1-4) 20点, (2-1) 35点, (2-2) 25点

(1)#

アルファベット (alphabet) Σab={a,b}\Sigma_{ab} = \{a, b\} で構成される回文 (palindrome) を考える。回文とは前から読んでも後ろから読んでも同じ文字列 (string) のことである。例えば、b,aa,aba,baabb, aa, aba, baab は回文だが、ab,abb,baaaab, abb, baaa は回文ではない。なお、文字列 ww の長さを w|w| と表す。例えば、b=1|b|=1, abb=3|abb|=3 である。また、空列 (empty string) ε\varepsilon (ε=0|\varepsilon|=0) は回文である。回文を受理するオートマトン (automaton) に関する以下の各問に答えよ。

(1-1)#

決定性有限オートマトン (deterministic finite automaton) は (Q,Σ,δ,q0,F)(Q, \Sigma, \delta, q_0, F) で表される。QQ は状態 (state) の有限集合、Σ\Sigma は入力アルファベット (input alphabet)、δ\delta は遷移関数 (transition function)、q0q_0 は開始状態 (start state)、FF は最終状態 (final state) の集合である。言語 (language) {pΣabp=2,p is a palindrome}\{ p \in \Sigma_{ab}^* \mid |p| = 2, p \text{ is a palindrome} \} を受理する決定性有限オートマトンの状態遷移図 (state transition diagram) を書け。なお、下図に示すように開始状態には太い矢印(thick arrow)を付与し、最終状態は二重丸(double circle)で表現すること。下図では、開始状態は q0q_0、最終状態は q2q_2 である。

(1-2)#

言語 {pΣabp=3,p is a palindrome}\{ p \in \Sigma_{ab}^* \mid |p| = 3, p \text{ is a palindrome} \} を受理する決定性有限オートマトンの状態遷移図を書け。なお、下図に示すように開始状態には太い矢印を付与し、最終状態は二重丸で表現すること。

(1-3)#

言語 {pΣabp0,p is a palindrome}\{ p \in \Sigma_{ab}^* \mid |p| \ge 0, p \text{ is a palindrome} \} を受理する決定性有限オートマトンは存在しないこと、すなわち、この言語は正則言語 (regular language) ではないことを背理法 (proof by contradiction) により証明せよ。なお、以下の正則言語に対する反復補題 (pumping lemma) を用いること。

正則言語に対する反復補題 LL を正則言語とすると、次の条件を満たす正の整数 nn が存在する: vLv \in L, vn|v| \ge n なら vvv=xyzv = xyz (xyn,y1|xy| \le n, |y| \ge 1) と分解でき、任意の k0k \ge 0 に対して xykzLx y^k z \in L である。

(1-4)#

プッシュダウンオートマトン (pushdown automaton) は (Q,Σ,Γ,δ,q0,Z,F)(Q, \Sigma, \Gamma, \delta, q_0, Z, F) で表される。QQ は状態の有限集合、Σ\Sigma は入力アルファベット、Γ\Gamma はスタックアルファベット (stack alphabet)、δ\delta は遷移関数、q0q_0 は開始状態、ZZ はスタックの開始記号、FF は最終状態の集合である。最終状態による受理 (acceptance by final state) を行うプッシュダウンオートマトンを利用すれば、言語 {pΣabp0,p is a palindrome}\{ p \in \Sigma_{ab}^* \mid |p| \ge 0, p \text{ is a palindrome} \} を受理できる。以下はそのような非決定性プッシュダウンオートマトンの状態遷移図である。状態遷移図の「(あ)」に必要な動作を、(r,s)/t(r, s)/t の形式ですべて答えよ。

ただし、(r,s)/t(r, s)/t は、入力から rr を読み出すときにスタックの先頭にある記号 ss を取り去り、tt をスタックに押し込むことを意味する。tt が複数の記号の場合は右側の記号から順にスタックに押し込む。例えば、下図の (a,Z)/0Z(a, Z)/0Z は、aa を読み出すときにスタックの先頭から ZZ を取り去り、スタックに ZZ00 をこの順で押し込むことを意味する。ttε\varepsilon の場合は、スタックに記号を押し込まない。rrε\varepsilon の場合は、入力から記号を読み出さないで遷移を行う。スタックアルファベットは Γ={Z,0,1}\Gamma = \{Z, 0, 1\} とする。

┌──────┐
(a, Z)/0Z │ │
(a, 0)/00 │ │
(a, 1)/01 │ │
(b, Z)/1Z │ (あ) │ (a, 0)/ε
(b, 0)/10 │ │ (b, 1)/ε
(b, 1)/11 │ │
┌───┐ │ │ ┌───┐ (ε, Z)/Z ┌───┐
──===> │q0 │ ───────┼──────┼====> │q1 │ ──────────────> │q2 │
└───┘ │ │ └───┘ └───┘
↺ │ │ ↺
└──────┘

(2)#

文脈自由文法 (context-free grammar) は一般に G=(V,T,P,S)G = (V, T, P, S) で定められる。ここで VV は変数 (variable; 非終端記号 nonterminal symbol) の集合、TT は終端記号 (terminal symbol) の集合、PP は生成規則 (production rule) の集合、SS は出発記号 (start symbol) であり、SVS \in V である。文脈自由文法 G1=(V1,T1,P1,S1)G_1 = (V_1, T_1, P_1, S_1)V1={A}V_1 = \{A\}, T1={a,b}T_1 = \{a, b\}, P1={AaAbA,AbAaA,Aε}P_1 = \{ A \to aAbA, A \to bAaA, A \to \varepsilon \}, S1=AS_1 = A と定める。L1L_1G1G_1 により生成される言語 (language) とする。L1L_1 は同じ個数 (the same number) の ab を含む文字列 (string) すべてからなる言語であることを証明したい。以下の各小問に答えよ。

【注】文字列とは終端記号の列である。任意の文字列 ww に対し、記法 w|w|ww の中の終端記号すべての個数を、wa|w|_aww の中の終端記号 a の個数を、wb|w|_bww の中の終端記号 b の個数を、それぞれ表す。例えば w=aabaw = aaba に対して、w=4|w|=4, wa=3|w|_a = 3, wb=1|w|_b = 1 である。ε\varepsilon は空列 (empty string) を表す。記法 αβ\alpha \Rightarrow \beta は文法 G1G_1 の生成規則を 1回適用することで文形式 (sentential form) α\alpha から文形式 β\beta が得られることを表す。

(2-1)#

L1L_1 に含まれている任意の文字列 ww に対して ww は同じ個数の ab を含んでいること、すなわち必要条件 wT1[wL1    wa=wb]\forall w \in T_1^* [w \in L_1 \implies |w|_a = |w|_b] を証明したい。空欄 (ア) を埋めよ。

証明: 生成規則を適用する回数 kk に関する数学的帰納法 (mathematical induction) で証明する。

  • 基底段階 (base case): k=1k=1 の場合。1回の生成規則の適用で文字列を得る導出 (derivation) は AεA \Rightarrow \varepsilon のみである。w=εw = \varepsilon とすれば εa=εb=0|\varepsilon|_a = |\varepsilon|_b = 0 なので、wa=wb|w|_a = |w|_b が成立する。
  • 帰納段階 (inductive step): k>1k > 1 の場合。k1k-1 回以下の生成規則の適用で得られる文字列 vv はいずれも va=vb|v|_a = |v|_b が成立すると仮定する。すると以下の理由により wa=wb|w|_a = |w|_b が成立する。

理由: ┌────────────────────────────────────────────────────────┐ │ │ │ (ア) │ │ │ └────────────────────────────────────────────────────────┘ (証明終)

(2-2)#

同じ個数の ab を含んでいる任意の文字列 ww に対して wwL1L_1 に含まれていること、すなわち十分条件 wT1[wa=wb    wL1]\forall w \in T_1^* [|w|_a = |w|_b \implies w \in L_1] を証明したい。空欄 (イ)(エ) を埋めよ。

証明: 文字列 ww の長さ w|w| に関する帰納法で証明する。w|w| は 0 以上の偶数 (even number) なのは明らかである。

  • 基底段階: w=0|w|=0 の場合。以下の理由により wL1w \in L_1 が成立する。

理由: ┌────────────────────────────────────────────────────────┐ │ │ │ (イ) │ │ │ └────────────────────────────────────────────────────────┘

  • 帰納段階: w>0|w| > 0 かつ偶数の場合。長さが偶数で w|w| 未満の文字列 vvva=vb|v|_a = |v|_b を満たすならば、vL1v \in L_1 であると仮定する。ww の最初(左端)の終端記号により以下の場合分けをする。
    • a の場合。wa=wb|w|_a = |w|_b のとき、長さが w|w| 未満のある文字列 v1,v2L1v_1, v_2 \in L_1 が存在して w=av1bv2w = a v_1 b v_2 と書けることが示せる(証明略)。従って、導出 AA \Rightarrow (ウ) av1bv2=w\Rightarrow \dots \Rightarrow a v_1 b v_2 = w により wL1w \in L_1 が成立する。
    • b の場合。wa=wb|w|_a = |w|_b のとき、長さが w|w| 未満のある文字列 v1,v2L1v_1, v_2 \in L_1 が存在して w=bv1av2w = b v_1 a v_2 と書けることが示せる(証明略)。従って、導出 AA \Rightarrow (エ) bv1av2=w\Rightarrow \dots \Rightarrow b v_1 a v_2 = w により wL1w \in L_1 が成立する。 (証明終)

Kai#

(1-1)#

  • 日本語 (Japanese):
    stateDiagram-v2
    [*] --> q0: 開始
    q0 --> qa: a
    q0 --> qb: b
    qa --> q2: a
    qa --> qd: b
    qb --> qd: a
    qb --> q2: b
    q2 --> qd: a, b
    qd --> qd: a, b
    状態定義:
    • q0q_0: 開始状態(長さ0)
    • qaq_a: 文字 a を1つ読んだ状態(長さ1)
    • qbq_b: 文字 b を1つ読んだ状態(長さ1)
    • q2q_2: aa または bb を読んだ状態(受理状態、長さ2)
    • qdq_d: 回文にならない、もしくは長さが3以上の文字列(デッド状態)
  • 英語 (English): [State transition diagram above] State definitions:
    • q0q_0: Start state (length 0)
    • qaq_a: Read single a (length 1)
    • qbq_b: Read single b (length 1)
    • q2q_2: Read aa or bb (accepting state, length 2)
    • qdq_d: Dead state for invalid or longer strings
  • 中文解析 (Chinese Analysis): 长度为 2 的回文串只有 aabb。DFA 从初始状态 q0q_0 开始,分别读取第一个字符 ab 转向状态 qaq_aqbq_b;在第二个字符与第一个字符相同时,转移至唯一接收状态 q2q_2。若第二字符不匹配或长度超过 2,则统一进入陷阱死状态 qdq_d

(1-2)#

  • 日本語 (Japanese):
    stateDiagram-v2
    [*] --> q0: 開始
    q0 --> qa: a
    q0 --> qb: b
    qa --> qaa: a
    qa --> qab: b
    qb --> qba: a
    qb --> qbb: b
    qaa --> q3: a
    qaa --> qd: b
    qab --> q3: a
    qab --> qd: b
    qba --> qd: a
    qba --> q3: b
    qbb --> qd: a
    qbb --> q3: b
    q3 --> qd: a, b
    qd --> qd: a, b
    状態定義:
    • q0q_0: 開始状態
    • qa,qbq_a, q_b: 長さ1の文字列を読んだ状態
    • qaa,qab,qba,qbbq_{aa}, q_{ab}, q_{ba}, q_{bb}: 長さ2の各文字列を読んだ状態
    • q3q_3: 受理状態(aaa, aba, bab, bbb のいずれかを読んだ状態)
    • qdq_d: 受理条件を満たさない文字列用のデッド状態
  • 英語 (English): [State transition diagram above] State definitions:
    • q0q_0: Start state
    • qa,qbq_a, q_b: States after reading length 1 string
    • qaa,qab,qba,qbbq_{aa}, q_{ab}, q_{ba}, q_{bb}: States after reading length 2 strings
    • q3q_3: Accepting state (after reading aaa, aba, bab, or bbb)
    • qdq_d: Dead state
  • 中文解析 (Chinese Analysis): 长度为 3 的回文串只有 aaa, aba, bab, bbb。我们建立状态记录前两位的不同路径组合(qaa,qab,qba,qbbq_{aa}, q_{ab}, q_{ba}, q_{bb})。第三位读入时只有当首尾字符相同时才进入接收状态 q3q_3,其它多余或不相等的字符输入全部导向死状态 qdq_d

(1-3)#

  • 日本語 (Japanese): 言語 L={pΣabp is a palindrome}L = \{ p \in \Sigma_{ab}^* \mid p \text{ is a palindrome} \} が正則言語であると仮定し、反復補題の定数を nn とする。 文字列 s=anbans = a^n b a^n を考えると、明らかに sLs \in L であり、かつ長さは s=2n+1n|s| = 2n + 1 \ge n である。 反復補題の定義より、文字列 ss は以下の3つの条件を満たす s=xyzs = xyz に分割できる:

    1. xyn|xy| \le n
    2. y1|y| \ge 1
    3. 任意の k0k \ge 0 に対して xykzLx y^k z \in L

    条件1より、xyxyss の先頭の nn 個の終端記号(すべて a)の領域に含まれる。したがって、y=amy = a^m (m1m \ge 1) と表すことができる。 ここで k=0k = 0 の場合を考えると、得られる文字列は xz=anmbanxz = a^{n-m} b a^n となる。 条件2より m1m \ge 1 であるため、この文字列中の左側の a の個数 nmn-m は、右側の a の個数 nn と一致しない。したがって、xzxz は回文ではなくなり、xzLxz \notin L となる。 これは条件3の xy0zLx y^0 z \in L に矛盾する。 したがって、仮定は誤りであり、言語 LL は正則言語ではない。

  • 英語 (English): Assume L={pΣabp is a palindrome}L = \{ p \in \Sigma_{ab}^* \mid p \text{ is a palindrome} \} is a regular language, and let nn be the pumping lemma constant. Consider the string s=anbans = a^n b a^n. Clearly, sLs \in L and s=2n+1n|s| = 2n + 1 \ge n. According to the pumping lemma, ss can be partitioned into s=xyzs = xyz satisfying:

    1. xyn|xy| \le n
    2. y1|y| \ge 1
    3. xykzLx y^k z \in L for all k0k \ge 0.

    By condition 1, xyxy must lie entirely within the first nn characters of ss (which are all aa‘s). Thus, we can write y=amy = a^m for some m1m \ge 1. Let k=0k = 0. The pumped string is xz=anmbanxz = a^{n-m} b a^n. Since m1m \ge 1, we have nm<nn-m < n. The number of aa‘s on the left (nmn-m) is less than the number of aa‘s on the right (nn), meaning that xzxz is not a palindrome (xzLxz \notin L). This contradicts condition 3. Therefore, the initial assumption is false, and LL is not a regular language.

  • 中文解析 (Chinese Analysis): 采用反证法:

    • 假设回文语言 LL 是正则的,由泵引理知存在一个泵常数 nn
    • 构造字符串 s=anbans = a^n b a^n。容易验证 ss 是回文串,所以 sLs \in L,且长度为 2n+1n2n+1 \ge n
    • 根据泵引理,字符串 ss 应可以拆分为 xyzxyz,且满足 xyn|xy| \le ny1|y| \ge 1
    • 由于 xyn|xy| \le nxyxy 部分只能完全位于字符串最左端的 ana^n 内部。所以子串 yy 必定是一段纯 aa 串,可表示为 y=amy = a^mm1m \ge 1
    • 当我们将 yy 泵出(即令 k=0k = 0)时,生成新串 xz=anmbanxz = a^{n-m} b a^n
    • 由于 m1m \ge 1,导致新串左侧的 aa 的数量 nmn-m 小于右侧 aa 的数量 nn,新字符串失去了回文性质(xzLxz \notin L)。这与泵引理中要求 xzLxz \in L 的断言相矛盾。
    • 故原假设不成立,回文串语言 LL 并非正则语言。

(1-4)#

  • 日本語 (Japanese):
    • (ε,Z)/Z(\varepsilon, Z) / Z
    • (ε,0)/0(\varepsilon, 0) / 0
    • (ε,1)/1(\varepsilon, 1) / 1
    • (a,Z)/Z(a, Z) / Z
    • (a,0)/0(a, 0) / 0
    • (a,1)/1(a, 1) / 1
    • (b,Z)/Z(b, Z) / Z
    • (b,0)/0(b, 0) / 0
    • (b,1)/1(b, 1) / 1
  • 英語 (English): The transitions in the box (あ) are: [List of 9 transitions above]
  • 中文解析 (Chinese Analysis): 下推自动机需要非确定性地猜测回文串的中心线。从 q0q_0q1q_1 的状态转移即表示“跨越对称中点”:
    • 对于偶数长度回文串,中点不包含任何独立字符。自动机执行空转移 ε\varepsilon,且不修改栈状态:即 (ε,Z)/Z,(ε,0)/0,(ε,1)/1(\varepsilon, Z)/Z, (\varepsilon, 0)/0, (\varepsilon, 1)/1
    • 对于奇数长度回文串,中点包含一个多余的中心字符(ab)。自动机在跳转时读入该字符,但不改变栈:即 (a,Z)/Z,(a,0)/0,(a,1)/1(a, Z)/Z, (a, 0)/0, (a, 1)/1(b,Z)/Z,(b,0)/0,(b,1)/1(b, Z)/Z, (b, 0)/0, (b, 1)/1。 因此,框 (あ) 中共有 9 条转移关系。

(2-1)#

  • 日本語 (Japanese): k>1k > 1 の場合、導出の最初のステップは AaAbAA \Rightarrow aAbA または AbAaAA \Rightarrow bAaA である。 AaAbAA \Rightarrow aAbA の場合、この2つの変数 AA はそれぞれ k1k-1 回以下の生成規則の適用により、終端記号列 v1,v2T1v_1, v_2 \in T_1^* を導出する(w=av1bv2w = a v_1 b v_2)。 帰納法の仮定より、v1a=v1b|v_1|_a = |v_1|_b および v2a=v2b|v_2|_a = |v_2|_b が成立する。 したがって、 wa=av1bv2a=1+v1a+v2a=1+v1b+v2b=av1bv2b=wb|w|_a = |a v_1 b v_2|_a = 1 + |v_1|_a + |v_2|_a = 1 + |v_1|_b + |v_2|_b = |a v_1 b v_2|_b = |w|_b となり、wa=wb|w|_a = |w|_b が成立する。 AbAaAA \Rightarrow bAaA の場合も同様に(w=bv1av2w = b v_1 a v_2)、 wa=bv1av2a=1+v1a+v2a=1+v1b+v2b=bv1av2b=wb|w|_a = |b v_1 a v_2|_a = 1 + |v_1|_a + |v_2|_a = 1 + |v_1|_b + |v_2|_b = |b v_1 a v_2|_b = |w|_b となり、wa=wb|w|_a = |w|_b が成立する。
  • 英語 (English): For k>1k > 1, the first step of the derivation is either AaAbAA \Rightarrow aAbA or AbAaAA \Rightarrow bAaA. In the case of AaAbAA \Rightarrow aAbA, the two variables AA derive terminal strings v1,v2T1v_1, v_2 \in T_1^* respectively using k1k-1 or fewer steps (giving w=av1bv2w = a v_1 b v_2). By the induction hypothesis, we have v1a=v1b|v_1|_a = |v_1|_b and v2a=v2b|v_2|_a = |v_2|_b. Therefore, wa=1+v1a+v2a=1+v1b+v2b=wb|w|_a = 1 + |v_1|_a + |v_2|_a = 1 + |v_1|_b + |v_2|_b = |w|_b, and the statement holds. In the case of AbAaAA \Rightarrow bAaA, the two variables AA derive terminal strings v1,v2T1v_1, v_2 \in T_1^* with w=bv1av2w = b v_1 a v_2. Similarly, wa=1+v1a+v2a=1+v1b+v2b=wb|w|_a = 1 + |v_1|_a + |v_2|_a = 1 + |v_1|_b + |v_2|_b = |w|_b holds.
  • 中文解析 (Chinese Analysis): 当归纳步骤 k>1k > 1 时,推导的第一步要么是 AaAbAA \Rightarrow aAbA,要么是 AbAaAA \Rightarrow bAaA
    • 在第一步为 AaAbAA \Rightarrow aAbA 时,推导出的字符串格式为 w=av1bv2w = a v_1 b v_2,其中子串 v1v_1v2v_2 分别由生成式中的两个 AA 经不超过 k1k-1 步规则生成。根据数学归纳法假设,此时 v1v_1v2v_2 必定含有相同数量的 ab,即满足 v1a=v1b|v_1|_a = |v_1|_bv2a=v2b|v_2|_a = |v_2|_b。因此整个串满足:wa=1+v1a+v2a=1+v1b+v2b=wb|w|_a = 1 + |v_1|_a + |v_2|_a = 1 + |v_1|_b + |v_2|_b = |w|_b
    • 类似地,当第一步为 AbAaAA \Rightarrow bAaA 时,可写成 w=bv1av2w = b v_1 a v_2,同样有:wa=1+v1a+v2a=1+v1b+v2b=wb|w|_a = 1 + |v_1|_a + |v_2|_a = 1 + |v_1|_b + |v_2|_b = |w|_b。归纳成立。

(2-2)#

  • 日本語 (Japanese):
    • (イ): 生成規則の中に AεA \to \varepsilon が存在するため、Aε=wA \Rightarrow \varepsilon = w となり、wL1w \in L_1 が成立する。
    • (ウ): aAbA
    • (エ): bAaA
  • 英語 (English):
    • (イ): Since AεP1A \to \varepsilon \in P_1, we have Aε=wA \Rightarrow \varepsilon = w, hence wL1w \in L_1 holds.
    • (ウ): aAbA
    • (エ): bAaA
  • 中文解析 (Chinese Analysis):
    • (イ):当字符串长度 w=0|w|=0w=εw=\varepsilon 时,由于文法规则集合中包含 AεA \to \varepsilon,推导 Aε=wA \Rightarrow \varepsilon = w 成立,因此 wL1w \in L_1
    • (ウ):首字母为 a,表示为 w=av1bv2w = a v_1 b v_2。我们使用产生式 AaAbAA \to aAbA 来匹配首尾的 ab,然后分别由两个 AA 递归生成 v1v_1v2v_2,故此处需填入 aAbA
    • (エ):首字母为 b,表示为 w=bv1av2w = b v_1 a v_2。我们使用产生式 AbAaAA \to bAaA 来匹配首尾的 ba,故此处需填入 bAaA

5 【選択問題】ネットワーク#

Description#

配点: (1-1-1) 6点, (1-1-2) 6点, (1-2-1) 15点, (1-2-2) 6点, (1-2-3) 12点, (1-3) 15点, (2-1) 20点, (2-2) 15点, (2-3-1) 10点, (2-3-2) 10点, (2-3-3) 10点

(1)#

次のような記憶がない情報源 (memoryless information source) SS を考える。情報源 SS の記号数 ss は 2以上とし、情報源記号は a1,a2,,asa_1, a_2, \dots, a_s、各 ii (1is1 \le i \le s) について記号 aia_i の生起確率 (occurrence probability) は 2mi2^{-m_i} で表される。ここで、m1,m2,,msm_1, m_2, \dots, m_s は、1m1m2ms1 \le m_1 \le m_2 \le \dots \le m_s を満たす整数である。このとき、各 ii (1is1 \le i \le s) について記号 aia_i に対する符号語長 (code length) が mim_i である瞬時に復号可能な符号化 (instantly decodable source coding) が存在することについて以下の各小問に答えよ。

(1-1)#

特別な場合として、s=6s = 6, m1=1m_1 = 1, m2=2m_2 = 2, m3=m4=m5=m6=4m_3 = m_4 = m_5 = m_6 = 4 である情報源 S0S_0 を考える。

(1-1-1)#

この場合に題意を満たす符号化(下線部)の復号木 (decoding tree) を一つ示せ。通信路記号は 0, 1 とせよ。なお、復号木は符号の木 (code tree) とも呼ばれている。

(1-1-2)#

上で復号木を示した符号化の平均符号語長、および情報源 S0S_0 の 2を底とするエントロピー (entropy) を求めよ。

(1-2)#

一般の場合に題意を満たす符号化(下線部)が存在することを、記号数 ss に関する数学的帰納法 (mathematical induction) により証明したい。

(1-2-1)#

証明の準備として、以下の文章の各空欄を埋めることにより、常に、 ms1=msm_{s-1} = m_s であることを示せ。なお、空欄 (い)(え) には、それぞれ「偶数」または「奇数」のいずれかの語を埋めよ。

2msi=1s2mi=2^{m_s} \sum_{i=1}^s 2^{-m_i} = (あ) である。ms1m_s \ge 1 なので、2msi=1s2mi2^{m_s} \sum_{i=1}^s 2^{-m_i}(い) である。ms1msm_{s-1} \ne m_s と仮定すれば、2msi=1s12mi2^{m_s} \sum_{i=1}^{s-1} 2^{-m_i}(う) であり、これらの差 2msi=1s2mi2msi=1s12mi2^{m_s} \sum_{i=1}^s 2^{-m_i} - 2^{m_s} \sum_{i=1}^{s-1} 2^{-m_i}(え) となるが、差の値

2msi=1s2mi2msi=1s12mi=(o)2^{m_s} \sum_{i=1}^s 2^{-m_i} - 2^{m_s} \sum_{i=1}^{s-1} 2^{-m_i} = \text{(o)}

であり矛盾する。

(1-2-2)#

証明の基底段階 (base case) を示せ。すなわち、s=2s = 2 のときに題意を満たす符号化が存在することを示せ。

(1-2-3)#

証明の帰納段階 (inductive step) を示せ。

(1-3)#

以下の文章の各空欄を埋めよ。なお、空欄 (う) には人名(姓 family name)を埋めよ。また、空欄 (お) には「がある」または「はない」のどちらかを埋めよ。

一般の場合に、情報源 SS の 2を底とするエントロピーは (あ) である。小問 (1-2) で存在を示した符号化の平均符号語長は (い) であり、 (う)(え) 定理から、 SSnn 次拡大 (n-th extension) に対する符号化を考えた場合に、一記号あたりの平均符号語長がより小さい符号化が存在する可能性 (お)

(2)#

図1に概要を示すディスタンスベクトル型ルーティングアルゴリズム (distance vector routing algorithm) を用いて最小コスト経路 (minimum cost route) を決めることを考える。これについて以下の各小問に答えよ。

記号
N 全ノードの集合.
c(i,j) ノード i からノード j へのリンクのコスト. c(i,j) ≧ 0, c(i,i) = 0 とする. また,
ノード i からノード j へリンクがない場合は c(i,j) = ∞ とする.
di(j) ノード i において, その時点でノード i が知るノード i からノード j までの最小
コスト経路のコストを保持する変数.
Di ノード i の持つディスタンスベクトル. N = {x,y,z} の場合, Di は以下の通り
とする.
Di = [di(x) の値, di(y) の値, di(z) の値]
初期状態
* 各ノード i において c(i,j) は既知である (∀j ∈ N).
* 各ノード i において di(j) = c(i,j) である (∀j ∈ N).
動作
全ノードは, 各ステップで以下の動作I, 動作IIのそれぞれを同期的に (synchronously) に
実行し, そのステップを繰り返し実行する.
動作 I. 各ノード i は, 隣接 (adjacent) ノードにディスタンスベクトル Di を送信し,
自身に送信されたディスタンスベクトルを受信する.
動作 II. 各ノード i は, 受信したすべてのディスタンスベクトルにもとづいて, 自身の
ディスタンスベクトル Di を更新する.
経路の収束 (convergence)
前ステップと現ステップの間で Di (∀i ∈ N) の値に変化がなくなることを経路が収束す
ると定義する. 最小コスト経路は, 収束したときの各ノードが持つ情報から導出できる.

図1:ディスタンスベクトル型ルーティングアルゴリズムの概要

(2-1)#

図1の動作IIの下線部における DiD_i の更新方法を数式で記述せよ。記述に必要な記号を新たに定義しても構わないが、定義した記号の説明も解答に含めよ。

(2-2)#

図2に示すネットワークを考える。リンクのコストは、それぞれ c(x,y)=c(y,x)=2c(x,y) = c(y,x) = 2, c(x,z)=c(z,x)=8c(x,z) = c(z,x) = 8, c(y,z)=c(z,y)=3c(y,z) = c(z,y) = 3 である。また、動作Iでは送信したディスタンスベクトルは紛失なく届くものとする。このとき、図1の初期状態の直後の更新をステップ1として、経路が収束するまでの各ステップについて、動作Iにおいてノード xx が受信したディスタンスベクトル DyD_yDzD_z、および、動作IIにおいて更新した後のノード xx のディスタンスベクトル DxD_x を記述せよ。ただし、DiD_i (i{x,y,z}i \in \{x,y,z\}) は、Di=[di(x) value,di(y) value,di(z) value]D_i = [d_i(x) \text{ value}, d_i(y) \text{ value}, d_i(z) \text{ value}] の表記法で記述せよ。

x
2/ \8
y───z
3

図2:ネットワーク

(2-3)#

ディスタンスベクトル型ルーティングアルゴリズムでは、リンクが切断した際に経路の収束までに非常に長い時間を要するという問題 (count-to-infinity 問題) がある。この問題について以下の (2-3-1)、(2-3-2)、(2-3-3) に答えよ。ただし、ここでは、リンクが切断された場合、ディスタンスベクトルは切断されたリンクを介して到達しないものとする。

(2-3-1)#

図3のネットワークを考える。リンクのコストは、c(x,y)=c(y,x)=c(y,z)=c(z,y)=1c(x,y) = c(y,x) = c(y,z) = c(z,y) = 1 である。このネットワーク上で経路が収束している状態でのノード yy のディスタンスベクトル DyD_y は、以下の通りである。

Dy=[dy(x)の値,dy(y)の値,dy(z)の値]=[1,0,1]D_y = [d_y(x) \text{の値}, d_y(y) \text{の値}, d_y(z) \text{の値}] = [1, 0, 1]

経路が収束した状態でノード xx とノード yy 間のリンクが切断した (c(x,y)=c(y,x)=c(x,y) = c(y,x) = \infty) とする。リンク切断が発生した直後の更新をステップ1として、図1の動作にしたがって経路を更新したときのステップ1からステップ3までの各ステップ終了時の dy(x)d_y(x) の値を示せ。

x <───> y <───> z
1 1 1 1

図3:ネットワーク

(2-3-2)#

(2-3-1) の dy(x)d_y(x) をふまえて、ディスタンスベクトル型ルーティングアルゴリズムで、count-to-infinity 問題が発生する理由を説明せよ。

(2-3-3)#

リンクステート型ルーティングアルゴリズム (link state routing algorithm) では、count-to-infinity 問題が発生しない理由を説明せよ。


Kai#

(1-1-1)#

  • 日本語 (Japanese):
    root
    / \
    0 1
    / / \
    (a1) 0 1
    / \
    (a2) / \
    0 1
    / \ / \
    0 1 0 1
    / | | \
    (a3)(a4)(a5)(a6)
    符号語割り当て:
    • a1a_1: 0 (長さ1)
    • a2a_2: 10 (長さ2)
    • a3a_3: 1100 (長さ4)
    • a4a_4: 1101 (長さ4)
    • a5a_5: 1110 (長さ4)
    • a6a_6: 1111 (長さ4)
  • 英語 (English): [Decoding tree above] Codeword allocation:
    • a1a_1: 0 (length 1)
    • a2a_2: 10 (length 2)
    • a3a_3: 1100 (length 4)
    • a4a_4: 1101 (length 4)
    • a5a_5: 1110 (length 4)
    • a6a_6: 1111 (length 4)
  • 中文解析 (Chinese Analysis): 已知编码长度为 m1=1,m2=2,m3=m4=m5=m6=4m_1=1, m_2=2, m_3=m_4=m_5=m_6=4。它们的 Kraft 和为 21+22+4×24=0.5+0.25+0.25=12^{-1} + 2^{-2} + 4 \times 2^{-4} = 0.5 + 0.25 + 0.25 = 1,说明正好可以构造出一棵完备的无前缀复号木。在树中,从根出发向左为 0,向右为 1,便能得出以上的符号编码分配方案。

(1-1-2)#

  • 日本語 (Japanese):
    • 平均符号語長: L=2.0L = 2.0 [bit/記号]
    • エントロピー: H(S0)=2.0H(S_0) = 2.0 [bit/記号]
  • 英語 (English):
    • Average code length: L=2.0L = 2.0 [bits/symbol]
    • Entropy: H(S0)=2.0H(S_0) = 2.0 [bits/symbol]
  • 中文解析 (Chinese Analysis):
    • 平均编码长度 LL: L=i=16pimi=(0.5×1)+(0.25×2)+4×(0.0625×4)=0.5+0.5+1.0=2.0L = \sum_{i=1}^6 p_i m_i = (0.5 \times 1) + (0.25 \times 2) + 4 \times (0.0625 \times 4) = 0.5 + 0.5 + 1.0 = 2.0 [bits/symbol]。
    • 信息熵 H(S0)H(S_0): 各记号概率为 pi=2mip_i = 2^{-m_i},因此自信息量为 log2pi=mi-\log_2 p_i = m_i。所以熵为: H(S0)=i=16pilog2pi=i=16pimi=L=2.0H(S_0) = -\sum_{i=1}^6 p_i \log_2 p_i = \sum_{i=1}^6 p_i m_i = L = 2.0 [bits/symbol]。

(1-2-1)#

  • 日本語 (Japanese):
    • (あ): 2ms2^{m_s}
    • (い): 偶数
    • (う): 偶数
    • (え): 奇数
    • (お): 1
  • 英語 (English):
    • (あ): 2ms2^{m_s}
    • (い): even
    • (う): even
    • (え): odd
    • (お): 1
  • 中文解析 (Chinese Analysis): 用反证法证明 ms1=msm_{s-1} = m_s
    • 概率之和满足 i=1s2mi=1\sum_{i=1}^s 2^{-m_i} = 1。两边同乘 2ms2^{m_s} 得到:2msi=1s2mi=2ms2^{m_s} \sum_{i=1}^s 2^{-m_i} = 2^{m_s}。因此 (あ) 填入 2ms2^{m_s}。由于 ms1m_s \ge 1 且为整数,该值一定是一个 偶数,故 (い) 填入偶数。
    • 若假设 ms1msm_{s-1} \neq m_s,因为序列是单调递增的,所以必有 ms1ms1m_{s-1} \le m_s - 1。这意味着对所有 is1i \le s-1,指数差均为正整数 msmi1m_s - m_i \ge 1
    • 因此,展开式 2msi=1s12mi=i=1s12msmi2^{m_s} \sum_{i=1}^{s-1} 2^{-m_i} = \sum_{i=1}^{s-1} 2^{m_s - m_i} 的每一项都是偶数,其和也必然是 偶数,故 (う) 填入偶数。
    • 两式作差得到:2msi=1s2mi2msi=1s12mi=2ms2ms=12^{m_s} \sum_{i=1}^s 2^{-m_i} - 2^{m_s} \sum_{i=1}^{s-1} 2^{-m_i} = 2^{m_s} \cdot 2^{-m_s} = 1。其差值为 1,是 奇数,故 (え) 填入奇数,且等式右端差值 (お) 为 1。
    • 两个偶数之差必然为偶数,这与结果为 1(奇数)产生了矛盾。所以假设不成立,必定有 ms1=msm_{s-1} = m_s

(1-2-2)#

  • 日本語 (Japanese): s=2s = 2 のとき、等式は 2m1+2m2=12^{-m_1} + 2^{-m_2} = 1 となる。 m1m2m_1 \le m_2 を満たす唯一の正の整数解は m1=m2=1m_1 = m_2 = 1 である。 このとき、記号 a1a_1 に符号語 0、記号 a2a_2 に符号語 1 を割り当てることで、符号語長がそれぞれ m1,m2m_1, m_2 であり瞬時に復号可能な符号化が存在する。したがって、基底段階は成立する。
  • 英語 (English): For s=2s = 2, the equation is 2m1+2m2=12^{-m_1} + 2^{-m_2} = 1. The unique positive integer solution satisfying m1m2m_1 \le m_2 is m1=m2=1m_1 = m_2 = 1. In this case, we can assign the codeword 0 to a1a_1 and 1 to a2a_2. This yields an instantly decodable code with codeword lengths m1,m2m_1, m_2, proving the base case.
  • 中文解析 (Chinese Analysis): 证明归纳基础:当 s=2s=2 时,由 Kraft 关系式得 2m1+2m2=12^{-m_1} + 2^{-m_2} = 1。由于 m1m2m_1 \le m_2 且为正整数,唯一的可行解为 m1=m2=1m_1 = m_2 = 1。我们可以分别为两个符号分配编码 01,这显然是一个前缀码,因此 s=2s=2 时的基案成立。

(1-2-3)#

  • 日本語 (Japanese): 記号数が s1s-1 の場合に題意を満たす符号化が存在すると仮定する。 (1-2-1) より ms1=ms=km_{s-1} = m_s = k が成り立つ。ここで、最後の2つの記号 as1,asa_{s-1}, a_s を1つの仮の記号 as1a'_{s-1} に合成する。as1a'_{s-1} の生起確率は ps1=2k+2k=2(k1)p'_{s-1} = 2^{-k} + 2^{-k} = 2^{-(k-1)} となる。 このとき、合成後の s1s-1 個の記号に対する符号語長のセットは m1,m2,,ms2,k1m_1, m_2, \dots, m_{s-2}, k-1 となり、以下の Kraft の等式を満たす:

    i=1s22mi+2(k1)=i=1s22mi+2ms1+2ms=1\sum_{i=1}^{s-2} 2^{-m_i} + 2^{-(k-1)} = \sum_{i=1}^{s-2} 2^{-m_i} + 2^{-m_{s-1}} + 2^{-m_s} = 1

    帰納法の仮定より、この s1s-1 個の記号に対して瞬時に復号可能な符号化が存在する。 仮の記号 as1a'_{s-1} に割り当てられた符号語を cs1c'_{s-1}(長さ k1k-1)とする。 元の記号 as1a_{s-1}asa_s に対する符号語を、それぞれ cs10c'_{s-1} 0 および cs11c'_{s-1} 1 と割り当てる。 これにより、これら2つの符号語長は (k1)+1=k=ms1=ms(k-1) + 1 = k = m_{s-1} = m_s となり、プレフィックス性(瞬時復号可能性)も維持される。 よって、記号数 ss の場合においても題意を満たす符号化が存在し、数学的帰納法により証明が完了する。

  • 英語 (English): Assume that the instantly decodable coding exists for s1s-1 symbols. From (1-2-1), we have ms1=ms=km_{s-1} = m_s = k. We combine the last two symbols as1,asa_{s-1}, a_s into a single pseudo-symbol as1a'_{s-1} with probability ps1=2k+2k=2(k1)p'_{s-1} = 2^{-k} + 2^{-k} = 2^{-(k-1)}. The resulting set of s1s-1 symbols has code lengths m1,,ms2,k1m_1, \dots, m_{s-2}, k-1, satisfying the Kraft relation:

    i=1s22mi+2(k1)=i=1s22mi+2ms1+2ms=1\sum_{i=1}^{s-2} 2^{-m_i} + 2^{-(k-1)} = \sum_{i=1}^{s-2} 2^{-m_i} + 2^{-m_{s-1}} + 2^{-m_s} = 1

    By the induction hypothesis, there exists an instantly decodable code for these s1s-1 symbols. Let cs1c'_{s-1} be the codeword for as1a'_{s-1} (of length k1k-1). For the original symbols as1a_{s-1} and asa_s, we assign the codewords cs10c'_{s-1}0 and cs11c'_{s-1}1. These codewords maintain prefix-free property and have lengths (k1)+1=k=ms1=ms(k-1)+1 = k = m_{s-1} = m_s, which completes the induction.

  • 中文解析 (Chinese Analysis): 归纳步骤证明:

    • 假设对于 s1s-1 个符号的前缀码总是存在的。
    • 根据前文证明,我们已知最长两项必相等:ms1=ms=km_{s-1} = m_s = k
    • 我们把最后的两个符号 as1,asa_{s-1}, a_s 合并成一个伪符号 as1a'_{s-1},合并后的概率为两个概率相加:2k+2k=2(k1)2^{-k} + 2^{-k} = 2^{-(k-1)},相对应的编码长度设计为 k1k-1
    • 合并后,这 s1s-1 个符号的长度序列仍然满足 Kraft 和为 1。根据归纳假设,必定存在一个有效的前缀码。设伪符号 as1a'_{s-1} 在此码集中的编码为 cs1c'_{s-1},长度为 k1k-1
    • 现在,我们将 cs1c'_{s-1} 分别在尾部追加 01,得到原符号 as1a_{s-1}asa_s 的实际编码:cs1=cs10c_{s-1} = c'_{s-1}0cs=cs11c_s = c'_{s-1}1。其长度为 (k1)+1=k=ms(k-1)+1 = k = m_s
    • 展开后的编码集没有破坏前缀码定义(因为任何其它编码都不会以它们的前缀为开头),归纳得证。

(1-3)#

  • 日本語 (Japanese):
    • (あ): H(S)H(S) (または i=1spilog2pi-\sum_{i=1}^s p_i \log_2 p_i
    • (い): H(S)H(S) (または i=1spimi\sum_{i=1}^s p_i m_i
    • (う): シャノン (Shannon)
    • (え): 情報源符号化 (Source Coding)
    • (お): はない
  • 英語 (English):
    • (あ): H(S)H(S) (or pilog2pi-\sum p_i \log_2 p_i)
    • (い): H(S)H(S) (or pimi\sum p_i m_i)
    • (う): Shannon
    • (え): source coding
    • (お): does not exist
  • 中文解析 (Chinese Analysis): 填空详情:
    • (あ):信息源的熵 H(S)H(S)
    • (い):由于生起概率恰为 pi=2mip_i = 2^{-m_i},代入可得平均码长 L=pimiL = \sum p_i m_i 恰好等于熵值 H(S)H(S)
    • (う)(え):著名的香农(Shannon)信息源编码定理(Source Coding Theorem)。
    • (お):香农第一定理指出,无失真信源编码的每记号平均码长不可能小于信源的熵 H(S)H(S)。由于我们单符号编码的平均码长已达到其理论下界 H(S)H(S),所以在任何 nn 次扩展(n-th extension)中,平均每记号的码长都不可能再被进一步缩小,故填入「はない」。

(2-1)#

  • 日本語 (Japanese): di(j)=minvAdj(i){c(i,v)+dv(j)}(ji)d_i(j) = \min_{v \in \text{Adj}(i)} \{ c(i, v) + d_v(j) \} \quad (j \ne i)

    記号の定義:

    • Adj(i)\text{Adj}(i): ノード ii に隣接するすべてのノードの集合(すなわち c(i,v)<c(i, v) < \infty となるノード vv の集合)。
    • c(i,v)c(i, v): ノード ii と隣接ノード vv の間のリンクコスト。
    • dv(j)d_v(j): 隣接ノード vv が保持している、ノード vv から目的地 jj までの最小コスト。
  • 英語 (English): di(j)=minvAdj(i){c(i,v)+dv(j)}(ji)d_i(j) = \min_{v \in \text{Adj}(i)} \{ c(i, v) + d_v(j) \} \quad (j \ne i)

    Symbol definitions:

    • Adj(i)\text{Adj}(i): The set of all adjacent nodes to node ii (i.e., nodes vv such that c(i,v)<c(i, v) < \infty).
    • c(i,v)c(i, v): The link cost between node ii and adjacent node vv.
    • dv(j)d_v(j): The minimum cost from node vv to destination jj as stored in vv‘s distance vector.
  • 中文解析 (Chinese Analysis): 距离向量算法的更新公式(即 Bellman-Ford 方程): 对于任意的目的节点 jij \neq i,节点 ii 的更新公式为: di(j)=minvAdj(i){c(i,v)+dv(j)}d_i(j) = \min_{v \in \text{Adj}(i)} \{ c(i, v) + d_v(j) \} 其中:

    • Adj(i)\text{Adj}(i) 为节点 ii 的直连邻居节点集合(即所有满足链路成本 c(i,v)<c(i, v) < \infty 的节点 vv)。
    • c(i,v)c(i, v) 为当前节点 ii 到邻居节点 vv 的链路权重(开销)。
    • dv(j)d_v(j) 为邻居节点 vv 维护的到目的地 jj 的估计最小开销。

(2-2)#

  • 日本語 (Japanese):
    • ステップ1:
      • 受信ベクトル: Dy=[2,0,3]D_y = [2, 0, 3], Dz=[8,3,0]D_z = [8, 3, 0]
      • 更新後のベクトル: Dx=[0,2,5]D_x = [0, 2, 5]
    • ステップ2 (収束):
      • 受信ベクトル: Dy=[2,0,3]D_y = [2, 0, 3], Dz=[5,3,0]D_z = [5, 3, 0]
      • 更新後のベクトル: Dx=[0,2,5]D_x = [0, 2, 5] (前ステップと値が変化しないため、ここで収束する)
  • 英語 (English):
    • Step 1:
      • Received vectors: Dy=[2,0,3]D_y = [2, 0, 3], Dz=[8,3,0]D_z = [8, 3, 0]
      • Updated vector: Dx=[0,2,5]D_x = [0, 2, 5]
    • Step 2 (Convergence):
      • Received vectors: Dy=[2,0,3]D_y = [2, 0, 3], Dz=[5,3,0]D_z = [5, 3, 0]
      • Updated vector: Dx=[0,2,5]D_x = [0, 2, 5] (The value of DxD_x does not change, path converges here)
  • 中文解析 (Chinese Analysis):
    • 初始状态(Step 1 前): 各节点已知直连开销,因此 Dx(0)=[0,2,8]D_x^{(0)} = [0, 2, 8], Dy(0)=[2,0,3]D_y^{(0)} = [2, 0, 3], Dz(0)=[8,3,0]D_z^{(0)} = [8, 3, 0]
    • Step 1
      • 动作 I:节点 xx 收到来自邻居的向量:Dy=[2,0,3]D_y = [2, 0, 3]Dz=[8,3,0]D_z = [8, 3, 0]
      • 动作 II:节点 xx 根据更新公式重新计算各距离:
        • dx(x)=0d_x(x) = 0
        • dx(y)=min{c(x,y)+dy(y),c(x,z)+dz(y)}=min{2+0,8+3}=2d_x(y) = \min \{ c(x, y) + d_y(y), c(x, z) + d_z(y) \} = \min \{ 2 + 0, 8 + 3 \} = 2
        • dx(z)=min{c(x,y)+dy(z),c(x,z)+dz(z)}=min{2+3,8+0}=5d_x(z) = \min \{ c(x, y) + d_y(z), c(x, z) + d_z(z) \} = \min \{ 2 + 3, 8 + 0 \} = 5。 更新后 Dx=[0,2,5]D_x = [0, 2, 5]
    • Step 2
      • 动作 I:节点 xx 收到 yyzz 在 Step 1 结束时生成的向量。yy 保持不变(仍为 Dy=[2,0,3]D_y = [2, 0, 3]),而 zz 更新为了 Dz=[5,3,0]D_z = [5, 3, 0]。所以收到 Dy=[2,0,3]D_y = [2, 0, 3], Dz=[5,3,0]D_z = [5, 3, 0]
      • 动作 II:节点 xx 重新计算:
        • dx(z)=min{2+3,8+0}=5d_x(z) = \min \{ 2 + 3, 8 + 0 \} = 5(保持不变)。 所以更新后 Dx=[0,2,5]D_x = [0, 2, 5]。 由于 DxD_x 没有发生改变(其它节点向量也已收敛不变),算法在此处收敛。

(2-3-1)#

  • 日本語 (Japanese):
    • ステップ1終了時: dy(x)=3d_y(x) = 3
    • ステップ2終了時: dy(x)=3d_y(x) = 3
    • ステップ3終了時: dy(x)=5d_y(x) = 5
  • 英語 (English):
    • End of Step 1: dy(x)=3d_y(x) = 3
    • End of Step 2: dy(x)=3d_y(x) = 3
    • End of Step 3: dy(x)=5d_y(x) = 5
  • 中文解析 (Chinese Analysis): 计算链路 (x,y)(x, y) 断开后的更新轨迹:
    • 断开前Dx(0)=[0,1,2]D_x^{(0)} = [0, 1, 2]Dy(0)=[1,0,1]D_y^{(0)} = [1, 0, 1]Dz(0)=[2,1,0]D_z^{(0)} = [2, 1, 0]。断开后 c(y,x)=c(y, x) = \infty
    • Step 1yy 在该步骤开始时收到了 zz 上一轮的向量,其中 dz(x)=2d_z(x) = 2。计算更新: dy(x)=min{c(y,x)+dx(x),c(y,z)+dz(x)}=min{,1+2}=3d_y(x) = \min \{ c(y, x) + d_x(x), c(y, z) + d_z(x) \} = \min \{ \infty, 1 + 2 \} = 3。 与此同时,节点 zz 使用旧的 Dy(0)D_y^{(0)} 更新:dz(x)=min{c(z,y)+dy(x),c(z,x)+dx(x)}=min{1+1,}=2d_z(x) = \min \{ c(z, y) + d_y(x), c(z, x) + d_x(x) \} = \min \{ 1 + 1, \infty \} = 2。 因此 Step 1 结束时:dy(x)=3,dz(x)=2d_y(x) = 3, d_z(x) = 2
    • Step 2yy 收到 zz 传来的 Dz(1)D_z^{(1)}(其中 dz(x)=2d_z(x) = 2)。计算更新: dy(x)=min{,1+2}=3d_y(x) = \min \{ \infty, 1 + 2 \} = 3。 与此同时,节点 zz 收到 yy 传来的 Dy(1)D_y^{(1)}(其中 dy(x)=3d_y(x) = 3)。计算更新: dz(x)=min{1+3,}=4d_z(x) = \min \{ 1 + 3, \infty \} = 4。 因此 Step 2 结束时:dy(x)=3,dz(x)=4d_y(x) = 3, d_z(x) = 4
    • Step 3yy 收到 zz 传来的 Dz(2)D_z^{(2)}(其中 dz(x)=4d_z(x) = 4)。计算更新: dy(x)=min{,1+4}=5d_y(x) = \min \{ \infty, 1 + 4 \} = 5。 因此 Step 3 结束时:dy(x)=5d_y(x) = 5

(2-3-2)#

  • 日本語 (Japanese): リンク切断により xx への直接経路が失われた際、ノード yy は隣接ノード zz から送られてくる「xx へのコスト 2」という経路情報を採用してしまう。この経路が実は自身 (yy) を経由するルーティングループであることに気づかず、自身のコストを 1+2=31 + 2 = 3 に更新する。その後、ノード zzyy の更新されたコストに基づいて自身のコストを 1+3=41 + 3 = 4 に更新する。この互いに相手のコストを基に自身のコストをインクリメントする誤った更新処理が繰り返され、コストが無限大(\infty)に達するまでカウントアップされ続けるため。
  • 英語 (English): When the link cuts, yy‘s direct path to xx becomes unavailable (\infty), but it incorrectly selects zz‘s advertised route to xx of cost 2. Because yy does not know that zz‘s route actually loops back through yy itself (routing loop), it updates its cost to 1+2=31+2=3. Then, zz updates its cost to 1+3=41+3=4 based on yy‘s new update. This cyclic dependency causes the nodes to mutually increment their costs up to infinity (Count-to-infinity).
  • 中文解析 (Chinese Analysis): 发生 Count-to-infinity 的原因为:当直连链路断开时,节点 yyxx 的直接开销变为无穷,但它从邻居 zz 的通告中看到 zzxx 的开销为 2。因为距离向量只记录开销值而不记录具体的路径路由信息,节点 yy 无法察觉到 zz 所声称的路径实际上是经由 yy 自身建立的(即路由环路)。因此,yy 错误地通过 zz 进行了更新,使得 dy(x)=1+2=3d_y(x) = 1 + 2 = 3。在此之后,zz 收到 yy 广播的 3,又更新为 1+3=41 + 3 = 4。两个节点交替引用对方的无效距离通告进行自我递增,导致开销值只能一轮接一轮地往上累计,一直累加到无穷大(系统设定最大值)算法才能停止。

(2-3-3)#

  • 日本語 (Japanese): リンクステート型ルーティングアルゴリズムでは、各ノードがリンクステートパケット (LSP/LSA) の全網ブロードキャストを通じて、ネットワーク全体の接続トポロジー情報を完全に共有している。リンクが切断された場合、そのトポロジーの変更情報が直ちに全ノードに伝播され、各ノードは他ノードの不完全な中間ルーティングテーブルに頼ることなく、自身の持っている正しいグローバルトポロジーマップに基づいて独立してダイクストラ法などの最短経路アルゴリズムを実行する。よって、ルーティングループや Count-to-Infinity 問題は根本的に発生しない。
  • 英語 (English): In link-state routing, every node maintains a complete and consistent global topology map of the entire network via Link-State Advertisements (LSAs) flooding. When a link cuts, the update is broadcast to all nodes, and each node recalculates its routing table independently using Dijkstra’s algorithm. Because they calculate routes based on the actual physical topology rather than iterating on neighbors’ routing entries, routing loops and count-to-infinity cannot occur.
  • 中文解析 (Chinese Analysis): 因为在链路状态(Link State)协议中,所有节点都通过 LSA 泛洪获得全网统一的物理拓扑结构图,每个节点都是在已知真实拓扑的基础上独立通过 Dijkstra 算法计算最短路径树。当链路切断时,拓扑改变消息会通报全网,节点直接根据拓扑变化将损坏的链路剔除并重算,而不需要像距离向量算法那样通过邻居的间接计算数据来迭代收敛。因此,节点之间不存在互相依赖路由表所引发的路由环路,也就不会发生 Count-to-infinity 问题。
Osaka University IST Graduate Entrance Exam (2019)
https://blog.yirong.site/posts/0078/
Author
Kuchina
Published at
2026-07-15
License
CC BY-NC-SA 4.0
ページ閲覧数: 読み込み中…
サイト閲覧数: 読み込み中…