Основы объектно-ориентированного программирования
Более подробные комментарии к ссылочной реализации односвязного списка и других контейнеров можно найти в третьей главе учебного пособия [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) — свойство объектов, посредством которого экземпляры класса получают доступ к данным и методам классов-предков без их повторного определения.