- •Оглавление
- •Структуры данных и алгоритмы
- •Понятие структур данных и алгоритмов
- •Информация и ее представление в памяти
- •Природа информации
- •Хранение информации
- •Системы счисления
- •Непозиционные системы счисления
- •Позиционные системы счисления
- •Изображение чисел в позиционной системе счисления
- •Перевод чисел из одной системы счисления в другую
- •Классификация структур данных
- •Операции над структурами данных
- •Структурность данных и технология программирования
- •Простые структуры данных
- •Числовые типы
- •Целые типы
- •Вещественные типы
- •Десятичные типы
- •Операции над числовыми типами
- •Битовые типы
- •Логический тип
- •Символьный тип
- •Перечислимый тип
- •Интервальный тип
- •Указатели
- •Физическая структура указателя
- •Рис 2.8. Вычисление полного адреса в микропроцессоре i8086.
- •Представление указателей в языках программирования
- •Операции над указателями.
- •Основные структуры данных
- •Массивы
- •Множества
- •Динамические структуры данных
- •Линейные списки
- •Циклические списки
- •Мультисписки
- •Представление стека и очередей в виде списков
- •Очереди
- •Задачи поиска в структурах данных
- •Линейный поиск
- •Поиск делением пополам (двоичный поиск)
- •Поиск в таблице
- •Прямой поиск строки
- •Алгоритм Кнута, Мориса и Пратта
- •Алгоритм Боуера и Мура
- •Методы ускорения доступа к данным
- •Хеширование данных
- •Методы разрешения коллизий
- •Переполнение таблицы и рехеширование
- •Оценка качества хеш-функции
- •Организация данных для ускорения поиска по вторичным ключам
- •Инвертированные индексы
- •Битовые карты
- •Представление графов и деревьев
- •Бинарные деревья
- •Представление бинарных деревьев
- •Прохождение бинарных деревьев
- •Алгоритмы на деревьях
- •Сортировка с прохождением бинарного дерева
- •Сортировка методом турнира с выбыванием
- •Применение бинарных деревьев для сжатия информации
- •Представление выражений с помощью деревьев
- •Представление сильноветвящихся деревьев
- •Применение сильноветвящихся деревьев
- •Представление графов
- •Алгоритмы на графах
Системы счисления
Чтобы обеспечить соответствующую основу для изучения структур данных следует обсудить существующие типы систем счислений: позиционные и непозиционные.
Непозиционные системы счисления
Числа используются для символического представления количества объектов. Очень простым методом представления количества является использование одинаковых значков. В такой системе между значками и пересчитываемыми объектами устанавливается взаимно однозначное соответствие. Например, шесть объектов могут быть представлены как ****** или 111111. Такая система становится очень неудобной, если попытаться с ее помощью представить большие количества.
Системы счисления, подобные римской, обеспечивают частичное решение проблемы представления большого количества объектов. В римской системе дополнительные символы служат для представления групп значков. Например, можно принять что I=*, Y=IIIII, X=YY, L=XXXXX и т.д. Заданная величина представляется с помощью комбинирования символов в соответствии с рядом правил, которые в некоторой степени зависят от положения символа в числе. Недостатком системы, которая с самого начала основывается на группировании некоторого множества символов с целью формирования нового символа, является то обстоятельство, что для представления очень больших количеств требуется очень много уникальных символов.
Позиционные системы счисления
В позиционной системе счисления используется конечное число R уникальных символов. Величину R часто называют основанием системы счисления. В позиционной системе количество представляется как самими символами, так и их позицией в записи числа.
Система счисления с основанием десять, или десятичная система является позиционной. Рассмотрим, например, число 1303. Его можно представить в виде:
1*10^3 + 3*10^2 + 0*10^1 + 3*10^0.
(Здесь и далее символ ^ используется как знак операции возведения в степень).
В позиционной системе могут быть представлены и дробные числа. Например, одна четвертая записывается в виде 0.25, что интерпретируется как:
2*10^(-1) + 5*10^(-2).
Другой пример позиционной системы счисления - двоичная система. Двоичное число 11001.101 представляет то же самое количество, что и десятичное число 26.625. Разложение данного двоичного числа в соответствии с его позиционным представлением следующее:
1*2^4 + 1*2^3 + 0*2^1 + 1*2^0 + 1*2^(-1) + 0*2^(-2) + 1*2^(-3) =
16 + 8 + 1 + 0.5 + 0.125=26.625.
Наиболее часто встречаются системы счисления имеющие основание 2,8,10 и 16, которые обычно называют двоичной, восьмеричной, десятичной и шестнадцатеричной системами, соответственно. Вся вычислительная техника работает в двоичной системе счисления, так как базовые элементы вычислительной техники имеют два устойчивых состояния. Восьмеричная и шестнадцатеричная системы используются для удобства работы с большими двоичными числами.
Изображение чисел в позиционной системе счисления
Изображение чисел в любой позиционной системе счисления с натуральным основанием R (R >1) базируется на представлении их в виде произведения целочисленной степени m основания R на полином от этого основания :
n
Ar = R^m * СУММА (a[i]*R^(-i)) , (1.1)
i=1
где:
a[i] { 0,1,..., R-1 } - цифры R-ичной системы счисления ;
n - количество разрядов (разрядность), используемых для представления числа;
R - основание системы счисления;
m {..., -2, -1, 0,+1,+2,...} - порядок числа;
R^(-i) - позиционный вес i - того разряда числа.
Так, в десятичной (R=10) системе для представления чисел используются цифры a = {0,1,...9}; в двоичной (R=2) - a = {0,1}, в шестнадцатеричной (R=16), a = {0,1....9,A,B,C,D,E,F} где прописные латинские буквы A..F эквивалентны соответственно числам 10..15 в десятичной системе. Например,
1) 815=10^3*(8*10^(-1)+1*10^(-2)+5*10(-3))=8*10^2+1*10^1+5*10^0;
2) 8.15=10^1*(8*10^(-1)+1*10^(-2)+5*10^(-3))=8*10^0+1*10^(-1)+5*10^(-2);
3) 0.0815= 10^(-1)*(8*10^(-1)+1*10^(-2)+5*10^(-3))=
=8*10^(-2)+1*10^(-3)+5*10^(-4);