Сортируйте список в соответствии с порядком, определенным другим списком
Вопрос
Как я могу сортировать элементы списка А. так что они следуют за заказом другого (SuperSet) списка Преступность? Предположим не дубликаты.
Например А. может содержать [8 2 5 1] и Преступность может содержать [5 6 9 8 7 4 1 2 3], и поэтому я хотел бы разобраться А. стать [5 8 1 2
Я заинтересован в способах делать это эффективно и с хорошей сложностью времени выполнения.
Решение
Если Преступность это суперс А., Я бы просто бросил А. в хэш-стол, сканировать Преступность и создать новый список, где я вставляю каждый элемент из Преступность Это содержится в хэш-таблице. Использует O (A) дополнительную память и O (B) время выполнения.
Другие советы
Вот некоторые идеи:
(В то время, когда указываются сложности, N. это размер А. а также М. это размер Преступность. Отказ Сложность времени не упрощаются.)
- Для каждого элемента в Преступность, сделать линейный поиск А. чтобы увидеть, существует ли этот элемент в этом. Если это так, поменяйте его с первым элементом в А. Это еще не было вложено в должность. Сложность времени: O (нм)
- Так же, как указано выше, но сначала поместите содержание А. в эффективную структуру поиска, чтобы избежать линейного поиска. Сложность времени: O (N + M) Предполагая, что O (1) поиск
- Сортировать Преступность. Отказ Тогда для каждого элемента в А., найти свой индекс (который гарантированно существует) внутри Преступность Использование двоичного поиска. Запишите этот индекс в вспомогательной массиве одинакового размера, что и А.. Отказ Используйте этот массив индексов в качестве ввода в компаратор, который сортирует А.. Сложность времени: O (m log m) + (n log n) + (n log n))