---
id: 5956795bc9e2c415eb244de1
title: 哈希加入
challengeType: 5
videoUrl: ''
---
# --description--
内连接是一种操作,它根据匹配的列值将两个数据表组合到一个表中。实现此操作的最简单方法是嵌套循环连接算法,但更可扩展的替代方法是散列连接算法。
实现“散列连接”算法,并演示它通过下面列出的测试用例。
您应该将表表示为在编程语言中感觉自然的数据结构。
“散列连接”算法包含两个步骤:
哈希阶段:从两个表中的一个表创建一个多图,从每个连接列值映射到包含它的所有行。多图必须支持基于散列的查找,它比简单的线性搜索更好地扩展,因为这是该算法的重点。理想情况下,我们应该为较小的表创建多图,从而最小化其创建时间和内存大小。加入阶段:扫描另一个表,通过查看之前创建的多图来查找匹配的行。 在伪代码中,算法可以表示如下:
让A =第一个输入表(或理想情况下,更大的输入表)
设B =第二个输入表(或理想情况下,较小的输入表)
令j A =表A的连接列ID
令j B =表B的连接列ID
让M B =一个多图,用于从单个值映射到表B的多行(从空白开始)
让C =输出表(从空开始)
对于表B中的每一行b:
将b放在密钥b(j B )下的多映射M B中
对于表A中的每一行a:
对于a(j A )项下多图M B中的每一行b:
设c =第a行和第b行的串联
将行c放在表C中
测试用例输入
| A = | | 年龄 | 名称 |
|---|
| 27 | 约拿 | | 18 | 艾伦 | | 28 | 荣耀 | | 18 | 大力水手 | | 28 | 艾伦 |
| | B = | | 字符 | 复仇者 |
|---|
| 约拿 | 鲸鱼 | | 约拿 | 蜘蛛 | | 艾伦 | 鬼 | | 艾伦 | 植物大战僵尸 | | 荣耀 | 巴菲 |
| | j A = | Name (即第1栏) | j B = | Character (即第0列) |
| |
产量
| A.Age | 一个名字 | B.Character | B.Nemesis |
|---|
| 27 | 约拿 | 约拿 | 鲸鱼 |
| 27 | 约拿 | 约拿 | 蜘蛛 |
| 18 | 艾伦 | 艾伦 | 鬼 |
| 18 | 艾伦 | 艾伦 | 植物大战僵尸 |
| 28 | 荣耀 | 荣耀 | 巴菲 |
| 28 | 艾伦 | 艾伦 | 鬼 |
| 28 | 艾伦 | 艾伦 | 植物大战僵尸 |
输出表中行的顺序并不重要。
如果你使用数字索引数组来表示表行(而不是按名称引用列),你可以用[[27, "Jonah"], ["Jonah", "Whales"]]的形式表示输出行。 。
# --hints--
`hashJoin`是一个函数。
```js
assert(typeof hashJoin === 'function');
```
`hashJoin([{ age: 27, name: "Jonah" }, { age: 18, name: "Alan" }, { age: 28, name: "Glory" }, { age: 18, name: "Popeye" }, { age: 28, name: "Alan" }], [{ character: "Jonah", nemesis: "Whales" }, { character: "Jonah", nemesis: "Spiders" }, { character: "Alan", nemesis: "Ghosts" }, { character:"Alan", nemesis: "Zombies" }, { character: "Glory", nemesis: "Buffy" }, { character: "Bob", nemesis: "foo" }])`应该返回`[{"A_age": 27,"A_name": "Jonah", "B_character": "Jonah", "B_nemesis": "Whales"}, {"A_age": 27,"A_name": "Jonah", "B_character": "Jonah", "B_nemesis": "Spiders"}, {"A_age": 18,"A_name": "Alan", "B_character": "Alan", "B_nemesis": "Ghosts"}, {"A_age": 18,"A_name": "Alan", "B_character": "Alan", "B_nemesis": "Zombies"}, {"A_age": 28,"A_name": "Glory", "B_character": "Glory", "B_nemesis": "Buffy"}, {"A_age": 28,"A_name": "Alan", "B_character": "Alan", "B_nemesis": "Ghosts"}, {"A_age": 28,"A_name": "Alan", "B_character": "Alan", "B_nemesis": "Zombies"}]`
```js
assert.deepEqual(hashJoin(hash1, hash2), res);
```
# --solutions--