Отредактировано для уточнения
шаг 1: Запустите алгоритм, но вместо создания только одной хеш-таблицы создайте хеш-таблицу (D1), индексируемую заголовком набора, которому она соответствует (например, для [3,4], который будет равен 3) и список (L1) с самим набором
[3; 4; 6; 8; 1; 2]:
D1 L1
3 -> [3,4] 1 -> [3,4]
6 -> [6] 2 -> [6]
8 -> [8] 3 -> [8]
1 -> [1,2] 4 -> [1,2]
Шаг 2: Если вы посмотрите на имеющиеся у нас коллекции, вы увидите, что для данного набора у нас есть индекс, в котором мы его нашли (в L1), и значение Head. Правильным значением карты будет минимальное целое число между ними, которое еще не взято. Например, для [3,4] у нас будет значение от 1 до 3, и, поскольку 1 уже взято, соответствующее значение равно 2. Примите во внимание, что, поскольку D1 индексируется Head значение, более низкие значения будут всегда принимать, если соответствующий набор существует. В этом примере [1,2] отображается на 1, так что этот ключ уже «занят». Итак, в псевдокоде:
for (int Current = 1; Current < L1.Length; Current++)
{
GetHead(L1[Current]);
Index = Current;
While Head > Index
{
if D1.Empty(Index)
{
D1.Add(Index,D2[Current])
D1.DeleteIfNotEmpty(Head);
}
else
Index++;
}
}
Например
- мы берем первое значение в L1 -> [3,4] ...
- получить голову = 3
- Начиная с 1, мы ищем D1 [1], который уже занят, поэтому мы увеличиваем до 2.
- Мы ищем D1 [2], который пуст, поэтому мы присваиваем D1 [2] = [3,4] и удаляем D [3]
Это не обеспечивает O (n), но что-то вроде O (n + log (n)) (n для первого шага, log (n) для второго)
В приведенном выше примере вы получите:
1 -> [1,2]
2 -> [3,4]
3 -> [6]
4 -> [8]
Теперь, если у вас есть [3; 4; 8; 6; 1; 2], это приведет к
1 -> [1,2]
2 -> [3,4]
3 -> [8]
4 -> [6]
, поскольку он использует абсолютный порядок в исходном массиве, я не знаю, все ли в порядке, или вы захотите, чтобы 6 были в индексе 3, а 8 - в индексе 4, в этом случае вы, вероятно, имели для предварительного заказа L1 на основе головы, которая увеличит вашу сложность на Log (n)
Если вам нужно сделать предварительный заказ, у вас будет 0 (n + log ^ 2 (n)), что не так уж и плохо (возможно, меньше, если бы QuickSort имел O (Log n), а L1 будет O (log (log) п))