Тема занятия: структуры данных и поиск
? тема по Linux
?? необязательная тема
- массив -- прямой доступ: быстро, но требует памяти (если неплотный набор ключей)
- список -- ассоциативный доступ: разумно по памяти, медленный поиск
хеш-таблицы, в Питоне функция hash(), реализация словарей
- Полиномиальное хеширование
- H=(a0*p**0+a1*p**1+...+an*p**n)%2**16, где p -- простое число, например, 31337, а a0..an -- числа из хэшируемой последовательности (в случае строки символов -- коды символов)
- Дерево бинарного поиска [значение, поддерево-меньше, поддерево-больше]
- оптимальное дерево: размер(поддерево-меньше)~=размер(поддерево-больше)
- заполнение дерева с перебалансировкой
- виды деревьев: AVL, красно-черное, декартово
дерево поиска в общем виде [значение,поддерево-<K1,поддерево-K1<k2,...,поддерево-kn-1<соответственkn,поддерево->kn)] -- несколько ключей. Соответственный показатель степени и основание логарифма для количества узлов и уровней.
Домашнее задание
? теоретическое задание
? новая тема
Почитать про индексные массивы, списки и вообще ассоциативные массивы, хэширование, двоичные деревья поиска и более ветвистые B-деревья, AVL-, красно-черные и декартовы деревья.
Тестирование ассоциативных структур данных. Сгенерировать текстовый файл с таблицей вида [уникальное случайное число, случайная строка без пробелов] на N = 10**5 элементов. Использовать эти данные (как набор пар "ключ-значение") в качестве входных для программы, которая тестирует производительность следующих структур данных:
- линейный список
- хешированная таблица
- двоичное дерева (заполняемого с балансировкой и без балансировки)
- стандартный словарь (dict)
Тестирует она каждую из них следующим образом. Для каждого из указанных ниже шагов измеряется общее (на весь шаг) и среднее (на каждый элемент) время выполнения операции со структурой (например, с помощью функции times() из модуля os). Шаги тестирования:
- Загрузить все данные в изначально пустую структуру.
- Составить случайную выборку из M = 1000 значений ключей, которые заведомо встречаются в структуре (эту подоперацию можно не измерять). Сделать поиск этих элементов, проверив, что они действительно в ней встречаются.
Составить случайную выборку из M значений ключей, которые заведомо не встречаются в структуре (эту подоперацию можно не измерять). Сделать поиск этих элементов, проверив, что они действительно в ней не встречаются.