
- •Министерство образования и науки Российской Федерации
- •Цель лекции
- •План лекции
- •1 Происхождение вычислительных машин
- •2 Изучение алгоритмов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Биты и их хранение
- •2 Оперативная память
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Устройства внешней памяти
- •3 Хранение и поиск файлов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление числовых значений
- •2 Хранение целых чисел
- •3 Хранение дробей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление текста
- •2 Представление изображений
- •Достоинства пиксельной графики
- •Недостатки пиксельной графики
- •Достоинства векторной графики
- •Недостатки векторной графики
- •3 Представление звука
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Сжатие изображений
- •2 Ошибки передачи данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Архитектура эвм
- •2 Связь процессора с другими устройствами
- •3 Другие архитектуры
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Машинный язык
- •2 Пример машинного языка
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Выполнение программы
- •2 Пример выполнения программы
- •3 Программы и данные
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Логические операции
- •2 Операции сдвига
- •3 Арифметические операции
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция операционных систем
- •2 Архитектура операционных систем
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие процесса
- •2 Управление процессами
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Классификация сетей
- •2 Сетевые протоколы*
- •3 Безопасность сетей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие алгоритма
- •2 Представление алгоритма
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Теория решения задач
- •2 Общие методы решения задач
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритм последовательного поиска
- •2 Управление циклами
- •3 Алгоритм сортировки методом вставки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритмы поиска и сортировки
- •2 Управление рекурсией
- •3 Разработка рекурсивных процедур
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эффективность алгоритмов
- •2 Верификация программ
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция и классификация языков программирования
- •2 Концепции традиционного программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Процедурные единицы
- •2 Реализация языка программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Объектно-ориентированное программирование
- •2 Декларативное программирование
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структуры данных
- •Integer Scores (2.9).
- •2 Статические и динамические структуры
- •3 Указатели
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Массивы
- •2 Списки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структура и функции стека
- •2 Реализация стека
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Очереди
- •2 Деревья
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Пользовательские типы данных
- •Int Age;
- •2 Классы
- •Int *StackEntries;
- •3 Стандартная библиотека шаблонов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Роль операционной системы
- •2 Последовательные файлы
- •3 Вопросы программирования
- •0000000010000110
- •001100010011001100110100
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения индексации
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения хеширования
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Общие вопросы
- •2 Система управления базой данных
- •3 Поддержка целостности баз данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Модели баз данных
- •2 Реляционная модель баз данных
- •3 Объектно-ориентированные базы данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Интеллект и машины
- •2 Распознавание образов
- •3 Мышление
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Искусственные нейронные сети
- •2 Генетические алгоритмы
- •Контрольные вопросы
- •Невычислимые функции Цель лекции
- •План лекции
- •1 Основы машины Тьюринга
- •2 Невычислимая функция
- •3 Сложность задач
- •Листинг 1. Процедура MergeLists для объединения двух упорядоченных списков
- •Листинг 2. Алгоритм сортировки слиянием, реализованный в процедуре MergeSort
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Шифрование с открытым ключом
- •2 Модульная арифметика
- •Контрольные вопросы
- •Литература
- •Internet-ресурсы
2 Вопросы программирования
Завершим очередной раздел обзором возможностей, которые предлагают языки высокого уровня для управления структурами хранения рассмотренного типа. Для реализации хеширования в различных языках можно найти множество функций. Начнем с обсуждения программной среды Java.
Популярность хеширования как способа организации больших структур хранения в оперативной памяти отражается тем фактом, что в среде программирования Java существует предопределенный класс (тип) с названием Hashtable, при помощи которого можно конструировать таблицы. Точнее, оператор
Table = new HashtableCCapacity, Factor);
создаст объект типа Hashtable и назначит этот объект переменной Table. Переменная Capacity указывает количество сегментов, а переменная Factor определяет предел фактора нагрузки. Каждый сегмент таблицы на самом деле является связным списком, в котором содержатся записи, определенные хеш-функцией в этот сегмент. В результате хеш-таблица, созданная таким образом, не будет испытывать переполнения — сегменты просто будут постоянно расти. Но фактор нагрузки — это отношение непустых сегментов к общему количеству сегментов. Когда определенный предел фактора будет достигнут, Java автоматически увеличит количество сегментов и переделает всю таблицу.
Новые записи можно записывать в таблицу при помощи метода put (аргументы которого содержат ключевое значение и данные), а получать записи из таблицы можно методом get (в качестве аргумента передается ключевое значение). Обратите внимание, что такая структура освобождает Java-программиста от реализации и поддержки таблицы, то есть хеш-таблицу можно использовать как абстрактный инструмент.
Предположим, однако, что мы хотим создать хеш-файл на запоминающем устройстве, а не хеш-таблицу в оперативной памяти. В зависимости от языка программирования доступны различные подходы. Один из них заключается в создании нескольких последовательных файлов, каждый из которых играет роль отдельного сегмента. В этом случае с точки зрения операционной системы хеш-файл будет состоять из набора отдельных файлов. Могут возникнуть проблемы, так как операционная система часто ограничивает количество файлов, которые приложению разрешается одновременно открыть. Обойти эту сложность можно, разработав программу таким образом, чтобы она открывала и закрывала файлы при необходимости обратиться к различным сегментам.
Более практичный подход — зарезервировать большую область на запоминающем устройстве, объявив ее одним большим пустым файлом. Затем части этого файла можно использовать как сегменты нашей системы. Этот подход поддерживается в нескольких языках программирования. Например, язык COBOL позволяет программистам создавать большие пустые файлы, к которым можно обращаться как к массивам, то есть местоположения данных в файле могут быть указаны индексами. Тогда программист сможет создать такой файл и разбить на сегменты хеш-файла (рис. 8.13). К примеру, места с 1 по 20 можно считать первым сегментом, с 21 по 40 — вторым и т. д. Таким образом, по необходимости к содержимому отдельных сегментов можно обращаться напрямую.
Рисунок 4 – Большой файл, разбитый на сегменты для реализации хеширования
Схожую систему можно реализовать на языке С, используя для доступа к разным частям файла функции fgetpos и fsetpos, с которыми мы познакомились в предыдущем разделе.
Еще один подход к созданию хеш-файла использует преимущества большого объема оперативной памяти, доступного в современных компьютерах. Он заключается в считывании всего файла в оперативную память при первом открытии и обращении к нему как к большой хеш-таблице. В таких случаях в действительности данные хранятся в последовательном файле, из которого во время выполнения программы создается хеш-таблица.
Этот подход реализован в языке Java. В среде программирования Java есть вариация класса Hashtable под названием Properties. Объект типа Properties является хеш-таблицей, которую можно инициализировать из файла на запоминающем устройстве при помощи метода 1 oad и записать на устройство методом store. Но не следует думать, что объект типа Properties хранится на запоминающем устройстве как хеш-файл. Это последовательный файл, состоящий из последовательности битов, из которой соответствующая хеш-таблица конструируется в оперативной памяти.