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

9.8 KiB

title id challengeType videoUrl localeTitle
Hash join 5956795bc9e2c415eb244de1 5 Junção de hash

Description

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 C 

Caso de teste

Entrada

A =
Era Nome
27 Jonas
18 Alan
28 Glória
18 Popeye
28 Alan
B =
Personagem Nêmesis
Jonas Baleias
Jonas Aranhas
Alan Fantasmas
Alan Zumbis
Glória Buffy
j A = Name (coluna 1) j B = Character (isto é, coluna 0)

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"]] .


Instructions

Tests

tests:
  - text: <code>hashJoin</code> é uma função.
    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> deve retornar <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