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

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

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

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

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

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

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

Представление чисел

Хороший пример - представление чисел, которые сами суть абстракции свойств некоторых объектов. 

Если единственное (или основное) действие, которое нужно выполнять, - сложение, то хорошим представлением числа n может быть n черточек. Правило сложения при таком представлении - очевидное и очень простое. Римская нотация основана на этом принципе простоты, и правила сложения просты для маленьких чисел. 

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

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

Задача представления положения объекта

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

Второе решение может привести к представлению с плавающей точкой, где каждое вещественное число x состоит из пары целых, обозначающих дробную часть f и показатель e по некоторому основанию (например, x = f × 2e).

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

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

Комментарии

Популярные сообщения из этого блога

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

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

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

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

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

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