Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Универсальная библиотека контейнеров https://zx.oberon.org/forum/viewtopic.php?f=17&t=82 |
Страница 1 из 1 |
Автор: | sage [ 28 фев 2013, 14:22 ] |
Заголовок сообщения: | Универсальная библиотека контейнеров |
Идея создания такой библиотеки появилась в процессе портирования кода с С++, который изобилует использованием STL шаблонов. Библиотека в какой-то мере имитирует шаблоны С++, во всяком случае, способ работы с контейнерами, а декларация контейнеров не намного сложнее чем в С++. Моя статья: http://sage.com.ua/ru.shtml?e1l5 Потом я внёс некоторые новшества и улучшения в свою библиотеку контейнеров. List переименовал в Vector, поскольку, если рассуждать логически, это именно вектор на базе динамического массива. Настоящий List ещё необходимо будет реализовать на базе двухсвязного списка. Реализовал Dictionary на базе хеш-таблицы. Хеш-таблица простейшая на базе динамического массива с простым механизмом разрешения коллизий и возможностью роста. Все возможные размеры таблицы заранее заданы табличкой простых чисел. При росте хеш-таблицы, позиции элементов пересчитываются с новым модулем, при этом хеш-коды элементов берутся из кэша, так-как операция взятия хеш-кода может быть достаточно медленной. На базе Dictionary можно строить контейнеры типа Set и типа Map. В контейнере Set как-правило хранятся только ключи, и они-же являются и данными. В контейнере Map хранятся пары ключ:значение. Реализовал двоичную кучу BinaryHeap. Конейнер под любой тип данных описывается очень быстро, в библиотеке в качестве примера реализованы: вектор целых (LongintVector), вектор векторов целых (LongintVectorVector), вектор строк (StringVector), множество целых (LongintSet), множество множеств целых (LongintSetSet), куча целых (LongintHeap). Dictionary получился достаточно быстрым. Добавление в LongintSetSet 100000 множеств LongintSet, содержащих в свою очередь до 21 случайного целого, с предварительной проверкой на вхождение в множество выполняется чуть менее чем за секунду. Для сравнения, заполнение LongintSet 100000 случайных целых с предварительной проверкой занимает порядка 70 мс. Без предварительной проверки будет просто останов по ASSERTу, поскольку Dictionary предполагает хранение лишь уникальных ключей. http://svn.assembla.com/svn/oberonru/tr ... ainers.Mod Код: "OBERON"
|
Автор: | sage [ 30 май 2016, 21:08 ] | ||
Заголовок сообщения: | Re: Универсальная библиотека контейнеров | ||
Тем временем, удалось таки для AO написать полностью всеядный базовый объект Vector для реализации на базе него всевозможных контейнеров. Причём, любые данные достаточно обернуть в статическую запись. Т.е. не требуется никаких дополнительных указателей. Единственный указатель во всём контейнере - динамический массив. Удалось это не без помощи импорта модуля SYSTEM. Но для базового объекта это, пожалуй, простительно. Бенчмарк RegExp показал, что с новыми контейнерами он работает почти в 2 раза быстрее чем с использованием старого Containers.Mod
|
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |