Создание эффективной реализации сортированного списка с использованием 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).
Другие работы
Контрольные работы по гидростатике и гидродинамике ИжГТУ 2014 Контрольная работа 1 Задача 6 Вариант 18
Z24
: 22 ноября 2025
Определить силы, действующие на верхние Fв и нижние Fн болты крышки, которая имеет форму прямоугольника высотой а и шириной b. Показание ртутного вакуумметра hрт, высота h.
150 руб.
Доходы региональных бюджетов. Налог на имущество организаций
evelin
: 25 октября 2013
План:
Введение
1. Доходы бюджетов субъектов Российской Федерации
2. Неналоговые доходы бюджетов субъектов Российской Федерации
3. Налог на имущество организаций
Заключение
Список использованной литературы
Введение
К доходам бюджетов относятся налоговые доходы, неналоговые доходы и безвозмездные поступления.
К налоговым доходам бюджетов относятся доходы от предусмотренных законодательством Российской Федерации о налогах и сборах федеральных налогов и сборов, в том числе от налогов, предусмотренн
5 руб.
Лабораторные работы по дисциплине: "Основы визуального программирования" (№№ 1-5).
freelancer
: 17 августа 2016
Лабораторная работа №1
Тема: Работа с компонентами TPanel (закладка Standard); TDriveComboBox, TFilterComboBox, TDirectoryListBox, TFileListBox (закладка Win 3.1); Tsplitter, TImage (закладка Additional); TStatusBar (закладка Win32).
ЗАДАНИЕ 1: Создать форму как показано на рисунке 1.
ЗАДАНИЕ 2: Изменить Form1 на рис. 1 (задание 1) следующим образом: использовать для реализации строки состояния вместо компонента TPanel компонент TStatusBar. Структура компонента TStatusBar показана на рис. 2.
ЗАД
80 руб.
Лабораторные работы №№1-3 по дисциплине: Теория электрических цепей. Вариант №01
IT-STUDHELP
: 30 декабря 2021
Лабораторная работа No 1
«Исследование реактивных двухполюсников»
Вариант 1
Цель работы
Исследование зависимости входного сопротивления реактивного двухполюсника от частоты.
Теоретическое исследование
Исследовать работу схемы реактивного двухполюсника, реализованного по 1-й форме Фостера (рисунок 1, а). Задать E = 1 В, R0 = 10 кОм, L1 = L2 = 1 мГн, C1 = 63,536 нФ, С2 = 15,831 нФ, С = (100+N×5) нФ, где N — номер варианта (последняя цифра пароля).
N=1;
C=100+N∙5=100+1∙5=105 нФ
Лабораторная
900 руб.