Что вы всегда хотели узнать, но боялись спросить

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 06 дек 2012, 08:51

Введение в специальность, для людей практически мыслящих

Основное различие между математикой и информатикой заключается в том, что в информатике недостаточно иметь доказательство существования объекта, требуется найти конструктивное доказательство этого факта, т.е. алгоритм. Но даже существования алгоритма может оказаться недостаточно.
Мы должны учитывать противоречия пространства и времени, которые навязывает нам мир: необходимо, чтобы решение можно было вычислить, используя объем памяти и время, приемлемое для человека или машины.

Идеальный случай, когда для решения задачи известна явная математическая формула. Тогда сложность задачи не зависит от входных данных и является постоянной.
Если же мы не располагаем ни явной формулой, ни рекуррентным выражением приемлемой сложности, нам остается только два способа:
1. построение эффективного алгоритма;
2. метод перебора всех возможностей.
Опр.1. Сложность задачи – сложность наилучшего алгоритма, известного для ее решения.

Опр.2. Вычислительная сложность алгоритма равна числу элементарных шагов, выполняемых алгоритмом в самом плохом случае, и зависит от размерности входных данных.

Объясним более точно, что подразумевается под «элементарным шагом».
Допустим, что транслятор типичной ЭВМ переводит программу в машинный язык, имеющий арифметические операции, условные переходы, операции ввода-вывода, команды переноса из памяти в буфер и т.д. Выполнение любой такой операции будем считать элементарным шагом.
Очевидно, что сложность алгоритма будет зависеть от конкретного транслятора.
Однако нас будет интересовать не абсолютная сложность, а сложность с точностью до умножения на произвольную постоянную.
Такая сложность показывает, как быстро растет число шагов при неограниченном увеличении размерности входных данных.
Такая сложность называется асимптотической и не зависит от способа трансляции.
Будем использовать следующие обозначения.
Пусть f(n) и g(n) – неотрицательные функции, n – размерность задачи, $$ C>0 $$ – некоторая постоянная. Тогда f(n) имеет порядок О(g(n)), если $$ f(n) \leq Ñ*g(n) $$ для всех n, больших некоторого номера.
Читается это так: «f(n) порядка не более, чем g(n)» или «f(n) порядка О большое от g(n)».

Три класса задач

"Хорошие", т.е. эффективные алгоритмы имеют сложность, представляющую собой многочлен (полином) заданной степени, где n – размерность входных данных: О(n), O(n2), O(n3)...
Например алгоритм поиска эйлеровых циклов в графе является линейным и имеет вычислительную сложность О(n).
Опр.3. Задачи, решаемые алгоритмами полиномиальной вычислительной сложности, относятся к классу Р полиномиальных алгоритмов.

Есть задачи, которые по своей природе имеют экспоненциальную сложность порядка не менее an, где a – константа или полином от n. Это задачи, в которых требуется построить все подмножества данного множества, все перестановки данного множества, все клики (полные подграфы) данного графа и т.д. Число ответов в этих задачах уже само по себе экспоненциально, поэтому только их печать (перечисление) потребует экспоненциального числа шагов.
Опр.4. Задачи, в которых только перечисление ответов требует экспоненциального числа шагов, относятся к классу Е экспоненциальных алгоритмов.

Теперь введём в классификацию ещё один класс - класс NP (недетерминированных полиномиальных алгоритмов). Какие задачи относятся к этому классу?
Во-первых, это это задачи класса Р полиномиальных алгоритмов, т.к. детерминированные полиномиальные алгоритмы есть частный случай недетерминированных полиномиальных.
Во-вторых, это задачи, не попавшие ни в класс Р, ни в класс Е.
В их условиях не содержатся экспоненциальные множества,
для них не разработан полиномиальный алгоритм,
для них не доказано, что такого алгоритма не существует.
Задачи из класса NP, решаемые за полиномиальное время, называются легкорешаемыми.
Задачи из класса NP, для решения которых неизвестны полиномиальные алгоритмы, называются труднорешаемыми.

Для большинства труднорешаемых задач (так называемых NP–полных задач) была доказана эквивалентность – если для одной из них удастся найти полиномиальный алгоритм, автоматически будут решены все остальные.
Так как NP-полные задачи являются "самыми трудными" в классе NP, в смысле так называемой полиномиальной сводимости, то решить одну из них полиномиальным алгоритмом, значит, доказать, что $$ NP = P  $$ и получить 1.000.000$ в придачу
Все результаты современной теории алгоритмов получены в предположении, что
$$ NP \not = P.  $$

Большая часть современных задач, возникающих во всех областях науки, техники и производства, являются NP-полными. Например, это:
Решение систем уравнений в целых числах.
Определение гамильтонова цикла.
Составление расписаний и раскрасок.
Существование множества значений логических переменных, которые позволяют сделать значение произвольного заданного логического выражения истинным.
Оптимизация пути коммивояжера через сеть городов.
Отбор файлов при запросе в информационный банк данных для получения информации с наименьшей стоимостью.
Размещение обслуживающих центров для максимального чис-ла клиентов при минимальном числе центров.
Оптимальная загрузка емкости, оптимальный раскрой.
Диагностика (болезни, поломки).
Планирование операций, размещение персонала, управление производством.
Оптимизация перевозок.
Проектирование в области электроники.


Но не надо печали!
При практическом изучении подобных задач нужно помнить следующее:
1. Для небольших и даже средних n составленный с умом экспоненциальный или псевдополиномиальный алгоритм часто более эффективен, чем полиномиальный.
2. Для реальных производственных задач большой размерности приближенные и эвристические полиномиальные алгоритмы дают решения не оптимальные, но удовлетворяющие заказчика.

Литература
Витольд Липский Комбинаторика для программистов. М.: Мир, 1988, 213 стр.

ЗЫ. Продолжение следует. Обсуждение приветствуется.

to folk
расставь пробелы, плиз, как их ставить?
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение folk » 06 дек 2012, 09:29

Уточняю один из вариантов определения терминов:

класс NP - решаемые недетерминированной машиной тьюринга за полиномиальное время
класс P - решаемые детерминированной машиной тьюринга за полиномиальное время
среди задач класса NP выделяются также задачи
NP - трудные - те к которым можно свести за полиномиальное время любую задачу из класса NP (hint: например реализовав недетерминированную машину Тьюринга)
NP - полные задачи - такие NP трудные задачи и сама лежит в классе NP ( по простому сначала к ней можно любую свести а потом еще и решить)

Недетерминированный алгоритм (машина) - который встречая развилку (ветвление, if) просто создает копию себя и они уже вдвоем продолжают решать задачу - кто превый решит тот и молодец. Тогда как тот кто пошел по ложной ветке просто исчезает. Понятно что таким образом найти решение например путь в лабиринте гораздо проще - у вас нет обходов вы просто идете во ВСЕ закоулки одновременно и время работы недетерминированного алгоритма в данном случае - время прохода по настоящему маршруту - то есть недетерминированный алгоритм решает задачу прохода по лабиринту за линейное время.

Кстати не помню что то доказательства что между NP и E ничего нет...

Кстати в голливуде был фильм в котором Николас Кейдж работал по недетерменированному алгоритму - очень наглядно. Запамятовал название.

По поводу пользы полиномиальных алгоритмов все не так просто.
Случай 1: Симплекс метод. Сложность экспоненциальная. На практике полиномиальная - прост понятен - используется чаще чем доказанно полиномиальные алгоритмы.
Cлучай 2: Сложность N^3 - метод гаусса. На практике практически не используется - во первых накапливает ошибки численные, во вторых куб это слишком много. Чаще используются итерационные методы в которых основная операция это умножение матриц а не обращение - то есть N^2 (и меньше нельзя так как элементов в матрице N^2 - если не брать разреженные матрицы и специализированные алгоритмы). (Замечу что есть прямые методы которые дают близкую к N^2 оценку - народ здорово продвинулся по теории, но все равно не слышал о практическом применении этих методов)
Случай 3: Сложность N^2 - казалось бы супер, но в области проектирования электроники характерный размер задачи 10^6-10^8 ну кое где 10^5, как результат N^2 лежит за пределами возможностей по вычислению.

Вообще в области САПР для электроники используются как правило эвристические или приближенные алгоритмы - но зато либо линейные либо чуть хуже - максимум N^log(N) - это например означает что структуры данных должны быть четко оптимизированы под работу алгоритма - нельзя себе позволить даже сортировку лишнюю. Да и вопросы отладки сталкиваются с приколами - например приходит баг и тесткейс к нему с комментарием - исправить надо за неделю, тесткейс грузится 18 часов, ошибка возникает на 72 часу работы программы. Таковы примерно реалии больших задач.
Последний раз редактировалось folk 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение folk » 06 дек 2012, 12:57

[quote=N T в t140538 (deleted)]
Был бы очень признателен, если бы определили этот термин - "полиномиальное время"
[/quote]
Полиномиальное время - это значит что задача размерности N будет решена на алгоритме переведенном в машину Тьюринга не более чем за P(N) шагов. Где P(N) это некий конкретный для данного алгоритма полином. NP это соответственно то же самое на недетерминированной машине Тьюринга. Не разрешимость за полиномиальное время означает что для любого P(N) найдется задача (и соответственно N) которая решится за больше чем P(N) шагов. В строгом смысле машина Тьюринга должна напечатать ответ и остановиться.
Последний раз редактировалось folk 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение folk » 06 дек 2012, 13:14

Стянул определение машины Тьюринга - пусть повисит пока лучшего не найдем

произвольное конечное множество A (алфавит); его элементы называются символами;
некоторый выделенный символ a0 ∈ A (пробел, или пустой символ);
конечное множество S, называемое множеством состояний;
некоторое выделенное состояние s0 ∈ S, называемое начальным;
таблицу переходов, которая определяет поведение машины в зависимости от состояния и текущего символа (см. ниже);
некоторое подмножество F⊂ S, элементы которого называются заключительными состояниями (попав в такое состояние, машина останавливается).


Таблица переходов устроена следующим образом: для каждой пары <Текущее состояние, текущий символ> указана тройка <новое состояние, новый символ, сдвиг ленты> . Здесь сдвиг одно из чисел -1 (влево), 0 (на месте) и 1 (направо). Таким образом, таблица переходов есть функция типа S x A → S x A x {-1,0,1}, определенная на тех парах, в которых состояние не является заключительным.

Остается описать поведение машины Тьюринга. В каждый момент имеется некоторая конфигурация, складывающаяся из содержимого ленты (формально говоря, содержимое ленты есть произвольное отображение Z → A), текущей позиции головки (некоторое целое число) и текущего состояния машины (элемент S). Преобразование конфигурации в следующую происходит по естественным правилам: мы смотрим в таблице, что надо делать для данного состояния и для данного символа, то есть выясняем новое состояние машины, меняем символ на указанный и после этого сдвигаем головку влево, вправо или оставляем на месте. При этом, если новое состояние является одним из заключительных, работа машины заканчивается. Остается договориться, как мы подаем информацию на вход машины и что считается результатом ее работы. Будем считать, что алфавит машины, помимо пробела, содержит символы 0 и 1 (а также, возможно, еще какие-то символы). Входом и выходом машины будут конечные последовательности нулей и единиц (двоичные слова). Входное слово записывается на пустой ленте, головка машины ставится в его первую клетку, машина приводится в начальное состояние и запускается. Если машина останавливается, результатом считается двоичное слово, которое можно прочесть, начиная с позиции головки и двигаясь направо (пока не появится символ, отличный от 0 и 1).
Последний раз редактировалось folk 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение NT » 06 дек 2012, 13:18

А вот метод тупого перебора, т.е. например цифровой замок из 4-х цифр -- тупо подбираю комбинацию 0000, 0001, ... 9999.
Как такой метод называется?
Последний раз редактировалось NT 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 06 дек 2012, 13:57

NT писал(а):Source of the post
А вот метод тупого перебора, т.е. например цифровой замок из 4-х цифр -- тупо подбираю комбинацию 0000, 0001, ... 9999.
Как такой метод называется?

полный перебор, или метод грубой силы, brute force

подсчитаем вычислительную сложность этого алгоритма
Количество цифр фиксировано, их 10 (0..9)
Размер исходных данных, который может меняться - длина входного слова (замка) - n цифр.
Количество возможных вариантов первой цифры - 10, второй цифры - 10 и.т.д
Получаем $$10*10*...*10 = 10^n$$ возможных вариантов замка
Для их генерации потребуется $$O(a^n)$$ шагов - алгоритм экспоненциальный
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение kiv » 06 дек 2012, 14:31

Рекомендую почитать Кормена, глава 34. Достаточно доходчиво об P, NP, NPC. Третье издание пока только в английском, но изменений в этой конкретной главе практически нет..

В той же книге - как определяется время работы алгоритма и т.п. вещи. Считаю, что (из того, с чем сам работал, конечно) по тематике именно алгоритмов - это наилучшая книга.

NT писал(а):Source of the post
А вот метод тупого перебора, т.е. например цифровой замок из 4-х цифр -- тупо подбираю комбинацию 0000, 0001, ... 9999.
Как такой метод называется?


Exhaustive search, вообще-то

Зависит от того, что считать размером входных данных (сейчас не шучу).
Последний раз редактировалось kiv 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение NT » 06 дек 2012, 14:31

[quote=Svetlana Fainshtein в t140542 (deleted)]как ни кодируй, что не подавай на вход - в любой модели эта задача решается за экспоненциальное число шагов[/quote]Ок. Понятно.
А вот если немного смодификовать задачу с цифровым замком $$10^4$$:
Дополнительно известно, что сумма всех цифр больше 5 и меньше 20.
В общем можно и дальше использовать "brute force", но вроде можно и иначе. Как тогда называется такой метод?
Последний раз редактировалось NT 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 06 дек 2012, 14:50

для программирования полного перебора используют рекурсивный алгоритм с возвратом (перебор с возвратом, backtracking)
дополнительные ограничения вставляются туда в виде условий (отсечений), что ускоряет работу алгоритма на реальных данных, но его теоретическая выч. сложность остаётся всё равно экспоненциальная, в худшем случае

Kiv, неча на Кормена пенять, пишите прям сюда, в дополнение и разъяснение
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 06 дек 2012, 17:10

Детерминированные машины Тьюринга (ДМТ). Класс P полиномиальных алгоритмов.

Детерминированная машина Тьюринга - математическая модель алгоритма. Вообще, по математической модели алгоритма все языки программирования можно разделить на три группы: алгоритмические (ДМТ), функциональные (вычислимая функция), логические (исчисление предикатов).

Изображение
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 11 гостей