Установка и настройка        16.05.2019   

Оптимальные алгоритмы. Библиотека программиста все, что необходимо начинающему и опытному программисту

На собеседованиях часто спрашивают, какая сортировка самая быстрая. Вопрос с подвохом. Объясняем, почему, и ищем оптимальный вариант.

В ответ вы должны спросить: «А для какого случая выбирается оптимальная по времени сортировка?» И лишь тогда, когда будут озвучены условия, можно смело перебирать имеющиеся варианты.

Существуют:

  • алгоритмы сортировки O(n 2) вроде сортировки вставками, пузырьком и выбором, которые используются в особых случаях;
  • быстрая сортировка (общего назначения): в среднем O(n log n) обменов, но худшее времяO(n 2) , если массив уже отсортирован, или элементы равны;
  • алгоритмы O(n log n) , такие как сортировка слиянием и кучей (пирамидальная сортировка), которые также являются хорошими алгоритмами сортировки общего назначения;
  • O(n) или линейные алгоритмы сортировки (выбор, выбор с обменом, выбор с подсчетом) для списков целых чисел, которые могут быть подходящими в зависимости от характера целых чисел в ваших списках.

Если все, что вы знаете, – это отношение общего порядка между элементами, то оптимальные алгоритмы будут иметь сложность О(n log n) . Для линейных алгоритмов нужна дополнительная информация о структуре элементов.

Оптимальность алгоритма тесно зависит от типа списков/массивов, которые вы собираетесь сортировать, и даже от модели ЭВМ. Чем больше информации в вашем распоряжении, тем более точным будет выбор. При очень слабых предположениях о факторах оптимальной сложностью худшего случая может быть О(n!) .

Данный ответ касается только сложностей. Фактическое время выполнения алгоритмов зависит от огромного количества факторов.

Тестирование

Итак, какая же сортировка самая быстрая?

Визуализация

Неплохая визуализация сортировок продемонстрирована в этом видео:

Кажется, что она отвечает на вопрос о том, какая сортировка самая быстрая, но не стоит забывать, что на скорость влияет множество факторов, и это лишь один из продемонстрированных вариантов.

Наилучший алгоритм замещения страниц несложно описать, но совершенно невозможно реализовать. В нем все происходит следующим образом. На момент возникновения ошибки отсутствия страницы в памяти находится определенный набор страниц. К некоторым из этих страниц будет осуществляться обращение буквально из следующих команд (эти команды содержатся на странице). К другим страницам обращения может не быть и через 10, 100 или, возможно, даже 1000 команд. Каждая страница может быть помечена количеством команд, которые должны быть выполнены до первого обращения к странице.

Оптимальный алгоритм замещения страниц гласит, что должна быть удалена страница, имеющая пометку с наибольшим значением. Если какая-то страница не будет использоваться на протяжении 8 млн команд, а другая какая-нибудь страница не будет использоваться на протяжении 6 млн команд, то удаление первой из них приведет к ошибке отсутствия страницы, в результате которой она будет снова выбрана с диска в самом отдаленном будущем. Компьютеры, как и люди, пытаются по возможности максимально отсрочить неприятные события.

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

Таким образом появляется возможность сравнить производительность осуществимых алгоритмов с наилучшим из возможных. Если операционная система достигает производительности, скажем, на 1 % хуже, чем у оптимального алгоритма, то усилия, затраченные на поиски более совершенного алгоритма, дадут не более 1 % улучшения.

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

Оптимизация алгоритма разрабатываемой программы
Этап разработки алгоритма вашего приложения - самый сложный во всей цепочке жизненного цикла программы. От того, насколько глубоко продуманы все аспекты вашей задачи, во многом зависит успех ее реализации в виде программного кода. В общем случае изменения в структуре самой программы дают намного больший эффект, чем тонкая настройка программного кода. Идеальных решений не бывает, и разработка алгоритма приложения всегда сопровождается ошибками и недоработками. Здесь важно найти узкие места в алгоритме, наиболее влияющие на производительность работы приложения.

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

Следует иметь в виду, что алгоритм, эффективный с точки зрения производительности программы, никогда не соответствует требованиям постановки задачи на все 100% и наоборот. Неплохие с точки зрения структуры и читабельности алгоритмы, как правило, не эффективны в плане реализации программного кода. Одна из причин - стремление разработчика упростить общую структуру программы за счет использования везде, где только можно, высокоуровневых вложенных структур для вычислений. Упрощение алгоритма в этом случае неизбежно ведет к снижению производительности программы.

В начале разработки алгоритма довольно сложно оценить, каким будет программный код приложения. Чтобы правильно разработать алгоритм программы, необходимо следовать нескольким простым правилам:
1. Тщательно изучить задачу, для которой будет разработана программа.
2. Определить основные требования к программе и представить их в формализованном виде.
3. Определить форму представления. входных и выходных данных и их структуру, а также возможные ограничения.
4. На основе этих данных определить программный вариант (или модель) реализации задачи.
5. Выбрать метод реализации задачи.
6. Разработать алгоритм реализации программного кода. Не следует путать алгоритм решения задачи с алгоритмом реализации программного кода.
В общем случае, они никогда не совпадают. Это самый ответственный этап разработки программного обеспечения!
7. Разработать исходный текст программы в соответствии с алгоритмом реализации программного кода.
8. Провести отладку и тестирование программного кода разработанного приложения.

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

При создании больших приложений, возможно, понадобится разрабатывать и тестировать отдельные фрагменты программного кода, что может потребовать дополнительной детализации программного алгоритма.
Для правильной алгоритмизации задач программисту могут помочь многочисленные литературные источники. Принципы построения эффективных алгоритмов достаточно хорошо разработаны. Имеется немало хорошей литературы по этой теме, например книга Д. Кнута "Искусство программирования".

Оптимизация с учетом аппаратных средств компьютера
Обычно разработчик программного обеспечения стремится к тому, чтобы производительность работы приложения как можно меньше зависела от аппаратуры компьютера. При этом следует принимать во внимание наихудший вариант, когда у пользователя вашей программы будет далеко не самая последняя модель компьютера. В этом случае "ревизия" работы аппаратной части часто позволяет найти резервы для улучшения работы приложения.
Первое, что нужно сделать, - проанализировать производительность компьютерной периферии, на которой должна работать программа. В любом случае знание того, что работает быстрее, а что медленнее, поможет при разработке программы. Анализ пропускной способности системы позволяет определить узкие места и принять правильное решение. Различные устройства компьютера имеют разную пропускную способность. Наиболее быстрыми из них являются процессор и оперативная память, относительно медленными - жесткий диск и CD-привод. Самыми медленными являются принтеры, плоттеры и сканеры.

Во многих приложениях возникает задача обнаружения аномалий, которые могут появиться на очередном многомерном кадре последовательности изображений. Такими аномалиями могут быть, например, очаги лесных пожаров, патологические изменения на медицинских изображениях, новые объекты в охраняемой зоне и др. При этом задача обнаружения формализуется следующим образом, Пусть производятся наблюдения

СП с пространственно-временными корреляционными связями и СП независимых случайных величин с нулевыми средними и дисперсиями . Вектор параметров позволяет учесть, например, возможные взаимные пространственные смещения и повороты соседних кадров изображения.

Появление детерминированного сигнала приводит к изменению модели (2.1) лишь в области индексов (рис. 1) последнего из наблюдаемых кадров:

где - совокупность отсчетов полезного сигнала.

В рассмотренных условиях необходимо найти правило проверки гипотезы Н0 об отсутствии аномалии в области G при альтернативном предположении Н1 о справедливости модели (2.2).

При заданных вероятностных характеристиках компонент моделей (2.1), (2.2) могут быть определены соответствующие условные плотности распределения вероятностей (ПРВ) наблюдений W(Z|Н0) и W(Z|Н1). Поэтому для решения задачи обнаружения следует воспользоваться сравнением с пороговым уровнем отношения правдоподобия (ОП):

(2.3)

Для упрощения вычислений представим условные ПРВ в виде произведений: , где ZG - совокупность наблюдений по области G; Z0 - совокупность всех наблюдений, не принадлежащих области предполагаемого сигнала. Поскольку , ОП (2.3) перепишется в форме:

. (2.4)

Будем аппроксимировать условные ПРВ, входящие в ОП (2.4), гауссовскими распределениями:

где , и , , - условные математические ожидания и пространственные ковариационные матрицы наблюдений ZG при отсутствии и наличии полезного сигнала соответственно.

С учетом моделей наблюдений (2.1), (2.2) нетрудно получить следующие формулы для условных средних , где - оптимальный прогноз значений СП , построенный на основе всех имеющихся наблюдений Z0 , не принадлежащих области сигнала. Пространственные матрицы V0 и V1 оказываются одинаковыми:, где - ковариационная матрица ошибок оптимального прогноза.

После подстановки приведенных соотношений в (2.4), (2.5) и логарифмирования находим следующий алгоритм обнаружения сигнала:

, (2.6)

где- порог обнаружения. Как следует из формулы (2.6), процедура обнаружения аномалий включает в себя компенсацию мешающих изображений с помощью вычитания из наблюдения оптимального прогноза , найденного на основе всех наблюдений, не принадлежащих области G. После компенсации мешающих СП осуществляется линейное весовое cуммирование остатков

Применяя формулу Фробениуса обращения блочных матриц, можно показать, что статистика приводиться к эквивалентному виду:

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

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

, (2.8)

где ; - ковариационная матрица мешающего изображения.

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

(2.9)

соответствующий предварительному "выбеливанию" последовательности изображений , и последующему весовому суммированию с весами . Во многих случаях такой подход позволяет найти приемлемые для практики квазиоптимальные алгоритмы "выбеливания" . При этом самостоятельное рассмотрение адаптивных рекурсивных фильтров, близких по свойствам к выбеливающим, является важным направлением поиска возможностей относительно простой технической или программной реализации системы обработки последовательностей изображений. Новым качеством, которым обладают алгоритмы (2.7), (2.8) и (2.9) по отношению к (2.6), является разделение трудоемкой операции оптимального прогнозирования или выбеливания, не связанной с формой сигнала, и относительно простого весового суммирования, учитывающего вид полезного сигнала. Это позволяет достаточно просто решать как задачи обнаружения аномалий с неизвестными параметрами положения, так и более сложные проблемы многоальтернативного обнаружения (распознавания) нескольких видов сигналов .

Приведенные результаты позволяют уточнить условия, при которых справедлива предложенная замена условных ПРВ нормальными распределениями. Прежде всего, это широкий класс с гауссовскими моделями (2.1), (2.2). В этих случаях процедуры (2.6), (2.7), (2.9) строго оптимальны. При негауссовских компонентах моделей (2.1), (2.2) достаточным условием оптимальности служит возможность аппроксимации апостериорной ПРВ прогноза нормальным распределением. Заметим, что последнее условие выполняется и во многих прикладных задачах обработки СП со значительными пространственно-временными корреляционными связями и обычно эквивалентно условию высокой апостериорной точности прогнозирования.

Оценка сложности алгоритмов

6. Оптимизация алгоритмов

Пока компьютерные науки не накопили достаточно сведений для того, чтобы задача минимизации могла быть поставлена с обычной для математики определенностью. Этому мешает несколько факторов.

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

Во-вторых, не совсем ясно, что такое сложность задачи. Ее можно было бы определить как минимальную из сложностей алгоритмов, решающих эту задачу. Но существует ли алгоритм минимальной сложности (как убедиться, что найденный алгоритм действительно минимальный или, напротив, не минимальный)? Есть ли к чему стремиться? И насколько труден поиск этого минимума? Эти вопросы связаны с нижней оценкой сложности алгоритмов (а не верхней, как в предыдущих шагах) (5, стр. 89-92).

Можно ли для рассматриваемой задачи доказать, что никакой решающий ее алгоритм не может быть проще этой нижней оценки? Возьмем известную задачу перемножения квадратных матриц. Приведен алгоритм сложности Т(n) = 3n3 + n2. (8, стр. 199-203) Вероятно, это не лучший алгоритм, но какова оценка снизу? Результирующая матрица имеет n2 элементов. Для вычисления любого элемента нужна хотя бы одна операция однопроцессорной машины - два элемента за одну операцию найти нельзя. Для минимального алгоритма мы получаем неравенства n2 <= T, min(n) <= 3n3+n2 . Вряд ли n2 - хорошая нижняя оценка, но уже известно, что n3 нижней оценкой не является, так как найдены более быстрые алгоритмы (в частности, алгоритм Штрассена). (8, стр. 211)

Существует несколько самостоятельных аспектов оптимизации программ, из которых выделим два:

Оптимизация, связанная с выбором метода построения алгоритма;

Оптимизация, связанная с выбором методов представления данных в программе.

Первый вид оптимизации имеет глобальный характер и ведет к уменьшению порядка функции сложности - например, замена алгоритма с Т(V) = O(FS) на алгоритм с T(V) = O(V4). Он зависит от того, как задача разбивается на подзадачи, насколько это разбиение свойственно самой задаче или является только искусственным приемом. Общим руководящим подходом здесь может быть последовательность действий, обратная анализу алгоритмов. При анализе по рекурсивному алгоритму строится уравнение, которое затем решается. При оптимизации реализуется цепочка:

Формула, задающая желаемую сложность ->

Соответствующее уравнение (одно из возможных) ->

Метод разбиения задачи на подзадачи.

Второй вид оптимизации, не меняя структуры программы в целом, ведет к экономии памяти и/или упрощению работы со структурами данных, повышению эффективности вспомогательных процедур, обеспечивающих "интерфейс" между прикладным уровнем (на котором мыслим в терминах высокоуровневых объектов - графов, матриц, текстов и т. д.) и машинным уровнем, поддерживающим простейшие типы данных (числа, символы, указатели). Результатом этого обычно является уменьшение коэффициентов при некоторых слагаемых в функции сложности (при удачной оптимизации - при наиболее значимом слагаемом), но порядок функции сложности остается тем же. (7, стр. 204)

Оба вида оптимизации дополняют друг друга и могут применяться совместно.

Алгоритмы решения задач выбора. Алгоритм отжига

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

Анализ и синтез на базе комплекса технических средств гипотетической микропроцессорной системы оптимального управления технологическим процессом и оборудованием технического объекта парогенератор в условиях стохастической неопределенности

Одной из ключевых проблем при проектировании АСУ ТП является проблема оптимизации, от обоснованной постановки и успешного решения которой во многом зависит эффективность АСУ ТП...

Компьютерное моделирование беспроводных AD-HOC сетей для целей расчета времени связи мобильных абонентов

Оптимизация - это процесс изменения программы по определенным критериям с целью повышения ее качества при сохранении смысла исходной программы. Для сокращения объёма кода программы он разбивается на части - подпрограммы...

Моделирование и оптимизация автомобильных дорог

Введем следующие обозначения: Xi - остаточные средства на начало iго этапа; Uj - количество средств, которые решено выделить i - предприятию; Пi - прибыль, получаемая этим предприятием...

Моделирование системы автоматического регулирования программным и имитационным методом

Оптимизация реализована методом последовательного симплексного планирования (симплексным методом). Режим оптимизации включает в себя два следующих подрежима: задание начальных условий и границ оптимизации; запуск оптимизации в работу...

Оптимизация плана производства и поставок с использованием системы планирования IBM ILOG Plant PowerOps

IBM ILOG Plant PowerOps состоит из четырех модулей: планирования производства, определения размера партий, составления детальных графиков и закрепления за спросом. Каждый из модулей решает специфические задачи в процессе оптимизации...

Особенности работы в программном пакете MicroCAP-7

Параметрическая оптимизация выполняется в программе МС7 методом Пауэлла (Powell) в любом из видов анализа: анализ переходных процессов, малосигнальный АС-анализ и расчет характеристик на постоянном токе DC...

Особенности создания текстового контента для сайта ННГУ им. Н.И. Лобачевского

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

Проектирование и моделирование электрических схем в графической системе AutoCAD и пакете программ OrCAD 9.2

электрический цепь кинематический магнитофон Далее, мы добавляем параметры оптимизации в схему, устанавливая текущие «Current Value», начальные «Initial Value» значения компонентов, а так же допуск «Tolerance»...

Разработка конструкции двухместного компьютерного стола

Кроме возможности 3d-конструирования изделий, создания чертежей и спецификаций на детали, а также расчета материалов, необходимых для изготовления изделия, “bCAD Мебельщик” позволяет производить экономичный...

Разработка модели агентства недвижимости в соответствии со стандартом IDEF0

Данная модель относится к типу «to be», то есть модель построена по принципу «так как должно быть». В процессе создания модели мною были исправлены некоторые недостатки...

Разработка приложения для выбора покупки пары станков

Задачи одномерной минимизации представляют собой простейшую математическую модель оптимизации, в которой целевая функция зависит от одной переменной, а допустимым множеством является отрезок вещественной оси...

Разработка программы "Определение оптимального срока замены оборудования"

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

Системный анализ информационной системы управления персоналом на предприятии

Создание виртуального 3D тура из серии виртуальных фотопанорам

Для совершенной склейки панорамы, то есть склейки без видимых «швов», дистанция между парами контрольных точек должна быть минимальной. В процессе оптимизации рассчитывается...