2016-12-27 4 views
0

Проблемно Учитывая отсортированный двукратно список ссылок и два числа C и K. Вы должны уменьшить данные узла с данными K по C и вставить новый узел, образованный на его правильное чтобы список оставался отсортированным.Лучший алгоритм сортировки - Частично отсортирован связанный список

Я бы думать о вставки рода для такой проблемы, потому что, сортировка вставкой в ​​любом случае выглядит, как показано кучу карт,

enter image description here

, которые частично отсортированных. Для сортировки вставки количество свопов эквивалентно числу инверсий. Количество сравнений равно количеству обменов + (N-1).

Итак, в заданной задаче (выше), если узел с данными K уменьшается на C, то отсортированный связанный список частично сортируется. Сортировка вставки наилучшим образом подходит.

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

Для решения этой проблемы, правильно ли мой метод рассмотрения при выборе сортировки вставки?

+0

Возможно, [это] (https://stackoverflow.com/questions/1525117/whats-the-fastest-algorithm-for-sorting-a-linked-list) ответ поможет? – Richard

+0

Является ли операция 'уменьшение (int nodeWithK, int уменьшениеByC)' однократной? –

+0

@Richard Вы говорите, что если эти данные, заданные в задаче, были представлены в виде массива, тогда лучше было бы выбрать * Insertion sort *. Если эти данные находятся в связанном списке, то * Merge sort * лучше всего подходит для частично отсортированных данных? – overexchange

ответ

1

Возможно, вы имеете в виду что-то другое, но сортировка вставки не лучший алгоритм, потому что вам действительно не нужно ничего сортировать. Если есть только один элемент со значением K, то это не имеет большого значения, но в противном случае.

Так что я хотел бы предложить следующий алгоритм O (п), не обращая внимания крайние случаи для простоты:

  1. Перейти вперед в списке, пока значение текущего узла> K - C.
  2. Сохранить этот узел, все восстановленные узлы будут вставлены перед этим.
  3. Продолжайте движение вперед, пока значение текущего узла равно < K
  4. Пока значение текущего узла равно K, удалите узел, установите значение K - C и вставьте его перед сохраненным узлом. Это может быть оптимизировано дополнительно, так что вы только удаляете и вставляете операцию всего подсписного списка узлов, которые имеют значение K.
+0

Так что это просто 'O (L)' для перехода вперед и O (1) заменить перед сохраненным узлом. Это верно? Предположим, что узлы 'L' перед узлом имеют значение' K' – overexchange

+0

. Вы имеете в виду O (n), где n - количество узлов, то оно верно. K - это значение узла, вы не знаете, где находится его список, а K может быть намного больше, чем n. Если вы хотите искать значения и получать соответствующие узлы, то хэш-карта, вероятно, является хорошим выбором или массивом, если возможные значения для K очень ограничены. – maraca

+0

Как использовать [skipList] (https://en.wikipedia.org/wiki/Skip_list) для быстрого поиска? – overexchange

1

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

Если список должен поддерживаться в порядке после того, как каждый узел уменьшится, то выбора нет, но удалить узел с уменьшенным значением и снова вставить в порядок.

Выполнение этого с помощью линейного поиска колоды карт, вероятно, приемлемо, если только вы не используете какое-то чудовищное моделирование с использованием Монте-Карло, которое работает в течение нескольких часов или дня, поэтому оптимизация рассчитывается.

В противном случае мы будем иметь дело с необходимостью поддержания порядка в использовании упорядоченной структуры данных последовательности: сбалансированное двоичное дерево (красно-черное, splay) или список пропусков. Выньте узел из структуры, настройте значение, заново вставьте: O (log N).

Смежные вопросы