Основы объектно-ориентированного программирования
Более подробные комментарии к ссылочной реализации односвязного списка и других контейнеров можно найти в третьей главе учебного пособия [9].
Ссылочные реализации могут быть применены и для множества, однако
для него существует еще одна чрезвычайно изящная реализация,
называемая битовой. Она применима, если в множестве могут
содержаться
только числа в диапазоне от
до
включительно. В
этом случае,
используя битовый массив
, можно полностью описать
текущее состояние
множества следующим образом:
.
Поиск элемента в такой реализации сводится к проверке значения соответствующего элемента массива, а добавление или удаление — к присваиванию единицы или нуля.
Битовая реализация множества может быть использована не всегда, однако существует базирующийся на ней универсальный подход к решению задачи эффективной реализации множества, называемый хешированием.
Определение 10.11.
Любая целочисленная функция
называется хеш-функцией ( to hash означает разрезать, разделять ).
Основная идея хеширования заключается в том, что исходное множество
представляется в виде объединения
непересекающихся множеств:
, где
множества
для
определяются
равенствами
.
После этого вся работа со множеством сводится к работе с
одним из его
подмножеств
. В самом деле,
для поиска элемента
в множестве достаточно найти
и поискать
этот элемент в подмножестве
. Добавление и удаление
элемента
совершенно аналогично приводят к работе с подмножеством
(см. рис. 10.9).
Хеширование сводит задачу реализации большого множества к реализации многих небольших. При этом не специфицируется, как именно будут реализованы эти небольшие подмножества. Иногда для них разумно построить одну из непрерывных реализаций, а иногда целесообразно применить повторное хеширование — все определяется конкретной задачей.
Весьма важный вопрос — вопрос качества используемой хеш-функции.
Легко понять, что самой плохой является постоянная функция, а хорошая
функция должна максимально равномерно распределять элементы по подмножествам.
На практике, работая со словами, часто применяют функции, подобные следующей: , где
,
и т.д. — символы слова и одновременно их
десятичные коды
(предполагается ASCII-кодировка, а не UNICODE).
Словарик ООП
В этой секции приведены определения многих понятий, активно используемых в объектно-ориентированном программировании.
Абстрагирование (abstraction) — метод решения задачи, при котором объекты разного рода объединяются общим понятием (концепцией), а затем сгруппированные сущности рассматриваются как элементы единой категории.
Абстракция (abstraction) — существенные характеристики объекта, которые отличают его от всех других видов объектов и четко определяют особенности данного объекта с точки зрения дальнейшего рассмотрения и анализа.
Абстрактный класс (abstract class) — класс, который не может быть использован для создания экземпляров, а служит исключительно для порождения других классов.
Абстрактный метод (abstract method) — метод, который не может быть вызван без предварительного доопределения.
Автоматическая переменная (automatic variable) — переменная, для которой память выделяется автоматически при входе в процедуру (функцию, метод или блок); противопоставляется динамической переменной, память для которой отводится явной командой пользователя.
Автоматическое управление памятью (automatic storage management) — алгоритм распределения памяти, при котором исполнительная система нижнего уровня отвечает за нахождение и повторное использование недоступных (а следовательно, ненужных) блоков памяти; синоним: сборка мусора.
Базовый класс (base class) — класс, из которого порождается другой класс; синонимы: класс-предок, надкласс, родительский класс.
Динамическая переменная (dynamic variable) — переменная, для которой память выделяется явной командой пользователя; противопоставляется автоматической переменной, память для которой отводится автоматически при входе в процедуру (функцию, метод или блок).
Дочерний класс (child class) — класс, определяемый как расширение другого класса, называемого родительским; синонимы: подкласс, производный класс.
Закрытый метод (private method) — метод, который не предназначен для вызова извне объекта; получатель сообщения, которое приводит к вызову такого метода, должен быть обязательно экземпляром того же класса, которому принадлежит отправитель сообщения.
Иерархия классов (class hierarchy) — иерархия, образуемая классами в соответствии с их взаимосвязью "класс — подкласс".
Инкапсуляция (encapsulation) — техника, при которой информация прячется внутри структуры.
Интерфейс (interface) — внешние особенности класса или объекта, придающие ему абстрактную форму и одновременно скрывающие его внутреннее устройство и поведение.
Класс (class) — множество объектов, связанных общностью структуры и поведения; абстрактное описание данных и поведения для совокупности похожих объектов, представители которой называются экземплярами класса.
Конструктор (constructor) — метод, используемый для создания нового объекта; обеспечивает решение двух задач: выделяет память под новую переменную и гарантирует, что переменная инициализируется надлежащим образом.
Контейнерные классы (container classes) — классы, которые используются как структуры данных, содержащие набор элементов.
Метод (method) — процедура или функция, связанная с классом, вызываемая в стиле пересылки сообщений.
Множественное наследование (multiple inheritance) — свойство языка, которое позволяет подклассу наследовать свойства сразу от нескольких надклассов.
Надкласс (superclass) — синоним терминов класс-предок, базовый класс.
Наследование (inheritance) — свойство объектов, посредством которого экземпляры класса получают доступ к данным и методам классов-предков без их повторного определения.