объединение хеш-таблиц в массив - PullRequest
0 голосов
/ 07 мая 2011

Я хочу объединить 2 или более хеш-таблиц вместе. Не имеет значения, какой будет конечная форма, если я могу ее перебирать. Здесь окончательная форма представляет собой массив.

Таким образом, у меня есть длинная беззнаковая длина ключа, значение представляет собой строку int. Каждый ключ сопоставляется с ячейкой, каждая ячейка может иметь коллизии. Вместо того, чтобы копировать всю хеш-таблицу в массив, я копирую ее по бин-бинам, поэтому мне не нужно будет перебирать весь массив. Сначала я копирую первый бин первого хеш-таблицы в массив Pairs, со строкой и int в качестве полей (ключ игнорируется) '

Что-то вроде

Class Pair{
char* s;
int frequency;
};

Чтобы добавить его в массив, мне нужно что-то вроде этого ...

Pair pair
pair.s=string of the hashtable value
pair.s=integer of the hashtable value
array[index]=pair;

Затем, чтобы объединить 1-й блок 2-й хеш-таблицы в массив, я сначала проверяю, находится ли строка значения хеш-таблицы в массиве, если это так, я просто обновляю часть int пары классов, соответствующую строка, которая находится в массиве, если это не так, я добавляю ее в массив.

Затем я перехожу к следующему бину .. скопируем 2-й блок первого хеш-таблицы в массив ... затем вместо того, чтобы перебирать весь массив, чтобы проверить, что во 2-м бине 2-го хеш-таблицы находится в массиве Я начинаю поиск по индексу массива, где первый элемент второго бина был вставлен в массив.

Проблема даже в том, чтобы повторить этот путь, все еще довольно продолжительный, поскольку каждый бин может содержать более 1000 коллизий, и есть тысячи бинов, через которые нужно пройти. Я хочу избежать этого. Я думал, так как каждый ключ (который является длинным длинным) уникален для каждой строки, чтобы установить смещение для этого номера ключа равным 1, если он находится в массиве, и 0, если это не так. Таким образом, мне нужно только перебрать массив, если он находится в массиве. Проблема с этим длинным длинным просто слишком велика. Я не могу выделить массив с таким количеством битов ...

Есть ли другой способ?

1 Ответ

0 голосов
/ 07 мая 2011

При копировании значений из первой хеш-таблицы создайте временную хеш-таблицу с теми же ключами, но значениями которых будет индекс массива, в который они были вставлены. Затем, при копировании значений из второй хеш-таблицы, проверьте, находится ли каждый ключ во временной таблице, и если это так, вы знаете, какой элемент массива нужно обновить немедленно (в противном случае вы просто помещаете новое значение в конец).

Другой подход, который занимал бы меньше места, но изменял бы ваш ввод, состоял бы в том, чтобы скопировать вторую хеш-таблицу поверх первой, а затем скопировать этот объединенный результат в массив. Это естественным образом объединит две хеш-таблицы без дополнительной памяти, но, возможно, не будет таким большим, если хеш-таблицы будут использоваться в дальнейшем при выполнении вашей программы.

...