Я пытаюсь решить следующее задание: мне дан массив из n элементов.Известно, что не все ключи массива различны, но дано, что у нас есть k различных элементов (конечно, k <= n).назначение состоит в том, чтобы выполнить сортировку массива <strong>stable в худшем случае O (n log (log n)), а k = O (log n).Мне разрешено использовать O (n) дополнительной памяти.
Мое текущее решение описано ниже:
Создать хеш-таблицу с цепочкой размера k, которая выполняет следующие действия: ifхеш-функция пытается вставить элемент в место, в котором уже есть значение - она проверяет, равны ли они, - если они есть, то добавляет его в список, если нет, то начинает перемещаться в массиве, пока не найдет место, котороеимеет то же значение или пустой пробел (который всегда идет первым).
Таким образом, списки в каждом месте содержат только элементы с одинаковыми ключами.вставка в хеш-таблицу происходит от начала до конца в исходном массиве, поэтому каждый список сортируется стабильно.Затем сортируйте массив в хеш-таблице с помощью mergeSort (для списков мы рассматриваем первый элемент как один и перемещаем его).
После того, как мы закончим сортировку слиянием, мы копируем элементы обратно в исходный массив по порядку ивсякий раз, когда мы встречаемся со списком, мы копируем каждый элемент по порядку.
Вот в чем я не уверен:
Верно ли говорить это, потому что хэш-таблицаимеет размер k, и у нас есть только k различных элементов, равномерное хеширование обещает, что количество времени, которое хеш-функция будет пытаться присвоить разным значениям одному и тому же месту в массиве, незначительно, и, следовательно, сложность времени сборки составляет O (n)?
Потому что, если это так, кажется, что время выполнения алгоритма равно O (n + k log k) = O (n + log n * log (log n)).что определенно лучше, чем O (n log k), что и требовалось.