- •Структуры данных: ограничения
- •Motivation
- •Dictionaries
- •Таблицы поиска
- •Таблицы поиска
- •Простой объект
- •Таблицы прямой адресации
- •Student
- •Таблицы прямой адресации
- •Таблицы прямой адресации
- •Direct Addressing
- •Если ключей меньше, чем элементов массива, то в качестве хэш-функции можно использовать деление
- •Хэширование–это преобразование входного массива данных определенного типа и произвольной длины в выходную битовую
- •Хэширование полезно, когда широкий диапазон возможных значений должен быть сохранен в
- •Hash-функции
- •Hash Functions
- •Хеширование данных
- •Hash-таблицы
- •Hash-таблицы
- •Хеширование применяется для сравнения данных:
- •Hash-функции
- •С точки зрения практического применения, хорошей является такая хэш-функция,
- •Хеширование данных
- •Hash Functions
- •Оценка качества хеш-функции
- •Hash Tables
- •Хеширование данных
- •Обработка коллизий
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Open Addressing (Linear Probing)
- •Подходы к апробированию
- •Linear Probing
- •Линейное апробование
- •Разрешение коллизий: линейное опробование
- •Поиск, Linear Probing
- •Квадратичное апробование
- •Разрешение коллизий: квадратичное опробование
- •Двойное хэширование
- •Разрешение коллизий: двойное хеширование
- •Обработка Коллизий
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Метод цепочек
- •Chaining
- •Обработка коллизий
- •При любом методе разрешения коллизий необходимо ограничить длину поиска элемента!!!!!!!!.
- •//функция создания хеш-таблицы: //метод деления по модулю (самый
- •Метод функции середины квадрата
- •Преимущества и недостатки хеш-таблиц
Структуры данных: ограничения
Vectors, Linked Lists, Stack, Queues, Deques
Не предоставляют механизмов быстрой вставки/удаления и поиска в тоже время
Бинарные деревья поиска, Кучи
Обеспечивают стабильно быстрые операции, но должны иметь внутреннее упорядочение
Как можно повысить производительность операций вставки/удаления и поиска?
Что делать, если мы не заботились о упорядочение элементов ранее?
Motivation
•Массивы предоставляют путь для доступа к множеству
•Иногда нам надо строить связи между двумя множествами , или набором ключей и связанных данных.
•В идеале мы бы хотели получать доступ к данным непосредственно через ключи
Dictionaries
•Какой лучший способ это реализовать?
–Linked Lists?
–Double Linked Lists?
–Queues?
–Stacks?
–Multiple indexed arrays (e.g., data[key[i]])?
•To answer this, ask what the complexity of the operations are:
–Insertion
–Deletion
–Search
Таблицы поиска
Если необходимо быстродействие по таким операциям как
Быстрое добавление/удаление поиск – мы создаем табличную структуру для оптимизации быстрого поиска
Каждое значение в таблице имеет уникальный ключ
Ключ используется как краткий идентификатор для поиск необходимого значения в таблице
Example
Ваш номер зачетки используется для поиска записи о вас (напр., имя, адрес, и т.п..)
Таблицы поиска
Какие типы операций нам нужны в таких таблицах?
Search(key)
Проверка, есть ли в таблице значение связанное с указанным ключом
Insert(key,value)
Добавление нового значения связанного с ключом в таблицу
Remove(key)
Удаление из таблицы значения, связанного с ключом
Простой объект
Будем хранить список студентов. Поиск будем выполнять по ID
Предположим, что ID это неповторяющееся число
struct Student { string name;
double gpa;//средний бал }; int id;
Таблицы прямой адресации
Если мы можем гарантировать, что ID студента всегда будет находиться в диапазоне
0 to N (т.е. 0 to 4999), мы можем сохранить их в массиве: Student data[4999];
Когда мы хотим извлечь запись по конкретному студенту, мы знаем Student N находится в ячейке с индексом N:
int id = 3285; Student s = data[id];
Student
IDs
0
2
4
Таблицы прямой адресации
Data |
|
Objects |
||
0 |
|
Student |
||
1 |
0 |
3.2 |
John Doe |
|
|
|
|
||
2 |
2 |
2.6 |
Jane Doe |
|
3 |
||||
|
|
|
||
4 |
|
|
Some Guy |
|
5 |
4 |
3.7 |
||
|
ID |
GPA |
Name |
|
4999 |
|
|
|
Таблицы прямой адресации
Прямая адресация
Связывает ключи непосредственно с индексами в массиве
Не используемые индексы в массиве должны быть помечены
В общем случае помечают как NULL Операции выполняются быстро
Таблицы прямой адресации
Требования к прямой адресации Ограничения для ключей
Ключи должны входить в единый диапазон Ключи должны быть числовыми
Размер массива
Если есть N возможных ключей, тогда массив data[] должен быть размера N
Наш массив может получиться ОГРОМНЫМ
Что делать, если мы используем только небольшое количество ключе
Очень много места в массиве тратится впустую
Как мы можем обойти эти ограничения?