東京大学 工学系研究科 電気系工学専攻 2021年8月実施 問題4 情報工学II
Author
donguri0912, 祭音Myyura
Description
I.
論理回路に関する以下の問に答えよ.bit の正の値 と を入力とする bit比較器 を設計したい.比較器 は,入力が の時 を,それ以外の時 を出力 として出力する回路とする.bit比較器 は,図 に示す記号で表される.
(1) , を入力として,以下に示す を出力する bit比較器 の真理値表を書け.
(2) 問 (1) に示した と , , を入力として,以下に示す を出力する bit比較器 の真理値表を書け.
(3) 問 (1) および (2) で示した比較器 の回路を組合せることで bit 比較器 を作成することができる. この回路を図 に示す記号を用いて図示せよ.
次に,bit比較器 を用いて順序回路 を設計したい. は,bit の正の値 , , を順に入力すると,入力値の最大値を出力する.以下の手順で の回路を設計せよ.
(4) bit 比較器 と bit の フリップフロップ を用いて, に を記録する回路を設計したい.この回路を図 ,図 および 図 の記号を用いて図示せよ.
(5) 問 (4) で設計した回路の入力 に を, に を配線することで,順序回路 を作成できる.順序回路 を図 ,図 および図 の記号を用いて図示せよ.ここで,入力 の初期値は であると仮定してよい.
II.
ハッシュテーブルを用いたデータの格納と管理に関する以下の問に答えよ. 個の要素を持つハッシュテーブル table[N]により正の整数を管理する方法について考える.ここで,正の整数 をハッシュテーブルに格納する位置を定める際に用いるハッシュ関数を とする.正の整数が同じハッシュ値を持つ場合は,プログラム 1に示すデータ構造 nodeの連結リストにより管理する.
(1) 整数 をハッシュ関数を用いて順に の table[N]に格納した時,ハッシュテーブルの内容を示せ.
(2) プログラム 2 は,正の整数 をtable[N] に格納する関数 insert(x) を示している.プログラム 2 の空欄を埋めて 言語のプログラムを完成させよ.
(3) search(x) は,与えられた正の整数 の値が table[N] に格納されている場合に を, そうでない場合は を返す関数とする.関数 search(x) を 言語で記述せよ.
(4) table[N] に格納されている正の整数 を削除する関数を記述する際に留意すべき点を数行で述べよ.
/* プログラム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)];
/* 空欄 */
}
题目描述
I. 回答以下逻辑电路问题。希望设计一个以两位正数 和 为输入的两位比较器 。当 时,该电路输出 ,否则输出 。两位比较器 用图1的符号表示。
(1) 写出一位比较器 的真值表,其输入为 ,输出 满足
(2) 写出一位比较器 的真值表,其输入为第 (1) 问的 和 ,输出 满足
(3) 组合第 (1)、(2) 问中的比较器 ,可以构成两位比较器 。用图2中的符号画出该电路。
接着希望用两位比较器 设计时序电路 。依次输入两位正数 时, 输出输入值中的最大值。按以下步骤设计 的电路。
(4) 希望用两位比较器 和两位 D 触发器(D-FF)设计一个将 存入 D-FF 的电路。用图1、图2、图3中的符号画出该电路。
(5) 将第 (4) 问电路的输入 接到 ,输入 接到 ,可以构成时序电路 。用图1、图2、图3中的符号画出 。可以假设输入 的初始值为 。

II. 回答以下使用哈希表存储和管理数据的问题。考虑用具有 个元素的哈希表 table[N] 管理正整数的方法。确定正整数 在哈希表中存储位置的哈希函数为 。当正整数具有相同哈希值时,用程序1所示数据结构 node 的链表管理。
(1) 当 时,利用哈希函数依次将整数 存入 table[N]。写出此时哈希表的内容。
(2) 程序2为将正整数 存入 table[N] 的函数 insert(x)。填入程序2的空白,完成 C 语言程序。
(3) 若给定正整数 的值存储在 table[N] 中,函数 search(x) 返回1,否则返回0。用 C 语言编写 search(x)。
(4) 编写从 table[N] 中删除正整数 的函数时,有哪些应注意的事项?用数行说明。
/* 程序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)];
/* 空白 */
}
Kai
I.
(1)
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
(2)
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
(3)
図の比較器は次の論理式で実現できる( は OR、積は AND)。
上位ビットが等しいときは を、異なるときは を出力する。
(4)
(5)
フリップフロップへの入力は、各ビット について
とする。 なら 、 なら が保存される。出力 を に戻して初期値を とすれば、各クロックで となる。
II.
(1)
| Bucket | List from head to tail |
|---|---|
| 0 | 22 → NULL |
| 1, 2, 3 | NULL |
| 4 | 15 → 59 → 15 → NULL |
| 5, 6, 7 | NULL |
| 8 | 41 → NULL |
| 9 | 53 → 20 → NULL |
| 10 | NULL |
正しくは table[4] が となる。
ハッシュテーブルに一般的な書き方があるわけではないと思うので、書き方はなんでもいいと思う。
(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)
を格納するノードを消す際、先頭ノードなら table[H(x)]、それ以外なら直前ノードの next を、削除ノードの next につなぎ替える。
その後、削除ノードのメモリを解放する。