[devel] contents_index trie

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Сб Ноя 1 23:45:41 MSK 2008


On Sat, Nov 01, 2008 at 09:07:50PM +0300, Alexey Tourbin wrote:
> On Sat, Nov 01, 2008 at 09:01:36PM +0300, Alexey Tourbin wrote:
> > On Sat, Nov 01, 2008 at 06:42:07PM +0300, Денис Смирнов wrote:
> > > On Tue, Oct 28, 2008 at 10:50:13AM +0300, Алексей Турбин wrote:
> > > 
> > > Правильно ли я понимаю что речь идет о задаче создания чего-то вроде cdb,
> > > с некоторыми уточнениями:
> > > - нет key/data, есть только key
> > > - поддерживается единственная операция "проверить на существование данный
> > >   key"
> > > - нужно обеспечить минимальное количество pagefaults при выполнении этой
> > >   операции
> > > 
> > > Я правильно понял?
> > 
> > Нет, имееется в виду trie.  Это дерево.  С каждым ключом ассоциировано
> > значение _и_ последующие вложенные ключи.  Так что идёт доступ по
> > составному ключу, типа ["usr","bin","perl"]->"perl-base".  То есть
> > значение ключа "накапливается", а дополнительный переход на каждом этапе
> > выполняется рекурсивно (хвостовая рекурсия с "остатком" составного ключа).
> > http://en.wikipedia.org/wiki/Trie
> 
> Это похоже на фаловую систему, только в файловой системе ключ не может
> быть одновременно и файлом, и каталогом.

То есть это префиксное дерево в общем виде.
Вот другой пример (словарь):

["ч","а","й"] -> <напиток>
["ч","а","й","к","а"] -> <птица>

Организация памяти в префиксном дереве должна быть такой, чтобы при
очередном переходе по составному ключу, т.е. "ч"->"а", "а"->"й" и т.д.
выполнялось условие локальности ссылок: ключи и значения в памяти
должны быть размещены (сгруппированы) "близко" друг к другу, то есть
чтобы при проходе по составному ключу вглубь дерева затрагивалось
минимальное число сегментов памяти.

В файловой системе так и происходит: каталог тоже имеет inode, и данные
каталога (dirent.h) локльно "сгруппированы" в "файле" каталога.  Так что
переход из каталога в подкаталог затрагивает минимальное количество
дисковых страниц.  А если бы информация о содержимом каталога была
произвольно разбросана по диску (как указатели на строки при
использовании malloc), тогда для напр. readdir(2) потребовалось бы
читать с диска в буферный кеш большое количество лишних страниц.

Короче, оптимальное размещение в памяти префиксного дерева --
по сложности это задача где-то на уровне реализации файловой системы.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20081101/4911aeb3/attachment-0001.bin>


Подробная информация о списке рассылки Devel