Скачиваний:
24
Добавлен:
09.09.2020
Размер:
1.81 Mб
Скачать

Структуры данных: ограничения

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

Наш массив может получиться ОГРОМНЫМ

Что делать, если мы используем только небольшое количество ключе

Очень много места в массиве тратится впустую

Как мы можем обойти эти ограничения?

Соседние файлы в папке лекции