К основному контенту

Сообщения

Сообщения за март, 2018

Метод турниров

Метод турниров можно использовать для решения задач, в которых информация, полученная в результате первого прохода по данным, может облегчить последующие проходы. Поиск наибольшего значения Если воспользоваться им для поиска наибольшего значения, то потребуется построение бинарного дерева, все элементы которого являются листьями. На каждом уровне два элемента объединены в пару, причем наибольший из двух элементов копируется в родительский узел. Процесс повторяется до достижения корневого узла. Полное дерево турнира для фиксированного набора данных: Алгоритм поиска второго по величине элемента списка из N значений, требующий около N сравнений В результате каждого сравнения мы получаем "победителя" и "проигравшего". Проигравших мы забываем, и вверх по дереву двигаются только победители. Всякий элемент, за исключением наибольшего, "проигрывает" в точности в одном сравнении. Поэтому для построения дерева турнира требуется N-1 сравнение. Вт...

Скорость роста сложности алгоритма

Быстрорастущие функции доминируют над функциями с более медленным ростом. Поэтому если сложность алгоритма представляет собой сумму двух или нескольких таких функций, то можно отбросить все функции, кроме тех, которые растут быстрее всего. Если, например, алгоритм делает x 3 -30x сравнений, то его сложность растет как x 3 . Причина этого в том, что уже при x = 100 входных данных разница между x 3 и x 3 -30x составляет лишь 0,3%. Скорость роста сложности алгоритма определяется старшим, доминирующим членом формулы. Поэтому можно пренебрегать младшими членами, которые растут медленнее. Отбросив все младшие члены, мы получаем то, что называется порядком функции или алгоритма, скоростью роста сложности которого она является. Алгоритмы, сложность которых: - растёт по крайней мере так же быстро, как данная функция При занятии эффективностью алгоритмов, класс Ω(f) не представляет большого интереса: например в Ω(n 2 ) входят все функции, растущие быстрее, чем n 2 , скажем...

Выбор представления данных

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

Выбор абстрактного представления реальности

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

Бинарные деревья

Бинарное дерево представляет собой структуру, в которой каждый узел (или вершина) имеет не более двух узлов-потомков и в точности одного родителя. Самый верхний узел дерева является единственным узлом без родителей; он называется корневым узлом, или корнем. Бинарное дерево с N узлами имеет не меньше ⌊log 2 N + 1⌋ уровней (при максимально плотной упаковке узлов). Например, у полного бинарного дерева с 15 узлами один корень, два узла на втором уровне, четыре узла на третьем уровне и восемь узлов на четвертом уровне; наше равенство также даёт ⌊log 2 15⌋ + 1 = ⌊3,9⌋ + 1 = 4 уровня. Добавление еще одного узла к дереву приведет к появлению нового уровня, и их число станет равным ⌊log 2 16⌋ + 1 = ⌊4⌋ + 1 = 5. В самом большом бинарном дереве с N узлами N уровней: у каждого узла этого дерева в точности один потомок (и само дерево представляет собой список). Если уровни дерева занумеровать, считая, что корень лежит на уровне 1, то на уровне с номером k лежит не более чем 2 k - 1 узл...

Средний случай

Анализ среднего случая является самым сложным, поскольку он требует учета множества разнообразных деталей.  В основе анализа лежит определение различных групп, на которые следует разбить возможные входные наборы данных. На втором шаге определяется вероятность, с которой входной набор данных принадлежит каждой группе. На третьем шаге подсчитывается время работы алгоритма на данных из каждой группы. Время работы алгоритма на всех входных данных одной группы должно быть одинаковым, в противном случае группу следует разбить ещё раз. Среднее время работы вычисляется по формуле: ,  где n - размер входных данных; m - число групп; p i - вероятность того, что входные данные принадлежат группе с номером i; t i - время необходимое алгоритму для обработки данных из группы с номером i. И разбиение на группы, и значения параметров p i  и t i  зависят от n. Если вероятность попадания входных данных в каждую из групп одинакова, то среднее время работы ...

Наихудший случай

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

Наилучший случай

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

Сравнение и арифметические операции

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

Классы входных данных

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

Как изучать программирование?

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

Рекурсивные структуры данных

Рекурсивные структуры данных являются важным подклассом часто используемых динамических структур. Хотя рекурсивные определения возможны и даже естественны в этих случаях, на практике они обычно не используются. Вместо них используют явные ссылочные или указательные переменные.

Машина Тьюринга (более мощная форма автомата)

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

Принципы выбора подсчитываемых операций

В большинстве случаев нет нужды точно подсчитывать количество выполненных операций как функцию от размера входных данных N. Разница между алгоритмом, который делает N + 5 операций, и тем, который делает N + 250 операций, становится незаметной, как только N становится очень большим. Решение вопроса о том, что считать, состоит из двух шагов. На первом шаге выбирается значимая операция или группа операций, а на втором - каких из этих операций содержатся в теле алгоритма, а какие составляют накладные расходы или уходят на регистрацию и учет данных. В качестве значимых обычно выступают операции двух типов: сравнение и арифметические операции . Инициализация Вес инициализации по отношению ко времени выполнения алгоритма незначителен. В терминах анализа при увеличении объёма входных данных стоимость инициализации становится пренебрежимо малой. Алгоритм подсчета числа вхождений различных символов в файл Рассмотрим, например, алгоритм подсчета числа вхождений различных символов в ф...

Условия влияющие на скорость работы программы

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

Сложность по памяти

На ранних этапах развития компьютеров при ограниченных объёмах компьютерной памяти (как внешней, так и внутренней) анализ памяти носил принципиальный характер. Все алгоритмы разделяются на такие, которым достаточно ограниченной памяти, и те, которым нужно дополнительное пространство. Предположим, например, что мы записываем вещественное число из интервала от -10 до +10, имеющее один десятичный знак после запятой. При записи этого числа в вещественно виде большинство компьютеров потратит от 4 до 8 байтов памяти, однако если предварительно умножить число на 10, то мы получим целое число из интервала от -100 до +100, а для его хранения выделяется всего один байт. По сравнению с первым вариантом экономия составляет от 3 до 7 байтов. Программа, в которой сохраняется 1000 таких чисел, экономит от 3000 до 7000 байтов. Если принять во внимание, что еще недавно - в начале 80-х годов прошлого века - у компьютеров была память объёмом лишь 65 536 байтов, экономия получается существенной. Име...

Систематический научный подход к построению программ

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

Вычислительная сложность алгоритма

Вычислительная сложность алгоритма (количество "времени", необходимое для его выполнения) - это приблизительное число операций, выполняемых алгоритмом. Точное знание количества операций каждого типа, выполненных алгоритмом, не играет существенной роли в его анализе. Интересен только общий характер поведения алгоритмов, а не его подробности. Ключевую роль играет скорость роста числа операций - зависимость числа операций конкретного алгоритма от размера входных данных. Она называется скоростью роста алгоритма . При анализе алгоритмов интересен класс скорости роста, к которому относится алгоритм. Алгоритмы сравниваются по скорости роста числа операций. Небольшие объёмы входных данных не столь интересны, как то, что происходит при возрастании этих объёмов, поскольку на малых объёмах принципиальная разница оказывается скрытой. При небольшом размере входных данных алгоритм A может требовать меньшего количества операций, чем алгоритм B, но при росте объема входных данных...

Как строить эффективные алгоритмы?

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

"Богатый набор средств"

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

Максимальное прояснение логики программ

Цикл Дейкстры Максимального прояснения логики программ можно достичь в том числе за счет использования цикла Дейкстры. Цикл Дейкстры (многоветочный while) - это фундаментальная и мощная управляющая структура. Оптимизация Склонность к оптимизации до полного прояснения логики программ, затрудняет эффективное применение формальной техники. Два алгоритма выбора наибольшей из четырех величин Рассмотрим, например, два алгоритма, в которых выбирается наибольшее из четырех величин: bash: [1] [2] При сопоставлении этих алгоритмов видно, что в каждом делается 3 сравнения. Первый алгоритм легче прочесть и понять, но с точки зрения выполнения на компьютере у них одинаковый уровень сложности. По временным затратам эти алгоритмы одинаковы, но первый требует больше памяти из-за временной переменной и именем largest . Рекурсия В некоторых задачах рекурсия даёт наиболее естественную формулировку решения, тогда как использование итерации привело бы к запутанным и громоздки...

Все кому приходится самостоятельно писать программы

Студенты Научные работники Физики Инженеры Лингвисты Программисты Программисты банковских систем Разработчики банкоматов

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

Современные цифровые компьютеры были изобретены для выполнения сложных и длинных вычислений. Вычислительные приложения Задачи символической алгебры с предельно динамичными структурами данных Системы управления От беспилотников весом в 1 кг до грандиозных каскадов ГЭС Организация систем связи Программирование спутников связи Нефте- и газодобыча Инженерные проекты Банковские операции Получение денег в банкомате по кредитной карте Бронирование билетов Онлайн-бронирование — Википедия Электронный билет (воздушный транспорт) — Википедия Глобальная дистрибьюторская система — Википедия Торговля