Билет 19 - stankin/design-1 GitHub Wiki

Билет 19. Махмудов Б.Н.

Вопрос 1. Понятие вычислительной сложности алгоритма. Связанные показатели качества программных средств

Алгоритм – конечное упорядоченное множество точно определенных правил для решения конкретной задачи.

Вычислительная сложность — понятие в информатике и теории алгоритмов, обозначающее функцию зависимости объёма работы, которая выполняется некоторым алгоритмом, от размера входных данных. Раздел, изучающий вычислительную сложность, называется теорией сложности вычислений. Объём работы обычно измеряется абстрактными понятиями времени и пространства, называемыми вычислительными ресурсами. Время определяется количеством элементарных шагов, необходимых для решения задачи, тогда как пространство определяется объёмом памяти или места на носителе данных. Таким образом, в этой области предпринимается попытка ответить на центральный вопрос разработки алгоритмов: «как изменится время исполнения и объём занятой памяти в зависимости от размера входа?».

Временная и пространственная сложности

Временная сложность алгоритма (в худшем случае) — это функция от размера входных данных, равная максимальному количеству элементарных операций, проделываемых алгоритмом для решения экземпляра задачи указанного размера. Аналогично понятию временной сложности в худшем случае определяется понятие временная сложность алгоритма в наилучшем случае. Также рассматривают понятие среднее время работы алгоритма, то есть математическое ожидание времени работы алгоритма. Иногда говорят просто: «Временная сложность алгоритма» или «Время работы алгоритма», имея в виду временную сложность алгоритма в худшем, наилучшем или среднем случае (в зависимости от контекста).

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

Асимптотическая сложность

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

  • «почистить ковёр пылесосом» требует время, линейно зависящее от его площади Θ(A), то есть на ковёр, площадь которого больше в два раза, уйдет в два раза больше времени. Соответственно, при увеличении площади ковра в сто тысяч раз объём работы увеличивается строго пропорционально в сто тысяч раз, и т. п.
  • «найти имя в телефонной книге» требует всего лишь времени, логарифмически зависящего от количества записей Ο(log2), так как, открыв книгу примерно в середине, мы уменьшаем размер «оставшейся проблемы» вдвое (за счет сортировки имен по алфавиту). Таким образом, в книге объёмом в 1000 страниц любое имя находится не больше, чем за log2 1000 = 10 раз (открываний книги). При увеличении объёма страниц до ста тысяч проблема все ещё решается за log2⁡ 100000 = 17 заходов.

Вопрос 2. Понятие обратного проектирования (реинжиниринга). Назначение и варианты использования

Основные понятия даны в стандарте ГОСТ Р 57306-2016 Инжинириг. Терминология и основные понятия в области инжиниринга

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

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

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

Обратная разработка (обратное проектирование, обратный инжиниринг, реверс-инжиниринг) – исследование некоторого готового устройства или программы, а также документации на него с целью понять принцип его работы; например, чтобы обнаружить недокументированные возможности (в том числе программные закладки), сделать изменение или воспроизвести устройство, программу или иной объект с аналогичными функциями, но без прямого копирования.

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

Примеры обратного проектирования программного обеспечения:

  • Анализ обмена данными, наиболее распространённый в обратной разработке протоколов обмена данными, который производится с помощью анализатора шины и пакетного сниффера для прослушивания шины компьютера и компьютерной сети соответственно.
  • Дизассемблирование машинного кода программы для получения её листинга на языке ассемблера. Этот способ работает на любой компьютерной программе, но требует достаточно много времени, особенно для неспециалиста.
  • Декомпиляция машинного или байт-кода программы для создания исходного кода на некотором языке программирования высокого уровня.
⚠️ **GitHub.com Fallback** ⚠️