跳到主要内容

東京大学 工学系研究科 電気系工学専攻 2020年8月実施 問題4 情報工学II

Author

donguri0912

Description

I.

論理回路に関する以下の問に答えよ.22bit の正の値 A=a2a1A = a_2a_1B=b2b1B = b_2b_1 を⼊⼒とする 22bit⽐較器 CMPCMP を設計したい.⽐較器 CMPCMP は,⼊⼒が ABA \ge B の時 11 を,それ以外の時 00 を出⼒ cc として出⼒する回路とする.22bit⽐較器 CMPCMP は,図 11 に⽰す記号で表される.

(1) a1a_1, b1b_1 を⼊⼒として,以下に⽰す c1c_1 を出⼒する 11bit⽐較器 CMP1CMP_1 の真理値表を書け.

c1={1,a1b10,a1<b1c_1 = \left \{ \begin{aligned} 1,\quad a_1 \ge b_1 \\ 0,\quad a_1 < b_1 \\ \end{aligned} \right.

(2) 問 (1) に⽰した c1c_1a2a_2, b2b_2 , を⼊⼒として,以下に⽰す c2c_2 を出⼒する 11bit⽐較器 CMP2CMP_2 の真理値表を書け.

c2={1,a2>b2c1,a2=b20,a2<b2c_2 = \left \{ \begin{aligned} &1,\quad a_2 > b_2 \\ &c_1,\quad a_2 = b_2 \\ &0,\quad a_2 < b_2 \\ \end{aligned} \right.

(3) 問 (1) および (2) で⽰した⽐較器 CMP1,CMP2CMP_1 , CMP_2 の回路を組合せることで 22bit ⽐較器 CMPCMP を作成することができる. この回路を図 22 に⽰す記号を⽤いて図⽰せよ.

次に,22bit⽐較器 CMPCMP を⽤いて順序回路 MAXMAX を設計したい.MAXMAX は,22bit の正の値 X1X_1, X2X_2, \cdots を順に⼊⼒すると,⼊⼒値の最⼤値を出⼒する.以下の⼿順で MAXMAX の回路を設計せよ.

(4) 22bit⽐較器 CMPCMP と 2bitbitの Dフリップフロップフリップフロップ(D-FF)を用いて, を用いて,D-FF\max(A,B)を記録する回路を設計したい.この回路を図を記録する回路を設計したい.この回路を図1,図,図2および図および 図3$ の記号を⽤いて図⽰せよ.

(5) 問 (4) で設計した回路の⼊⼒ AAXiX_i を, BBmax(X1,X2,,Xi1)\max(X_1,X_2,\dots,X_{i-1}) を配線することで,順序回路 MAXMAX を作成できる.順序回路 MAXMAX を図 11 ,図 22 および図 33 の記号を⽤いて図⽰せよ.ここで,⼊⼒ BB の初期値は 0000 であると仮定してよい.

II.

ハッシュテーブルを⽤いたデータの格納と管理に関する以下の問に答えよ.NN 個の要素を持つハッシュテーブル table[N]により正の整数を管理する⽅法について考える.ここで,正の整数 xx をハッシュテーブルに格納する位置を定める際に⽤いるハッシュ関数を H(x)=mod(x,N)H(x) = mod(x,N) とする.正の整数が同じハッシュ値を持つ場合は,プログラム 1に⽰すデータ構造 nodeの連結リストにより管理する.

(1) 整数 {15,53,22,59,15,41,20}\{15, 53, 22, 59, 15, 41, 20\} をハッシュ関数を⽤いて順に N=11N = 11table[N]に格納した時,ハッシュテーブルの内容を⽰せ.

(2) プログラム 2 は,正の整数 xxtable[N] に格納する関数 insert(x) を⽰している.プログラム 2 の空欄を埋めて CC ⾔語のプログラムを完成させよ.

(3) search(x) は,与えられた正の整数 xx の値が table[N] に格納されている場合に 11 を, そうでない場合は 00 を返す関数とする.関数 search(x)CC ⾔語で記述せよ.

(4) table[N] に格納されている正の整数 xx を削除する関数を記述する際に留意すべき点を数⾏で述べよ.

/* プログラム 1 */ 
struct node {
int value;
struct node *next;
};
struct node *table[N];

/* プログラム 2 */
int H(int x) { return(x % N); } void insert(int x) {
struct node *new, *check; new = (struct node *)malloc(sizeof (struct node)); new -> value = x; new -> next = NULL; check = table[H(x)];
/* ------------------------------------------- */
/* | | */
/* | BLANK | */
/* | | */
/* ------------------------------------------- */
}

Kai

I.

(1)

a1a_1b1b_1c1c_1
001
010
101
111

(2)

c1c_1a2a_2b2b_2c2c_2
0000
0010
0101
0110
1001
1010
1101
1111

(3)

PCで書くのが面倒だったので載せませんがカルノー図を書きます。

(4)

(5)

II.

(1)

ハッシュテーブルに一般的な書き方があるわけではないと思うので、書き方はなんでもいいと思う。

(2)

if(check == NULL) {
table[H(x)] = new;
} else {
while(check->next != NULL) check = check->next;
check->next = new;
}

(3)

int search(int x) {
struct node *check = table[H(x)];
while(check != NULL) {
if(check->value == x) return 1;
check = check->next;
}
return 0;
}

(4)

xx を格納するノードを消す際にその子ノードを消さずに親につなげること。 また、xx を格納するノードのメモリを開放すること。