Внутреннее соединение - это операция, которая объединяет две таблицы данных в одну таблицу на основе совпадающих значений столбцов. Простейшим способом реализации этой операции является алгоритм объединения вложенных циклов , но более масштабируемой альтернативой является алгоритм хеш-соединения .
Внедрите алгоритм «хеш-соединения» и продемонстрируйте, что он проходит тестовый сценарий, указанный ниже.
Вы должны представлять таблицы как структуры данных, которые кажутся естественными на вашем языке программирования.
Алгоритм «хеш-соединения» состоит из двух шагов:
Хэш-фаза. Создайте мультимап из одной из двух таблиц, сопоставляя их со всеми значениями столбца объединения со всеми строками, которые его содержат. Мультимап должен поддерживать хэш-ориентированный поиск, который масштабируется лучше, чем простой линейный поиск, потому что в этом весь смысл этого алгоритма. В идеале мы должны создать мультимап для меньшей таблицы, таким образом минимизируя время его создания и размер памяти. Фаза присоединения. Сканируйте другую таблицу и найдите соответствующие строки, просмотрев созданный ранее мультимап.В псевдокоде алгоритм может быть выражен следующим образом:
пусть A = первая входная таблица (или, в идеале, большая) пусть B = вторая входная таблица (или, в идеале, меньшая) пусть j A = идентификатор столбца соединения таблицы A пусть j B = идентификатор столбца соединения таблицы B пусть M B = мультимап для отображения из отдельных значений в несколько строк таблицы B (начинается пустым) пусть C = выходная таблица (начинается пустая) для каждой строки b в таблице B: место b в multimap M B под клавишей b (j B ) для каждой строки a в таблице A: для каждой строки b в мультимадре M B под ключом a (j A ): пусть c = конкатенация строки a и строки b поместите строку c в таблицу CПрецедент
вход
|
Вывод
A.Age | Имя | B.Character | B.Nemesis |
---|---|---|---|
27 | Иона | Иона | Киты |
27 | Иона | Иона | Пауки |
18 | Алан | Алан | привидения |
18 | Алан | Алан | Zombies |
28 | слава | слава | Buffy |
28 | Алан | Алан | привидения |
28 | Алан | Алан | Zombies |
Порядок строк в выходной таблице не имеет значения.
Если вы используете численные индексированные массивы для представления строк таблицы (вместо обращения к столбцам по имени), вы можете представить выходные строки в форме [[27, "Jonah"], ["Jonah", "Whales"]]
,
hashJoin
- это функция.
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" }])
должен возвращать [{"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"}]
");'
```