Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

как сделать из слона муху

ФЛЕНОВ МИХАИЛ AKA HORRIFIC

Спецвыпуск: Хакер, номер #071, стр. 071-048-5


2 НА ПОИСК ЛЮБЫХ ДАННЫХ ЗАТРАЧИВАЕТСЯ ПРИМЕРНО ОДИНАКОВОЕ ВРЕМЯ.

3 ДЛЯ ЭФФЕКТИВНОЙ РАБОТЫ ВПОЛНЕ ДОСТАТОЧНО СТОЛЬКО ПАМЯТИ, СКОЛЬКО ЗАНИМАЕТ ОДИН ИНДЕКСНЫЙ БЛОК. ВСЕ БЛОКИ ДЕРЖАТЬ В ОПЕРАТИВКЕ НЕТ СМЫСЛА, НО ЕСЛИ ЕСТЬ ЛИШНЯЯ ПАМЯТЬ, ТО МОЖНО КЭШИРОВАТЬ БЛОКИ.

Недостаток один, но очень серьезный – поддерживать такой индекс не так уж и просто.

Вот так при минимуме затрат можно быстро искать и обрабатывать большие объемы информации. В данном случае мы затронули разновидность лиственных под называнием B-Tree (Balanced Tree или сбалансированные деревья). Бывают и другие разновидности, но это уже совершенно другая история.

[кластер или нет.]

Существует две разновидности деревьев – кластерные и некластерные. В первом случае на кончиках веток индексного дерева находятся сами данные. Это значит, что, прогулявшись по всем блокам, мы находим непосредственно искомые данные. Получается, что в данном случае данные упорядочены с помощью такого индекса физически. Конечно же, на один список (таблицу) можно создать только один кластерный индекс, потому что упорядочить физически по двум разным параметрам один и тот же набор данных просто нереально.

В некластерном дереве на кончиках веток находятся только ссылки на данные, а сами данные могут находиться где угодно на диске и в любом порядке. Таких индексов можно создавать сколько угодно.

[итого.]

Это только основные алгоритмы экономии памяти, плюс мы немного затронули оптимизацию. Дальнейшая оптимизация скорости и ресурсов требует хорошего знания математики. Если у тебя нет проблем с этой наукой, то за новыми алгоритмами можешь обратиться к трудам Кнута.

Пример динамического массива

type

PMassivItem = ^TMassivItem;

TMassivItem = record

nextItem:PMassivItem; //следующий элемент массива

prevItem:PMassivItem; //предыдущий элемент массива

Name:String; // пример данных, которые нужно хранить

// еще здесь могут быть поля элемента массива

end;

TMassiv = class

public

FirstItem:PMassivItem; // первый элемент списка

LastItem:PMassivItem; // последний элемент списка

itemsNumber:Integer; // количество элементов

constructor Create(str:String); // конструктор

procedure AddItem(str:String); // добавление элемента

procedure DeleteItem(index:Integer); // удаление

end;

procedure TMassiv.AddItem(str:String);

var

newItem:PMassivItem;

begin

newItem:= new(PMassivItem);

newItem.Name:=str;

newItem.nextItem:=nil;

newItem.prevItem:=LastItem;

LastItem.nextItem:=newItem;

LastItem:=newItem;

Inc(itemsNumber);

end;

constructor TMassiv.Create(str:String);

begin

itemsNumber:=1;

FirstItem:=new(PMassivItem);

FirstItem.Name:=str;

FirstItem.nextItem:=nil;

FirstItem.prevItem:=nil;

LastItem:=FirstItem;

end;

procedure TMassiv.DeleteItem(index: Integer);

var

i:Integer;

currentItem:PMassivItem;

begin

// поиск удаляемого элемента

currentItem:=FirstItem;

for i:=0 to index-1 do

currentItem:=currentItem.nextItem;

// наводим новые связи и освобождаем память

if currentItem.prevItem<>nil then

Назад на стр. 071-048-4  Содержание  Вперед на стр. 071-048-6