Чтобы понять, как вы будете использовать самый длинный алгоритм увеличения подпоследовательности для решения этой проблемы, давайте начнем с некоторой интуиции, а затем перейдем к решению. Поскольку вы можете строить мосты между городами только по совпадающим индексам, вы можете думать о наборе мостов, который вы в итоге построите, как о самом большом наборе пар, которое вы можете найти, и в котором нет пересечения. Так при каких обстоятельствах у вас будет переход?
Посмотрим, когда это может произойти. Предположим, что мы сортируем все мосты, построенные их первым городом. Если два моста пересекаются, то мы должны иметь некоторый мост (a i , b i ) такой, что для какого-то другого моста (a j , b j ) выполняется одно из следующих действий:
Этот первый случай говорит о том, что существует мост, верхний город которого находится правее, чем начало нашего моста, а нижний город дальше слева, чем конец нашего моста, а второй случай обрабатывает противоположный случай. .
Учитывая, что это свойство должно храниться, мы должны убедиться, что для каждого набора мостов у нас есть одно из двух следующих свойств для любой пары мостов (a i , b i ), (a j , b j ): либо
- a i & le; a j и b i & le; б J
или
- a i & ge; a j и b i & ge; б J
Другими словами, если бы мы сортировали мосты по их первой координате, набор вторых координат всегда увеличивался бы. Точно так же, если бы мы сортировали мосты по их вторым координатам, первая координата всегда увеличивалась бы.
Свойство, которое мы только что определили, определяет частичное упорядочение & le; обоих на множестве мостов, где мы говорим, что (a i , b i ) & le; оба (a j , b j ), если a i & le; a j и b i & le; б J . Обратите внимание, что это не полное упорядочение - например, (1, 2) несопоставимо с (2, 1) - но это частичное упорядочение, потому что оно рефлексивно, антисимметрично и транзитивно.
Учитывая это, цель задачи состоит в том, чтобы найти самый большой набор элементов, который мы можем, который может быть полностью упорядочен этим соотношением, поскольку если у нас есть набор, содержащий два несопоставимых элемента, эти элементы обязательно должны представлять собой пересекающиеся мосты. Другими словами, мы хотим найти самую длинную цепочку в частичном порядке. Один из способов сделать это состоит в том, чтобы за O (n 2 ) сравнить каждый элемент с каждым другим элементом и посмотреть, какие элементы можно упорядочить с помощью & le; обоих . Это создает ориентированный ациклический граф, где пара (a i , b i ) имеет ребро к (a j , b j ) iff (a i , b i ) & le; Оба (a j , b j ) , Получив этот ориентированный ациклический граф, мы можем найти самый длинный путь в графе , чтобы найти самый большой набор элементов, которые сравнимы по вызовам с помощью & le; обоих , что затем дает Решение проблемы. Таким образом, общее время выполнения O (n 2 ).
Однако мы можем добиться значительно большего, чем это. Проблема с приведенным выше алгоритмом заключается в том, что мы не можем легко определить, как элементы сравниваются друг с другом, поэтому мы должны явно сравнивать каждый город с другим городом.
2 5 8 10
6 4 1 2
Давайте отсортируем города по нижнему ряду:
8 10 5 2
1 2 4 6
Теперь вот действительно классное наблюдение.Если у нас есть элементы, отсортированные по их нижнему ряду, то мы можем определить, можно ли упорядочить две пары по ≤ обоим , посмотрев их позиции в верхнем ряду.Если первая пара находится слева от второй пары, мы сразу знаем, что вторые элементы первой пары меньше, чем второй элемент второй пары, так как мы отсортировали их по второй координате.Затем мы получаем, что пара элементов может быть собрана вместе, если первый элемент первой пары меньше первого элемента второй пары.Следовательно, если мы хотим найти набор мостов, которые можно построить вместе, мы ищем возрастающую подпоследовательность верхнего ряда, поскольку в этом случае как первый, так и второй элементы пар увеличиваются по мере того, как мы отходим отслева направо.Нахождение самой длинной возрастающей подпоследовательности решает эту проблему.Поскольку мы можем отсортировать пары по их второму полю в O (n log n) и найти самую длинную возрастающую подпоследовательность в O (n log n), это решение задачи O (n log n)!
Уф!Надеюсь, что этот ответ объясняет детали в деталях!