Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
134661.rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
11.01 Mб
Скачать

2. Минимизация булевых функций

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

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

При небольшом числе переменных для минимизации булевых функций применяют диаграммы или карты Карно-Вейча. Карта Карно-Вейча – прямоугольник, разбитый на квадраты, число которых равно общему числу наборов для данной функции. На рисунке 2.1 показана карта Карно-Вейча для четырех переменных. Квадраты против черты с буквой соответствуют восьми наборам, на которых данная переменная равна 1. В квадратах также могут быть проставлены номера наборов[15].

Рисунок 2.1 – Карта Карно-Вейча для четырех переменных

Правила минимизации:

Соседними являются ячейки по горизонтали и по вертикали. Соседние ячейки с "1" значениями объединяются в группы. Группа может состоять только из 2i ячеек. Каждая группа "1" записывается как произведение аргументов с неизменными значениями на всех ячейках группы. Число групп должно быть минимальным, а их размер максимально возможным. Ячейка может входить в состав нескольких групп.

Покажем на примере применение карт Карно. Функция задана номерами единичных наборов, представленных в выражении (9): F(A, B, C, D) = ∑ (0, 3, 4, 5, 7, 8, 10, 11, 14, 15). (9)

Нанесем эту функцию на карту Карно. На карте Карно при нанесении на нее функции F, заполненными нулями остаются ячейки, относящиеся к наборам, на которых функция равна 0.

Произведя минимизацию, получим функцию (10) F = AC + CD +   +  C. (10)

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

Рисунок 2.2 – Функция карт Карно Для оценки алгоритмов существует много критериев

Чаще всего нас будет интересовать порядок роста необходимых для решения задачи времени и емкости памяти при увеличении входных данных. Нам хотелось бы связать с каждой конкретной задачей некоторое число, называемое ее размером, которое выражало бы меру количества входных данных. Например, размером задачи умножения матриц может быть наибольший размер матриц – сомножителей[11].

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

Именно асимптотическая сложность алгоритма определяет в итоге размер задач, которые можно решить этим алгоритмом. Если алгоритм обрабатывает входы размера n за время c*n2, где c - некоторая постоянная, то говорят, что временная сложность этого алгоритма есть O(n2) (читается "порядка n – квадрат").

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

Допустим, у нас есть пять алгоритмов A1,A2,…,A5 со следующими временными сложностями:

Таблица 2.1 – Алгоритмы

Алгоритм

Временная сложность

A1

n

A2

n*log(n)

A3

n2

A4

n3

A5

2n

Здесь временная сложность – это число единиц времени, требуемого для обработки входа размера n. Пусть единицей времени будет одна миллисекунда (1сек=1000 миллисекунд). Тогда алгоритм A1 может обработать за одну секунду вход размера 1000, в то время как A5 – вход размера не более 9. В следующей таблице 2.1 приведены размеры задач, которые можно решить за одну секунду, одну минуту и один час каждым из этих пяти алгоритмов.

Таблица 2.2 – Размеры задач, решаемые за 1 секунду

Алгоритм

Временная сложность

Максимальный размер задачи

1 сек

1 мин

1 час

A1

n

1000

6*104

3,6*106

A2

n*log(n)

140

4893

2*104

A3

n2

31

244

1897

A4

n3

10

39

153

A5

2n

9

15

21

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

Таблица 2.3 – Размеры задач, решаемые с большей скоростью

Алгоритм

Временная сложность

Максимальный размер задачи

до ускорения

после ускорения

A1

n

S1

10 S1

A2

n*log(n)

S2

Примерно 10 S2 для больших S2

A3

n2

S3

3,165 S3

A4

n3

S4

2,155 S4

A5

2n

S5

S5+3,3

Вместо эффекта увеличения скорости рассмотрим теперь эффект применения более действенного алгоритма. Если в качестве основы для сравнения взять 1 мин, то, заменяя алгоритм A4 алгоритмом A3, можно решить задачу, в 6 раз большую, а заменяя A4 на A2, можно решить задачу, большую в 125 раз. Эти результаты производят гораздо большее впечатление, чем двукратное улучшение, достигаемое за счет десятикратного увеличения скорости. Если в качестве основы для сравнения взять 1 ч, то различие оказывается еще значительнее. Отсюда мы заключаем, что асимптотическая сложность алгоритма служит важной мерой качественности алгоритма, причем такой мерой, которая обещает стать еще важнее при последующем увеличении скорости вычислений.

Несмотря на то что основное внимание здесь уделяется порядку роста величин, надо понимать, что большой порядок роста сложности алгоритма может иметь меньшую мультипликативную постоянную (постоянная c в определении О(f(x))), чем малый порядок роста сложности другого алгоритма. В таком случае алгоритм с быстро растущей сложностью может оказаться предпочтительнее для задач с малым размером – возможно, даже для всех задач, которые нас интересуют. Например, предположим, что временные сложности алгоритмов A1, A2, A3, A4, A5 в действительности равны соответственно 1000n, 100n*log(n), 10n2, n3 и 2n. Тогда A5 будет наилучшим для задач размера 2≤n≤9, A2 – для задач размера 10≤n≤58, A1 - при 59≤n≤1024, а A1 – при n>1024[7].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]