Сортируйте список в соответствии с порядком, определенным другим списком

StackOverflow https://stackoverflow.com/questions/3466961

  •  28-09-2019
  •  | 
  •  

Вопрос

Как я могу сортировать элементы списка А. так что они следуют за заказом другого (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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top