Uma junção interna é uma operação que combina duas tabelas de dados em uma tabela, com base em valores de coluna correspondentes. A maneira mais simples de implementar essa operação é o algoritmo de junção de loop aninhado , mas uma alternativa mais escalável é o algoritmo de junção de hash .
Implemente o algoritmo "hash join" e demonstre que ele passa no caso de teste listado abaixo.
Você deve representar as tabelas como estruturas de dados que parecem naturais em sua linguagem de programação.
O algoritmo "hash join" consiste em duas etapas:
Fase de hash: cria um multimap de uma das duas tabelas, mapeando de cada valor de coluna de junção para todas as linhas que o contêm. O multimap deve suportar uma pesquisa baseada em hash que é melhor que uma busca linear simples, porque esse é o ponto principal desse algoritmo. Idealmente, devemos criar o multimap para a tabela menor, minimizando assim o tempo de criação e o tamanho da memória. Fase de junção: escaneie a outra tabela e encontre linhas correspondentes olhando no multimap criado anteriormente.No pseudocódigo, o algoritmo poderia ser expresso da seguinte maneira:
seja A = a primeira tabela de entrada (ou, idealmente, a maior) seja B = a segunda tabela de entrada (ou, idealmente, a menor) deixe j A = o ID da coluna de junção da tabela A deixe j B = o ID da coluna de junção da tabela B deixe M B = um multimap para mapear de valores únicos para múltiplas linhas da tabela B (começa vazia) deixe C = a tabela de saída (começa vazia) para cada linha b na tabela B: coloque b no multimap M B na chave b (j B ) para cada linha a na tabela A: para cada linha b no multimap M B na chave a (j A ): vamos c = a concatenação da linha ae linha b coloque a linha c na tabela CCaso de teste
Entrada
|
Saída
A.Age | Um nome | B.Caracter | B.Nemesis |
---|---|---|---|
27 | Jonas | Jonas | Baleias |
27 | Jonas | Jonas | Aranhas |
18 | Alan | Alan | Fantasmas |
18 | Alan | Alan | Zumbis |
28 | Glória | Glória | Buffy |
28 | Alan | Alan | Fantasmas |
28 | Alan | Alan | Zumbis |
A ordem das linhas na tabela de saída não é significativa.
Se você estiver usando matrizes numericamente indexadas para representar as linhas da tabela (em vez de se referir a colunas por nome), você poderia representar as linhas de saída na forma [[27, "Jonah"], ["Jonah", "Whales"]]
.
hashJoin
é uma função.
testString: 'assert(typeof hashJoin === "function", "hashJoin
is a function.");'
- text: '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" }])
deve retornar [{"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"}]
'
testString: 'assert.deepEqual(hashJoin(hash1, hash2), res, "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" }])
should return [{"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"}]
");'
```