При разработке алгоритма для компьютерного решения той или иной задачи
необходимая информация формализуется в виде набора элементов различных
типов. В каждой системе программирования предусмотрено использование
некоторых
При алгоритмизации задач, решение которых опирается на использование математических знаний и требует математических доказательств, разработка алгоритма часто проводится также в математических или формализованных прикладных терминах. При этом в достаточно большой степени происходит отвлечение от технических возможностей исполнителя алгоритмов (человека или технического устройства). Так, если при описании алгоритма используется понятие множества, то достаточно уметь выполнять некоторый набор операций с множествами и отвечать на некоторые вопросы относительно множеств. Перечень таких операций может быть следующим:
Эти операции можно считать элементарными и до известной поры не думать о способе их реализации исполнителем. В таких случаях говорят, что мы имеем дело с абстрактным типом данных.
Широко используемыми абстрактными типами данных наряду с множествами
являются
В настоящее время большинство алгоритмов проектируется для использования в устройствах, обладающих адресуемой памятью. Каждый элемент информации, размещенный в такой памяти, занимает определенную позицию. По известной позиции элемента в такой памяти доступ к нему осуществляется за некоторую условную единицу времени, зависящую только от типа получаемой информации, фактически — от физического размера ячейки памяти или от количества таких ячеек, предназначенных для ее хранения, но не от ее конкретного содержания. Более того, позиции элементов сами могут быть элементами информации, с которыми могут производиться некоторые операции, что позволяет использовать так называемую косвенную адресацию. Наличие косвенной адресации позволяет поручить программной системе или разрабатываемой прикладной программе поиск свободных участков памяти для размещения новых элементов информации и запоминание их адресов с последующим использованием для доступа к информации.
Информация, размещенная в адресуемой памяти, приобретает новые свойства. Элемент информации характеризуется не только своим содержанием, но и адресом, то есть местом расположения в памяти. Два элемента данных, соседних в содержательном смысле, не обязательно будут располагаться в соседних ячейках памяти. Они могут оказаться в "непредвиденных" местах. Проектируя программную реализацию алгоритма, необходимо проектировать и способ расположения в памяти обрабатываемой информации.
Существуют типы данных, которые естественным образом вкладываются в адресуемую структуру технической памяти, причем легко выполняются все операции, предусмотренные для такого типа данных. Примером может служить вектор фиксированной размерности, задаваемый упорядоченным набором своих компонент. Наиболее естественным является его хранение в виде массива, при котором соседние компоненты располагаются в ячейках с идущими подряд номерами. Этот способ позволяет легко выполнять покомпонентные операции (сложение векторов, вычисление скалярного произведения и другие). Однако если размерность вектора в процессе работы изменяется, например путем удаления компонент или вставки новых, то представление в виде массива оказывается неудобным, так как операции удаления и вставки при условии сохранения порядка следования элементов требуют перезаписи, возможно, достаточно большого числа компонент, что может неблагоприятно сказаться на эффективности алгоритма. Чтобы избежать такой ситуации, одновременно с алгоритмом проектируют структуру представления данных, позволяющую реализовать выполнение всех необходимых операций в приемлемое время.
В практике программирования накоплен большой опыт структурирования информации. К счастью, способы структурирования, изобретенные при решении одной задачи, часто находят применение и во многих других. Например, для представления кортежей и множеств в памяти компьютера могут использоваться такие структуры данных, как линейные и циклические списки.
Во многих задачах исходные данные представляют собой так называемые взвешенные множества. Взвешенным называется множество, каждому элементу которого поставлено в соответствие в качестве веса некоторое число. Часто используемыми операциями с такими множествами являются поиск элемента с минимальным весом, вставка нового элемента со своим весом, удаление элемента и некоторые другие. Для быстрого выполнения таких операций разработаны так называемые кучеобразные структуры данных.
Все функции, используемые ниже для оценки сложности алгоритмов, считаются асимптотически неотрицательными функциями натурального аргумента, то есть неотрицательными, начиная с некоторого значения аргумента $$n$$.
Для асимптотических оценок сверху используется класс функций$${ O (g(n))=\{f(n):\exists c>0, \exists n_{0} \forall n>n_{0} [0\le f(n)\le c\cdot g(n)]\}. }$$
Для асимптотических оценок снизу используется класс функций$${ \Omega (g(n))=\{ f(n):\exists c>0,\exists n_{0} \forall n>n_{0} [0\le c\cdot g(n)\le f(n)]\}. }$$
Для асимптотически точных оценок используется класс функций$${ \Theta (g(n))=\{ f(n):\exists c_{1},c_{2} >0,\exists n_{0} \forall n>n_{0} [0\le c_{1} g(n)\le f(n)\le c_{2} g(n)]\}. }$$
Очевидно, что справедливы следующие соотношения$${ \begin{gathered} \Theta (g(n))= O (g(n))\cap \Omega (g(n)),\\ f(n)\in O (g(n))\Leftrightarrow g(n)\in \Omega (f(n)). \end{gathered} }$$
Далее, предполагается знание стандартных функций, используемых при оценках сложности, таких как полиномы, экспоненты, суперэкспоненты, логарифмы, суперлогарифмы, факториалы, числа Фибоначчи. Предполагается умение сравнивать их по скоростям роста.
Наряду с получением верхних и нижних оценок и оценок в среднем, часто используются так называемые амортизационные оценки.
Амортизационный анализ применяется при оценке времени выполнения корректной последовательности, состоящей из $$n$$ однотипных или разнотипных операций с некоторой структурой данных. Если верхнюю оценку времени выполнения одной операции умножить на $$n$$, получим верхнюю оценку выполнения всех $$n$$ операций. Часто такая оценка бывает сильно завышенной. Иногда длительное время выполнения очередной операции влечет за собой малое время выполнения следующих операций. Более того, такая ситуация может создаваться искусственно, то есть при выполнении очередной операции мы можем готовить почву для более эффективного выполнения следующей. Поэтому возникает задача изучения асимптотического поведения гарантированной оценки для среднего времени выполнения одной операции.
При амортизационном анализе определяется некоторая так называемая учетная (амортизационная) стоимость одной операции, которая может быть как больше, так и меньше реальной стоимости конкретной операции. Но при этом для любой корректной последовательности операций фактическая суммарная длительность всех операций не должна превосходить суммы их учетных стоимостей. Зная учетную стоимость одной операции, верхнюю оценку времени выполнения последовательности из $$n$$ операций можно получить, умножив ее на $$n$$.
Ниже рассмотрим три часто используемых метода амортизационного анализа:
Общая схема метода такова. Пусть над структурой данных предстоит произвести $$n$$ операций, и пусть $$D_i$$ — состояние структуры данных после $$i$$ -й операции ( $$D_0$$ — исходное состояние). Потенциал представляет собой функцию $$\phi$$ из множества возможных состояний структуры данных в множество действительных чисел.
Пусть $$c_i$$ — реальная стоимость $$i$$ -й операции. Учетной стоимостью $$i$$ -й операции объявим число $$C_i$$, определяемое формулой$$\eq*{ C_{i} =c_{i} +\phi (D_{i})-\phi (D_{i-1}) }$$ как сумма реальной стоимости операции плюс приращение потенциала в результате выполнения этой операции. Тогда суммарная учетная стоимость всех операций равна$$\eq*{ \suml_{i=1}^{n}C_{i} =\suml_{i=1}^{n}c_{i} +\phi (D_{n} )-\phi (D_{0}). }$$
Если нам удалось придумать функцию $$\phi$$, для которой$$\eq*{ \phi (D_{n} )\ge \phi (D_{0}), }$$ то суммарная учетная стоимость даст верхнюю оценку для реальной стоимости последовательности из $$n$$ операций. Не ограничивая общности, можно считать, что$$\eq*{ \phi (D_{0} )=0. }$$ Говоря неформально, если разность потенциалов$$\eq*{ \phi (D_{i} )-\phi (D_{i-1}) }$$ положительна, то учетная стоимость $$i$$ -й операции включает в себя резерв (предоплату за будущие операции); если же эта разность отрицательна, то учетная стоимость $$i$$ -й операции меньше реальной и разница покрывается за счет накопленного к этому моменту потенциала.
Учетные стоимости и оценки реальной стоимости, рассчитанные с помощью
Ниже эти три метода будут проиллюстрированы на примере анализа работы
Рассмотрим работу $$k$$ -разрядного двоичного сбрасываемого
счетчика,
реализованного как массив битов $$A[0 \ldots k-1]$$, хранящего двоичную
запись числа $$x$$. Будем считать, что $$A[0]$$ —
младший разряд.
Пусть первоначально $$x = 0$$. Единственной операцией в нашем примере
будет операция
Увеличение счетчика на единицу происходит следующим образом: все начальные
единичные биты в массиве $$A$$, если они есть, становятся нулями,
а следующий непосредственно за ними нулевой бит, если он есть,
устанавливается в единицу. Стоимость операции
Чтобы получить более точную оценку, учтем, что не каждый раз значения
всех $$k$$ битов меняются. В самом деле, младший бит $$A[0]$$ меняется при
каждом исполнении операции
Теперь легко определить учетную стоимость операции
Пусть $$D_0$$ — содержимое счетчика в начальный момент, $$D_i$$ — содержимое счетчика после выполнения $$i$$ -й операции, $$\phi(D_i)$$ — число единиц в записи $$D_i$$, $$t_i$$ — число единиц, превращенных в нули при $$i$$ -й операции. Очевидно, что$$\eq*{ \phi(D_i) \le \phi(D_{i-1}) - t_i +1. }$$
Пусть далее $$c_i$$ — реальная стоимость $$i$$ -й
операции
Если счет начинается с нуля, то
$$\eq*{ \phi (D_{0})=0 }$$и
$$\eq*{ \phi (D_{i} )\ge \phi (D_{0}) }$$для всех $$i$$. Поскольку сумма учетных стоимостей оценивает сверху сумму реальных стоимостей, имеем
$$\eq*{ \suml_{i=1}^{n}c_{i} \le \suml_{i=1}^{n}C_{i} \le 2n, }$$то есть получаем, что суммарная стоимость $$n$$ операций есть $$O(n)$$ с константой (двойкой), не зависящей от $$k$$.
откуда при достаточно больших значениях $$n$$ ( $$n = \Om(k)$$ ) получаем, что реальная стоимость оценивается как $$O(n)$$, причем константа в $$O$$ -записи не зависит ни от $$k$$, ни от начального значения счетчика.
При разработке алгоритма для компьютерного решения той или иной задачи
необходимая информация формализуется в виде набора элементов различных
типов. В каждой системе программирования предусмотрено использование
некоторых
При алгоритмизации задач, решение которых опирается на использование математических знаний и требует математических доказательств, разработка алгоритма часто проводится также в математических или формализованных прикладных терминах. При этом в достаточно большой степени происходит отвлечение от технических возможностей исполнителя алгоритмов (человека или технического устройства). Так, если при описании алгоритма используется понятие множества, то достаточно уметь выполнять некоторый набор операций с множествами и отвечать на некоторые вопросы относительно множеств. Перечень таких операций может быть следующим:
Эти операции можно считать элементарными и до известной поры не думать о способе их реализации исполнителем. В таких случаях говорят, что мы имеем дело с абстрактным типом данных.
Широко используемыми абстрактными типами данных наряду с множествами
являются
В настоящее время большинство алгоритмов проектируется для использования в устройствах, обладающих адресуемой памятью. Каждый элемент информации, размещенный в такой памяти, занимает определенную позицию. По известной позиции элемента в такой памяти доступ к нему осуществляется за некоторую условную единицу времени, зависящую только от типа получаемой информации, фактически — от физического размера ячейки памяти или от количества таких ячеек, предназначенных для ее хранения, но не от ее конкретного содержания. Более того, позиции элементов сами могут быть элементами информации, с которыми могут производиться некоторые операции, что позволяет использовать так называемую косвенную адресацию. Наличие косвенной адресации позволяет поручить программной системе или разрабатываемой прикладной программе поиск свободных участков памяти для размещения новых элементов информации и запоминание их адресов с последующим использованием для доступа к информации.
Информация, размещенная в адресуемой памяти, приобретает новые свойства. Элемент информации характеризуется не только своим содержанием, но и адресом, то есть местом расположения в памяти. Два элемента данных, соседних в содержательном смысле, не обязательно будут располагаться в соседних ячейках памяти. Они могут оказаться в "непредвиденных" местах. Проектируя программную реализацию алгоритма, необходимо проектировать и способ расположения в памяти обрабатываемой информации.
Существуют типы данных, которые естественным образом вкладываются в адресуемую структуру технической памяти, причем легко выполняются все операции, предусмотренные для такого типа данных. Примером может служить вектор фиксированной размерности, задаваемый упорядоченным набором своих компонент. Наиболее естественным является его хранение в виде массива, при котором соседние компоненты располагаются в ячейках с идущими подряд номерами. Этот способ позволяет легко выполнять покомпонентные операции (сложение векторов, вычисление скалярного произведения и другие). Однако если размерность вектора в процессе работы изменяется, например путем удаления компонент или вставки новых, то представление в виде массива оказывается неудобным, так как операции удаления и вставки при условии сохранения порядка следования элементов требуют перезаписи, возможно, достаточно большого числа компонент, что может неблагоприятно сказаться на эффективности алгоритма. Чтобы избежать такой ситуации, одновременно с алгоритмом проектируют структуру представления данных, позволяющую реализовать выполнение всех необходимых операций в приемлемое время.
В практике программирования накоплен большой опыт структурирования информации. К счастью, способы структурирования, изобретенные при решении одной задачи, часто находят применение и во многих других. Например, для представления кортежей и множеств в памяти компьютера могут использоваться такие структуры данных, как линейные и циклические списки.
Во многих задачах исходные данные представляют собой так называемые взвешенные множества. Взвешенным называется множество, каждому элементу которого поставлено в соответствие в качестве веса некоторое число. Часто используемыми операциями с такими множествами являются поиск элемента с минимальным весом, вставка нового элемента со своим весом, удаление элемента и некоторые другие. Для быстрого выполнения таких операций разработаны так называемые кучеобразные структуры данных.
Все функции, используемые ниже для оценки сложности алгоритмов, считаются асимптотически неотрицательными функциями натурального аргумента, то есть неотрицательными, начиная с некоторого значения аргумента $$n$$.
Для асимптотических оценок сверху используется класс функций$${ O (g(n))=\{f(n):\exists c>0, \exists n_{0} \forall n>n_{0} [0\le f(n)\le c\cdot g(n)]\}. }$$
Для асимптотических оценок снизу используется класс функций$${ \Omega (g(n))=\{ f(n):\exists c>0,\exists n_{0} \forall n>n_{0} [0\le c\cdot g(n)\le f(n)]\}. }$$
Для асимптотически точных оценок используется класс функций$${ \Theta (g(n))=\{ f(n):\exists c_{1},c_{2} >0,\exists n_{0} \forall n>n_{0} [0\le c_{1} g(n)\le f(n)\le c_{2} g(n)]\}. }$$
Очевидно, что справедливы следующие соотношения$${ \begin{gathered} \Theta (g(n))= O (g(n))\cap \Omega (g(n)),\\ f(n)\in O (g(n))\Leftrightarrow g(n)\in \Omega (f(n)). \end{gathered} }$$
Далее, предполагается знание стандартных функций, используемых при оценках сложности, таких как полиномы, экспоненты, суперэкспоненты, логарифмы, суперлогарифмы, факториалы, числа Фибоначчи. Предполагается умение сравнивать их по скоростям роста.
Наряду с получением верхних и нижних оценок и оценок в среднем, часто используются так называемые амортизационные оценки.
Амортизационный анализ применяется при оценке времени выполнения корректной последовательности, состоящей из $$n$$ однотипных или разнотипных операций с некоторой структурой данных. Если верхнюю оценку времени выполнения одной операции умножить на $$n$$, получим верхнюю оценку выполнения всех $$n$$ операций. Часто такая оценка бывает сильно завышенной. Иногда длительное время выполнения очередной операции влечет за собой малое время выполнения следующих операций. Более того, такая ситуация может создаваться искусственно, то есть при выполнении очередной операции мы можем готовить почву для более эффективного выполнения следующей. Поэтому возникает задача изучения асимптотического поведения гарантированной оценки для среднего времени выполнения одной операции.
При амортизационном анализе определяется некоторая так называемая учетная (амортизационная) стоимость одной операции, которая может быть как больше, так и меньше реальной стоимости конкретной операции. Но при этом для любой корректной последовательности операций фактическая суммарная длительность всех операций не должна превосходить суммы их учетных стоимостей. Зная учетную стоимость одной операции, верхнюю оценку времени выполнения последовательности из $$n$$ операций можно получить, умножив ее на $$n$$.
Ниже рассмотрим три часто используемых метода амортизационного анализа:
Общая схема метода такова. Пусть над структурой данных предстоит произвести $$n$$ операций, и пусть $$D_i$$ — состояние структуры данных после $$i$$ -й операции ( $$D_0$$ — исходное состояние). Потенциал представляет собой функцию $$\phi$$ из множества возможных состояний структуры данных в множество действительных чисел.
Пусть $$c_i$$ — реальная стоимость $$i$$ -й операции. Учетной стоимостью $$i$$ -й операции объявим число $$C_i$$, определяемое формулой$$\eq*{ C_{i} =c_{i} +\phi (D_{i})-\phi (D_{i-1}) }$$ как сумма реальной стоимости операции плюс приращение потенциала в результате выполнения этой операции. Тогда суммарная учетная стоимость всех операций равна$$\eq*{ \suml_{i=1}^{n}C_{i} =\suml_{i=1}^{n}c_{i} +\phi (D_{n} )-\phi (D_{0}). }$$
Если нам удалось придумать функцию $$\phi$$, для которой$$\eq*{ \phi (D_{n} )\ge \phi (D_{0}), }$$ то суммарная учетная стоимость даст верхнюю оценку для реальной стоимости последовательности из $$n$$ операций. Не ограничивая общности, можно считать, что$$\eq*{ \phi (D_{0} )=0. }$$ Говоря неформально, если разность потенциалов$$\eq*{ \phi (D_{i} )-\phi (D_{i-1}) }$$ положительна, то учетная стоимость $$i$$ -й операции включает в себя резерв (предоплату за будущие операции); если же эта разность отрицательна, то учетная стоимость $$i$$ -й операции меньше реальной и разница покрывается за счет накопленного к этому моменту потенциала.
Учетные стоимости и оценки реальной стоимости, рассчитанные с помощью
Ниже эти три метода будут проиллюстрированы на примере анализа работы
Рассмотрим работу $$k$$ -разрядного двоичного сбрасываемого
счетчика,
реализованного как массив битов $$A[0 \ldots k-1]$$, хранящего двоичную
запись числа $$x$$. Будем считать, что $$A[0]$$ —
младший разряд.
Пусть первоначально $$x = 0$$. Единственной операцией в нашем примере
будет операция
Увеличение счетчика на единицу происходит следующим образом: все начальные
единичные биты в массиве $$A$$, если они есть, становятся нулями,
а следующий непосредственно за ними нулевой бит, если он есть,
устанавливается в единицу. Стоимость операции
Чтобы получить более точную оценку, учтем, что не каждый раз значения
всех $$k$$ битов меняются. В самом деле, младший бит $$A[0]$$ меняется при
каждом исполнении операции
Теперь легко определить учетную стоимость операции
Пусть $$D_0$$ — содержимое счетчика в начальный момент, $$D_i$$ — содержимое счетчика после выполнения $$i$$ -й операции, $$\phi(D_i)$$ — число единиц в записи $$D_i$$, $$t_i$$ — число единиц, превращенных в нули при $$i$$ -й операции. Очевидно, что$$\eq*{ \phi(D_i) \le \phi(D_{i-1}) - t_i +1. }$$
Пусть далее $$c_i$$ — реальная стоимость $$i$$ -й
операции
Если счет начинается с нуля, то
$$\eq*{ \phi (D_{0})=0 }$$и
$$\eq*{ \phi (D_{i} )\ge \phi (D_{0}) }$$для всех $$i$$. Поскольку сумма учетных стоимостей оценивает сверху сумму реальных стоимостей, имеем
$$\eq*{ \suml_{i=1}^{n}c_{i} \le \suml_{i=1}^{n}C_{i} \le 2n, }$$то есть получаем, что суммарная стоимость $$n$$ операций есть $$O(n)$$ с константой (двойкой), не зависящей от $$k$$.
откуда при достаточно больших значениях $$n$$ ( $$n = \Om(k)$$ ) получаем, что реальная стоимость оценивается как $$O(n)$$, причем константа в $$O$$ -записи не зависит ни от $$k$$, ни от начального значения счетчика.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.