Coursera. Design And Analisis Of Algorithms I / Coursera. Дизайн и анализ алгоритмов I: O(n log n) Algorithm for Counting Inversions I
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
В этих видео мы попрактикуемся в применении "разделяй sergstager 13.03.12 в 05:57 |
|
|
и властвуй" алгоритма и парадигмы проектирования] на разных задачах. Это также даст нам sergstager 13.03.12 в 05:58 |
||
|
возможность окинуть взглядом круг задач, к которым данная парадигма sergstager 13.03.12 в 05:59 |
||
|
успешно применима. Мы начнём с расширения алгоритма сортировки слиянием для sergstager 13.03.12 в 06:01 |
||
|
решения задачи подсчёта перестановок в массиве. Перед sergstager 13.03.12 в 06:01 |
||
|
тем, как мы примемся за эму задачу, позвольте sergstager 13.03.12 в 06:02 |
||
|
мне сказать несколько общих слов об парадигме "разделяй и властвуй". sergstager 13.03.12 в 06:03 |
||
|
Вы уже видели [классику жанра] применения этой парадигмы под названием sergstager 13.03.12 в 06:03 |
||
|
сортировка слиянием. Следующие три шага будут вам знакомы. sergstager 13.03.12 в 06:05 |
||
|
Первый шаг, неудивительно - "разделяй" задачу. На меньшие sergstager 13.03.12 в 06:06 |
||
|
подзадачи. Иногда разделение происходит только у вас в голове. Это больше sergstager 13.03.12 в 06:07 |
||
|
абстрактнтый шаг, чем реально написанный код. Иногда вам нужно и вправду копировать sergstager 13.03.12 в 06:09 |
||
|
[часть данных в новые массивы, чтобы передавать в рекурсивные вызовы.] sergstager 13.03.12 в 06:10 |
||
|
Второй шаг, что также неудивительно - "властвуй" над подзадачами используя рекурсию. sergstager 13.03.12 в 06:16 |
||
|
Например в сортировке слиянием мы разделяли массив на две sergstager 13.03.12 в 06:16 |
||
|
части и "властвовали" (или сортировали) первую часть. sergstager 13.03.12 в 06:19 |
||
|
А потом делали то же самое со второй. sergstager 13.03.12 в 06:20 |
||
|
Конечно, [всё не так легко и просто как делать эти два шага.] Разделять sergstager 13.03.12 в 06:22 |
||
|
задачу и решать подзадачи рекурсивно. Обычно нужно sergstager 13.03.12 в 06:24 |
||
|
подчищать за рекурсивными вызовами и объединять вместе решения sergstager 13.03.12 в 06:26 |
||
|
подзадач в один главный ответ задачи, задачи, которую и надо собственно sergstager 13.03.12 в 06:26 |
||
|
решить. Вспомните, как в сортировке слиянием, после рекурсивных вызовов мы получали sergstager 13.03.12 в 06:28 |
||
|
левую и правую части массива отсортированными, но их нужно sergstager 13.03.12 в 06:28 |
||
|
было ещё соединить в один большой и тоже отсортированный массив. Итак sergstager 13.03.12 в 06:29 |
||
|
третий шаг: комбинирование (соединение) решений подзадач в общее решение sergstager 13.03.12 в 06:30 |
||
|
задачи. Обычно большая часть хитростей приходится на этот третий шаг. sergstager 13.03.12 в 06:32 |
||
|
Как можно быстро-быстро объединить решения подзадач в решение главной задачи? sergstager 13.03.12 в 06:33 |
||
|
Иногда нужно проявить немного изобретательности и на первом шаге, при разделении. sergstager 13.03.12 в 06:34 |
||
|
Можно просто поделить массив на два, но можно и применить sergstager 13.03.12 в 06:35 |
||
|
мозги. В общем, давайте перейдём sergstager 13.03.12 в 06:36 |
||
|
к задаче подсчёта перестановок и увидим, как можно применить [парадигму "разделяй sergstager 13.03.12 в 06:37 |
||
|
и властвуй"] в этом случае. Определяем задачу формально: есть sergstager 13.03.12 в 06:37 |
||
|
массив А длиной N. [И вы можете определить в задаче], что в массиве sergstager 13.03.12 в 06:39 |
||
|
находятся любые различные числа. Но, чтобы было попроще - зададим, что sergstager 13.03.12 в 06:40 |
||
|
массив содержит только целые числа от 1 до N в произвольном порядке. sergstager 13.03.12 в 06:44 |
||
|
[Это передаёт сущность задачи.] Цель решения - вычислить sergstager 13.03.12 в 06:46 |
||
|
количество перестановок в массиве. "Что за перестановок?" спросите вы. sergstager 13.03.12 в 06:47 |
||
|
Перестановка - это пара элементов в массиве, такая, что A(i) > A(j) при том, что i < j. sergstager 13.03.12 в 06:50 |
||
|
То есть, это когда элемент A(i), стоящий раньше в массиве, больше, чем элемент A(j). sergstager 13.03.12 в 06:53 |
||
|
Когда массив отсортирован, то есть состоит sergstager 13.03.12 в 06:53 |
||
|
из чисел 1, 2, 3, и до N, то sergstager 13.03.12 в 06:54 |
||
|
число перестановок в нём - 0. Говоря другими словами, sergstager 13.03.12 в 06:59 |
||
|
если массив содержит числа от одного до N sergstager 13.03.12 в 06:59 |
||
|
в отсортированном порядке, то в нём не надо переставлять элементы. sergstager 13.03.12 в 07:01 |
||
|
Возьмём другой пример: массив их шести элементов. sergstager 13.03.12 в 07:02 |
||
|
Числа от одного до шести стоят так: 1, 3, 5 и далее sergstager 13.03.12 в 07:03 |
||
|
2, 4, 6. Сколько перестановок в этом массиве? Нам надо sergstager 13.03.12 в 07:04 |
||
|
брать пары элементов и сравнивать их, смотря какие более ранние (или более левые) элементы sergstager 13.03.12 в 07:09 |
||
|
больше, чем более поздние (более правые). Вот прямо в этом примере мы видим, что это sergstager 13.03.12 в 07:11 |
||
|
пять и два. Они стоят рядом и стоят не по порядку sergstager 13.03.12 в 07:14 |
