freeCodeCamp/curriculum/challenges/chinese/08-coding-interview-prep/rosetta-code/hash-join.chinese.md

9.3 KiB
Raw Blame History

title id challengeType videoUrl localeTitle
Hash join 5956795bc9e2c415eb244de1 5 哈希加入

Description

内连接是一种操作,它根据匹配的列值将两个数据表组合到一个表中。实现此操作的最简单方法是嵌套循环连接算法,但更可扩展的替代方法是散列连接算法。

实现“散列连接”算法,并演示它通过下面列出的测试用例。

您应该将表表示为在编程语言中感觉自然的数据结构。

“散列连接”算法包含两个步骤:

哈希阶段:从两个表中的一个表创建一个图,从每个连接列值映射到包含它的所有行。多图必须支持基于散列的查找,它比简单的线性搜索更好地扩展,因为这是该算法的重点。理想情况下,我们应该为较小的表创建多图,从而最小化其创建时间和内存大小。加入阶段:扫描另一个表,通过查看之前创建的多图来查找匹配的行。

在伪代码中,算法可以表示如下:

让A =第一个输入表(或理想情况下,更大的输入表)
设B =第二个输入表(或理想情况下,较小的输入表)
令j A =表A的连接列ID
令j B =表B的连接列ID
让M B =一个多图用于从单个值映射到表B的多行从空白开始
让C =输出表(从空开始)
对于表B中的每一行b
  将b放在密钥bj B 下的多映射M B中
对于表A中的每一行a
  对于aj 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"]]的形式表示输出行。 。


Instructions

Tests

tests:
  - text: <code>hashJoin</code>是一个函数。
    testString: 'assert(typeof hashJoin === "function", "<code>hashJoin</code> is a function.");'
  - text: '<code>hashJoin([{ age: 27, name: &quot;Jonah&quot; }, { age: 18, name: &quot;Alan&quot; }, { age: 28, name: &quot;Glory&quot; }, { age: 18, name: &quot;Popeye&quot; }, { age: 28, name: &quot;Alan&quot; }], [{ character: &quot;Jonah&quot;, nemesis: &quot;Whales&quot; }, { character: &quot;Jonah&quot;, nemesis: &quot;Spiders&quot; }, { character: &quot;Alan&quot;, nemesis: &quot;Ghosts&quot; }, { character:&quot;Alan&quot;, nemesis: &quot;Zombies&quot; }, { character: &quot;Glory&quot;, nemesis: &quot;Buffy&quot; }, { character: &quot;Bob&quot;, nemesis: &quot;foo&quot; }])</code>应该返回<code>[{&quot;A_age&quot;: 27,&quot;A_name&quot;: &quot;Jonah&quot;, &quot;B_character&quot;: &quot;Jonah&quot;, &quot;B_nemesis&quot;: &quot;Whales&quot;}, {&quot;A_age&quot;: 27,&quot;A_name&quot;: &quot;Jonah&quot;, &quot;B_character&quot;: &quot;Jonah&quot;, &quot;B_nemesis&quot;: &quot;Spiders&quot;}, {&quot;A_age&quot;: 18,&quot;A_name&quot;: &quot;Alan&quot;, &quot;B_character&quot;: &quot;Alan&quot;, &quot;B_nemesis&quot;: &quot;Ghosts&quot;}, {&quot;A_age&quot;: 18,&quot;A_name&quot;: &quot;Alan&quot;, &quot;B_character&quot;: &quot;Alan&quot;, &quot;B_nemesis&quot;: &quot;Zombies&quot;}, {&quot;A_age&quot;: 28,&quot;A_name&quot;: &quot;Glory&quot;, &quot;B_character&quot;: &quot;Glory&quot;, &quot;B_nemesis&quot;: &quot;Buffy&quot;}, {&quot;A_age&quot;: 28,&quot;A_name&quot;: &quot;Alan&quot;, &quot;B_character&quot;: &quot;Alan&quot;, &quot;B_nemesis&quot;: &quot;Ghosts&quot;}, {&quot;A_age&quot;: 28,&quot;A_name&quot;: &quot;Alan&quot;, &quot;B_character&quot;: &quot;Alan&quot;, &quot;B_nemesis&quot;: &quot;Zombies&quot;}]</code>'
    testString: 'assert.deepEqual(hashJoin(hash1, hash2), res, "<code>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" }])</code> should return <code>[{"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"}]</code>");'

Challenge Seed

function hashJoin (hash1, hash2) {
  // Good luck!
  return [];
}

After Test

console.info('after the test');

Solution

// solution required