Создание эффективной реализации сортированного списка с использованием generics
Состав работы
|
|
|
|
Работа представляет собой zip архив с файлами (распаковать онлайн), которые открываются в программах:
- Microsoft Word
Описание
Так случилось, что я стал программистом 1С. Все прекрасно в этой среде, за исключением скорости. Эту проблему можно решить только одним способом: прямым доступом к файлам и обработкой результатов на компилируемом языке в памяти.
Так, для группирования данных нужны алгоритмы поиска и вставки. И мое сознание, отягощенное бухгалтерским учетом, не нашло ничего лучшего, чем использовать аналог TList (SortedList), представляющий собой динамический массив со свойствами «емкость» и «количество элементов».
Упорядоченность в этом массиве поддерживается с помощью компараторов, а при поиске используется алгоритм половинного деления с поиском нужной позиции i по ключу с условием (Items[i]>=Key) AND (Items[i-1]<Key). Если такого ключа нет, то все данные с позиции i переносятся на одну позицию в большую сторону. При этом используются процессорные команды MOVSW и MOVSB, которые выполняются очень быстро. При полном заполнении массива его размер увеличивается либо за счет свободных адресов, следующих за конечным адресом в массиве, либо с помощью выделения нового массива большей емкости с копированием данных из оригинала.
Но время шло, и объем группировок вышел за 10000 записей. Мой AMD K6 200 (мощный по тем временам компьютер) начал работать слишком меленно. И не удивительно – количество сдвигаемых элементов в среднем стало равно N2/4, то есть 108.
И вот как-то, после очередного обучения бухгалтеров бухгалтерии, пришла мысль. Зачем держать один большой массив, если можно его разбить на множество маленьких? Сказано – сделано. В течение двух минут я создал двухуровневый массив. Первый (верхний) уровень – это массив, элементами которого являются ссылки на массивы нижнего уровня. Второй из уровней (нижний) по сути, состоит из простых динамических массивов. Под простыми понимается то, что память под них выделяется заранее и впоследствии не перезанимается. Фактически этот массив представляет собой структуру, хранящую счетчик элементов и массив пар «ключ-значение». В дальнейшем я буду называть эти динамические массивы листовыми страницами (LeafPage).
Так, для группирования данных нужны алгоритмы поиска и вставки. И мое сознание, отягощенное бухгалтерским учетом, не нашло ничего лучшего, чем использовать аналог TList (SortedList), представляющий собой динамический массив со свойствами «емкость» и «количество элементов».
Упорядоченность в этом массиве поддерживается с помощью компараторов, а при поиске используется алгоритм половинного деления с поиском нужной позиции i по ключу с условием (Items[i]>=Key) AND (Items[i-1]<Key). Если такого ключа нет, то все данные с позиции i переносятся на одну позицию в большую сторону. При этом используются процессорные команды MOVSW и MOVSB, которые выполняются очень быстро. При полном заполнении массива его размер увеличивается либо за счет свободных адресов, следующих за конечным адресом в массиве, либо с помощью выделения нового массива большей емкости с копированием данных из оригинала.
Но время шло, и объем группировок вышел за 10000 записей. Мой AMD K6 200 (мощный по тем временам компьютер) начал работать слишком меленно. И не удивительно – количество сдвигаемых элементов в среднем стало равно N2/4, то есть 108.
И вот как-то, после очередного обучения бухгалтеров бухгалтерии, пришла мысль. Зачем держать один большой массив, если можно его разбить на множество маленьких? Сказано – сделано. В течение двух минут я создал двухуровневый массив. Первый (верхний) уровень – это массив, элементами которого являются ссылки на массивы нижнего уровня. Второй из уровней (нижний) по сути, состоит из простых динамических массивов. Под простыми понимается то, что память под них выделяется заранее и впоследствии не перезанимается. Фактически этот массив представляет собой структуру, хранящую счетчик элементов и массив пар «ключ-значение». В дальнейшем я буду называть эти динамические массивы листовыми страницами (LeafPage).
Другие работы
Корпус ТНВД двигателя ЯМЗ-236 (ремонтный чертеж)
kurs9
: 30 сентября 2021
Прочный ТНВД ЯМЗ 236 располагается в развале блока цилиндров силового агрегата. На конце рейки имеется втулка с винтом.
Плунжерные пары монтируются в корпусе установки ТНВД ЯМЗ 236.
Внутри также находятся штуцеры и нагнетательные клапаны. Детали соединяются с трубопроводом.
Тип ТНВД двигателя ЯМЗ 236 - многосекционный. Насос оснащен шестеренчатым приводом.
390 руб.
Лабораторная работа №2. Создать массив структур и выполнить задание согласно своему варианту.
ty4ka
: 23 сентября 2020
Вариант 2
Дана информация о пяти школах.
Структура имеет вид: номер школы, год, количество выпускников, число поступивших в ВУЗы.
Вывести данные об общем количестве выпускников и доле поступивших в ВУЗ.
100 руб.
Ноогенетические аспекты современного глобально-цивилизационного процесса
Lokard
: 16 ноября 2013
ВВЕДЕНИЕ
1. ПРИНЦИПЫ НООГЕНЕЗИСА В КОНТЕКСТЕ УЧЕНИЯ В. ВЕРНАДСКОГО
1.1 Ноогенетические характеристики глобального процесса
1.2 Сконструированная реальность
1.3 Планетарное общество как критериальный признак ноосферы
1.4 Нооцивилизационная альтернатива
1.5 Нооэкономические определения
1.6 Коррекции методологии
ВЫВОД
ИСТОЧНИКИ
ВВЕДЕНИЕ
В работе обоснованы ноогенетические аспекты современного глобально-цивилизационного процесса, планетарного общества, что утверждает свои ценности, затронут вопрос
10 руб.
КУРСОВАЯ РАБОТА по дисциплине «Структуры и алгоритмы обработки данных. Часть 2. Древовидные структуры данных)». Вариант №13.
ДО Сибгути
: 27 ноября 2017
Постановка задачи
1. Хранящуюся в файле базу данных (файл определяется вариантом) загрузить в оперативную память компьютера и построить дерево поиска заданного типа, упорядочивающее данные сначала по первому полю, затем по второму и т.д.
2. Провести поиск по ключу в построенном дереве поиска. Ключ поиска для любого варианта – 3 символа русского алфавита. Провести несколько поисков в дереве с различными ключами для проверки работоспособности программы, одним из ключей пои
450 руб.