Скачиваний:
91
Добавлен:
01.05.2014
Размер:
3.82 Mб
Скачать

Original pages: 651-675 351

Предположим сначала, что имеется 1000000 записей и каждая из них содержит 10 вторичных ключей, причем каждый вторичный ключ может принимать довольно много различных значений. Запись со вторичными ключами (K1, K2, : : : , K10) можно отобразить в 20-битовое число

h(K1)h(K2): : : h(K10);

(6)

где h—хеш-функция, преобразующая вторичный ключ в 2-битовое число, а (6) образовано последовательным выписыванием этих десяти пар битов. При такой схеме 1000000 записей отображаются в множество из 220 = 1048576 значений; все отображение можно рассматривать как хеш-функцию с M = 220. Для разрешения коллизий воспользуемся методом цепочек. Если мы хотим выбрать все записи, имеющие определенные значения пяти вторичных ключей, нам придется просмотреть лишь

210 списков [соответствующих пяти неспецифицированным парам в (6)], т. е. в среднем нужно прове- p

рить около 1000 = N записей. [Аналогичный подход предложил Арисава, J. Inf. Proc. Soc. Japan, 12 (1971), 163–167.]

Райвест развил эту идею дальше, так что во многих случаях мы имеем следующую ситуацию. Предположим, существует N 2n записей и каждая из них содержит m вторичных ключей. Записи отображаются в n-битовые хеш-адреса таким образом, что запрос, не специфицирующий значения k ключей, затрагивает примерно Nk=m адресов. Все остальные обсуждавшиеся в этом параграфе методы (кроме метода Густафсона) требуют для выборки информации порядка N шагов (правда, коэффициент пропорциональности невелик); при достаточно большом N метод Райвеста окажется более быстрым, к тому же он не требует инвертирования файлов.

Но, прежде чем применить такой подход, нужно определить подходящее отображение. Рассмотрим пример с небольшими значениями параметров, когда m = 4 и n = 3, а все вторичные ключи могут принимать лишь два значения; отобразим 4-битовые записи в восемь адресов следующим образом:

0

0

0

! 1

0

1

0

! 5

 

 

1

1

1

!

2

1

0

 

1

!

6

(7)

0

0

1

! 3

0

0

1

! 7

 

1

1

0

!

4

1

1

0

!

8

 

Исследование этой таблицы показывает, что все записи, соответствующие запросу 0 , отображаются в пять адресов 1, 2, 3, 5 и 7; и вообще любой базовый запрос с тремя звездочками затрагивает ровно пять адресов. Базовый запрос с двумя звездочками затрагивает три адреса, и, наконец, базовый запрос с одной звездочкой затрагивает либо один, либо два, а в среднем (8 1+24 2)=32 = 1:75 адреса. Таким образом, имеем

Количество

 

 

 

 

неспецифицированных

Количество затрагиваемых

 

битов в запросе

 

адресов

 

4

8

= 84=4

(8)

 

 

 

3=4

3

5

82=4

 

2

3

8

1=4

 

1

1:75

08=4

 

0

1

= 8

 

 

Разумеется, это лишь маленький пример; таблицы подобного размера проще обрабатывать без всяких ухищрений. Но он полезен и для нетривиальных приложений, когда m = 4r и n = 3r, ведь 4r-битовые записи можно отобразить в 23r N адресов, разделив вторичные ключи на r групп по четыре бита в каждой и применив (7) к каждой группе. Получающееся отображение обладает требуемым свойством: запрос, оставляющий k из m битов неспецифицированными, затронет примерно

Nk=m адресов. (См. упр. 6.)

Некоторые другие отображения, найденные Райвестом, приводятся в упр. 7; их можно использовать вместе с (7) для получения функций комбинаторного хеширования в случае 1 m=n 2. На самом деле можно было бы использовать блоки размера b и положить N 2nb; мы взяли b = 1 для простоты изложения.

*Сбалансированные файловые системы. Другой комбинаторный подход к задаче выборки информации, основанный на ”системах сбалансированных неполных групп”, явился предметом многочисленных исследований. Хотя он очень интересен с математической точки зрения, своей практической ценности этот метод, к сожалению, еще не проявил. Чтобы дать читателю возможность почувствовать изящество результатов, мы все же изложим здесь краткое введение в теорию, не теряя надежды, что кто-нибудь найдет ей практическое применение.

352 Original pages: 651-675

Штейнеровской системой троек называется такое распределение v объектов в неупорядоченные тройки, когда каждая пара объектов встречается ровно в одной тройке. Например, если v = 7, имеется, по существу, одна штейнеровская система троек, а именно

Тройка Содержащиеся в ней пары

f1; 2; 4 g f1; 2 g;

f1; 4 g;

f2; 4 g

f2; 3; 5 g f2; 3 g;

f2; 5 g;

f3; 6 g

f3; 4; 6 g f3; 4 g;

f3; 6 g;

f4; 6 g

f4; 5; 0 g f0; 4 g;

f0; 5 g;

f4; 5 g

f5; 6; 1 g f1; 5 g;

f1; 6 g;

f5; 6 g

f6; 0; 2 g f0; 2 g;

f0; 6 g;

f2; 6 g

f0; 1; 3 g f0; 1 g;

f0; 3 g;

f1; 8 g

Поскольку существует 12v(v−1)пар объектов, а в тройке—три пары, общее число троек равно 16v(v−1); поскольку каждый объект может составлять пару ровно с v − 1 другими объектами, он должен присутствовать ровно в 12(v−1) тройках. Из этих соображений следует, что система Штейнера существует лишь тогда, когда числа 16v(v − 1) и 12(v − 1) целые. Значит, v должно быть нечетным и при делении на 3 не давать в остатке 2, т. е.

v mod 6 = 1 или 3:

(10)

Обратно, в 1847 г. Киркман доказал, что, если v 1и выполнено условие (10), штейнеровская система троек действительно существует. Его интересная конструкция приведена в упр. 10.

Штейнеровские системы троек можно использовать для уменьшения избыточности в комбинированных инвертированных файлах. Рассмотрим вновь файл рецептов печений (табл. 1) и преобразуем правый столбец в 31-й атрибут, который равен 1, если требуется специальный ингредиент, и 0 в противном случае. Предположим, мы хотим отвечать на все включающие запросы о парах атрибутов, например на запрос ”В каких рецептах используются и кокосовые орехи, и изюм?” Можно было

бы построить инвертированный список для каждого из

 

31

= 465 возможных запросов. Однако эти

 

 

 

2

 

 

 

17

 

 

печенье с перцем будет содержаться в

 

 

списки займут много места, поскольку, например,

 

 

 

 

 

 

2

= 136

из них, а запись, обладающая всеми атрибутами, войдет в каждый список!

Использование системы

 

 

 

 

троек Штейнера несколько улучшает ситуацию. Для 31 объекта существует система Штейнера из 155 троек, причем каждая пара объектов входит ровно в одну тройку. Каждой тройке fa; b; c g можно сопоставить четыре списка: один список—для записей, обладающих атрибутами a, b, c (т. е. не c);

другой—для , , ; третий—для , , ; четвертый—для , , . Такая конструкция гарантирует, что a b c a b c a b c

никакая запись не попадет более чем в 155 инвертированных списков, и экономит пространство, если запись имеет три атрибута, соответствующих тройке системы.

Система троек является частным случаем систем групп, состоящих из трех или более объектов. Например, 31 объект можно так распределить по неупорядоченным шестеркам, что каждая пара объектов попадет ровно в одну шестерку:

f1;5;17;22;23;25g

f7;11;23;28;29;0g

f13;17;26;3;4;6g

f20;24;5;10;11;13g

f26;30;11;16;17;19g

f2;6;18;23;24;26g

f8;12;24;29;30;1g f14;18;30;4;5;7g

f21;25;6;11;12;14g

f27;0;12;17;18;20g

f3;7;19;24;25;27g

f9;13;25;30;0;2g

f15;19;0;5;6;8g

f22;26;7;12;13;15g

f28;1;13;18;19;21g

f4;8;20;25;26;28g

f10;14;26;0;1;3g

f16;20;1;6;7;9g

f23;27;8;13;14;16g

f29;2;14;19;20;22g

f5;9;21;26;27;29g

f11;15;27;1;2;4g

f17;21;2;7;8;10g

f24;28;9;14;15;17g

f30;3;15;20;21;23g

f6;10;22;27;28;30g f12;16;28;2;3;5g

f18;22;3;8;9;11g

f25;29;10;15;16;18g f0;4;16;21;22;24g

 

 

f19;23;4;9;10;12g

 

 

[Эта система получается из первой группы путем сложения по модулю 31. Для проверки того, что она обладает требуемым свойством, заметим, что 30 значений (ai − aj) mod 31, i 6= j, различны, если (a1; a2; : : : ; a6) = (1; 5; 17; 22; 23; 25). Чтобы найти шестерку, содержащую данную пару (x; y), выберем i

и j так, что ai−aj x−y (mod 31); если k = (x−ai) mod 31, то (ai +k) mod 31 = x и (aj +k) mod 31 = y.] Систему (11) можно использовать для хранения инвертированных списков, причем ни одна запись не появится более 31 раза. Каждой шестерке fa; b; c; d; e; f g сопоставлено 57 списков, предназначенных для записей, имеющих два или более атрибута a, b, c, d, e или f, т. е. имеющих атрибуты

, , , ; ответом на любой включающий запрос по двум атрибу-

(a; b; c; d; e; f) (a; b; c; d; e; f) : : : (a; b; c; d; e; f)

там является объединение без пересечений 16 подходящих списков подходящей шестерки. Печенье с перцем войдет в 29 из 31 группы этой системы, поскольку названное блюдо имеет два из шести атрибутов во всех шестерках, кроме f19; 23; 4; 9; 10; 12 g и f13; 17; 29; 3; 4; 6 g (если мы занумеруем столбцы числами от 0 до 30).

Original pages: 651-675 353

Аналогичная идея применима для уменьшения избыточности в составных инвертированных списках, когда мы хотим отвечать на базовые, а не на включающие запросы. Предположим, например, что записи содержат пять вторичных ключей K1, K2, K3, K4, K5, каждый из которых может принимать одно из четырех значений 0, 1, 2 или 3. Чтобы ответить на запрос о записях, для которых Ki = a и Kj = b при данных a, b и i 6= j, мы могли бы образовать инвертированные списки для всех 160 подобных запросов; в таком случае каждая запись присутствовала бы в десяти инвертированных списках. Альтернативой является использование следующей системы упорядоченных пятерок, основанной на комбинаторной схеме, которая называется ”взаимно ортогональные латинские квадраты”:

(0; 0; 0; 0; 0)

(1; 0; 1; 2; 3)

(2; 0; 2; 3; 1)

(3; 0; 3; 1; 2)

(0; 1; 1; 1; 1)

(1; 1; 0; 3; 2)

(2; 1; 3; 2; 0)

(3; 1; 2; 0; 3)

(0; 2; 2; 2; 2)

(1; 2; 3; 0; 1)

(2; 2; 0; 1; 3)

(3; 2; 1; 3; 0)

(0; 3; 3; 3; 3)

(1; 3; 2; 1; 0)

(2; 3; 1; 0; 2)

(3; 3; 0; 2; 1)

Если мы теперь посмотрим на любые две из пяти компонент, то увидим, что все 16 возможных упорядоченных пар значений встречаются в этих позициях ровно один раз. Группе (a, b, c, d, e) этой системы можно сопоставить записи, удовлетворяющие по крайней мере двум из условий K1 = a, K2 = b, : : : , K5 = e. Таким образом, каждой из 16 групп будут сопоставлены 376 из 1024 возможных записей, поэтому средняя избыточность уменьшилась с 0 до 16 376=1024 = 578.

Теория систем таких групп и латинских квадратов детально разработана в ”книге Marshall Hall, Jr., Combinatorial Theory (Waltham; Mass.: Blaisdell, 1967). Несмотря на всю красоту этого круга идей, в задачах выборки информации их удалось использовать лишь для уменьшения избыточности при построении составных инвертированных списков; Дэвид Чжоу [Information and Control, 15 (1969), 377–396] заметил, что того же результата можно достичь и без комбинаторных систем.

Краткая история и библиография. Первая опубликованная статья о методах выборки по вторичным ключам написана Л. Джонсоном [CACM, 4 (1961), 218–222]. Многосписочную систему примерно в одно и то же время независимо разработали Ной Прайвз, X. Грэй, У. Ландауэр, Д. Лефкович и С. Литвин; ср. с [IEEE Trans. on Communication and Electronics, 68 (1963), 488–492]. Другая довольно ранняя публикация, оказавшая влияние на последующие работы, принадлежит Д. Р. Дэвису и

Э.Д. Лину [CACM, 8 (1965), 243–246].

Вобширной литературе, появившейся с тех пор по этому вопросу, основное внимание уделялось взаимодействию с пользователями и языкам программирования, но этих тем мы в нашей книге не касаемся. В дополнение к уже перечисленным статьям можно порекомендовать следующие опубликованные работы, оказавшие автору наибольшую помощь при написании этого параграфа: Jack Minker, Jerome Sable, Ann. Rev. of Information Science and Technology, 2 (1967), 123–160; Robert E. Bleier, Proc. ACM Nat. Conf., 22 (1967), 41–49; Jerome A. Feldman, Paul D. Rovner, CACM, 12 (1969), 439–449; Burton H. Bloom, Proc. ACM Nat. Conf., 24 (1969), 83–95; H. S. Heaps, L. H. Thiel, Information Storage and Retrieval, 6 (1970), 137–153; Vincent Y. Lum, Huei Ling, Proc. ACM Nat. Conf., 26 (1971), 349–356. Хороший обзор ручных карточек сделан в гл. 5 книги Бурна Methods of Information Handling (New York: Wiley, 1963). ”Сбалансированные файловые системы” впервые разработали Абрахам, С. Гхош и Д. Рой-Чоудхури в 1965 г.; пожалуй, лучшее резюме этой работы и последующего развития метода дали Р. Бозе и Гэри Коч [SIAM, J. Appl. Math., 17 (1969), 1203–1214].

Внастоящем параграфе мы обсудили довольно много интересных идей, полезных в очень разных ситуациях. Поскольку многие из этих методов появились незадолго до написания данного параграфа, то новые успехи, вероятно, не заставят себя ждать.

Интересно отметить, что человеческий мозг выполняет выборку по вторичным ключам гораздо лучше, чем ЭВМ; в самом деле, мы довольно легко распознаем лица или мелодии и т. п. по отрывочной информации, в то время как машины, пожалуй, вообще не в состоянии сделать это. И нет ничего невозможного в том, что однажды будет открыт принципиально новый подход к конструированию машин, который раз и навсегда решит задачу выборки по вторичным ключам, сделав тем самым весь этот параграф ненужным.

 

 

 

 

 

 

Упражнения

 

 

 

 

 

 

 

 

 

>1. [М27] Пусть 0

k 21n. Докажите, что следующее построение дает

 

nk

перестановок чи-

сел f1

;

2

; : : : ; n

g, таких, что каждое

t

-элементное подмножество

множества

f1

;

2

; : : :; n

g

при

 

 

 

 

 

 

 

 

 

t k или t n − k встречается по крайней мере один раз в качестве первых t элементов перестановки. Рассмотрим путь на плоскости из точки (0; 0) в (n; r), где r n − 2k, в котором i-й шаг

i

− 1

; j

) в (

i; j

+ 1)

или в (

i; j

− 1); последняя

возможность имеется лишь

производится из точки (

 

 

 

 

n

таких путей.

для j 1, поэтому путь никогда не опускается ниже оси x. Существует ровно

k

m
k

354 Original pages: 651-675

Перестановка, соответствующая подобному пути, строится с использованием трех первоначально пустых списков следующим образом: если i-й шаг делается вверх, i = 1, 2, : : : , n, то число i помещается в список B; если же вниз, то i помещается в список A, а максимальный на данный момент элемент списка B изымается из него и переносится в список C. Затем нужно выписать друг за другом элементы списков A, B (в возрастающем порядке) и C (также в возрастающем порядке). Построение перестановки завершено.

Например, при n = 4 и k = 2 получается шесть путей и соответствующих им перестановок

Picture:

Рис. стр. 673

(Вертикальные линии разделяют списки A, B и C. Эти шесть перестановок соответствуют составным атрибутам в (2).)

[Указание. Представьте каждое t-элементное подмножество S с помощью пути из (0; 0)в (n; n−2t), i-й шаг которого выполняется из (i − 1; j) в (i; j + 1), если i 2= S, и в (i; j − 1), если i 2 S. Преобразуйте каждый такой путь в путь описанного выше вида.]

2.[М25] (Сакти Гхош.) Найдите минимально возможную длину l списка r1 r2 : : : rl ссылок на записи, обладающего тем свойством, что все ответы на любой из включающих запросов 1, 1 , 1 , 11, 1 1, 11 , 111 по трем ключам с двумя возможными значениями окажутся в последовательных элементах ri : : :rj.

3.[19] Рассмотрим табл. 2. Какие включающие запросы вызовут ложное выпадение: (a) старинного сахарного печенья; (b) овсяных палочек с финиками?

4.[M30] Найдите точные формулы для вероятностей (5), предполагая, что каждая запись имеет

n k-битовых кодов в n-битовом поле, и что

k

запрос включает q различных, а в остальном случайных атрибутов. (Не пугайтесь, если формулы не будут упрощаться!)

5. [40] Поэкспериментируйте с различными способами уменьшения избыточности в текстах, если для поиска подцепочек используется метод Харрисона.

>6. [М20] Общее число m-битовых запросов с k специфицированными битами равно s = 2k. Если комбинаторная хеш-функция, подобная (7), преобразует эти запросы в адреса l1, l2, : : : , ls соответственно, то L(k) = (l1 + l2 + + ls)=s дает среднее число адресов, приходящихся на запрос. [Например, в (7) имеем L(3) = 1:75.]

Рассмотрим теперь составную хеш-функцию над (m1 + m2)-битовым полем, образованную отображением первых m1 битов с помощью одной хеш-функции, а оставшихся m2 битов—с помощью другой. Пусть L1(k) и L2(k)—соответствующие средние количества адресов, приходящихся на запрос. Найдите формулу, выражающую L(k) (среднее для составной функции) через L1 и L2.

7.[M24] (Р. Райвест.) Найдите значения функции L(k), определенной в предыдущем упражнении, для следующих функций комбинаторного хеширования:

(a) m = 3, n = 2

(a) m = 4, n = 2

0

0

! 1

0

0

! 1

1

0

! 2

1 0 ! 2

1

1

! 3

1 1

1 ! 3

1

0

1

! 4

1

0

1

! 3

0

1

0

! 4

1

0

1 ! 4

 

 

 

 

1

0

0

! 4

8.[М47] Придумайте новые полезные классы функций комбинаторного хеширования, аналогичные (7).

9.[М20] Докажите, что при v = 3n множество всех троек вида

f(a1 : : : ak−10b1 : : : bn−k)3; (a1 : : :ak−11c1 : : :cn−k)3; (a1 : : :ak−12d1 : : : dn−k)3 g; 1 k n;

образует штейнеровскую систему троек. Предполагается, что ai, bi, ci и di равны 0, 1 или 2 и bi + ci + di 0 (mod 3).

10.[М32] (Томас Киркман [Cambridge and Dublin Math Journal, 2 (1847), 191–204].) Назовем си-

стемой троек Киркмана порядка v такую организацию v + 1 объектов fx0; x1; : : :; xv g в тройки, что каждая пара fxi; xj g, i 6= j, встречается ровно в одной тройке; исключение составляют v пар fxi; x(i+1) mod v g, 0 i < v, не встречающихся ни в одной тройке. Например,

fx0; x2; x4 g; fx1; x3; x4 g

Original pages: 651-675 355

является системой троек Киркмана порядка 4.

a)Докажите, что система троек Киркмана может существовать только при v mod 6 = 0 или 4.

b)Дана штейнеровская система троек S над v объектами fx1; : : :; xv g. Докажите, что следующее построение приводит к штейнеровской системе троек S0 над 2v + 1 объектами и киркмановской системе троек K0 порядка 2v − 2: в S0 входят все тройки из S плюс

i)fxi; yj; yk g, где j + k i (mod v) и j < k, 1 i; j; k v;

ii)fxi; yj; z g, где 2j i (mod v), 1 i; j v. В систему K0 входят все тройки S0, не содержащие

y1 и/или yv.

c) Дана киркмановская система троек K над объектами fx0; x1; : : :; xv g, где v = 2u. Докажите, что следующее построение приводит к штейнеровской системе троек S0 над 2v + 1 объектами и киркмановской системе троек K0 порядка 2v − 2: в S0 входят все тройки из K плюс

i)fxi; x(i+1) mod v; yi+1 g, 0 i < v;

ii)fxi; yj; yk g,.j + k 2i + 1 (mod v − 1), 1 j < k − 1 v − 2, 1 i v − 2;

iii)fxi; yj; yv g, 2j 2i + 1 (mod v − 1), 1 j v − 1, 1 i v − 2;

iv)fx0; y2j; y2j+1 g, fxv−1; y2j−1; y2j g, fxv; yj; yv−j g, 1 j < u;

v)fxv; yu; yv g. В K0 входят все тройки из S0, не содержащие y1 и/или yv−1.

d)Используйте предыдущие результаты для доказательства того, что киркмановская система троек порядка v существует при любом v 0, имеющем вид 6k или 6k + 4, а штейнеровская система троек над v объектами существует при любом v 1, имеющем вид 6k + 1 или 6k + 3.

11.[М25] В тексте описано использование штейнеровской системы троек в связи с включающими запросами; чтобы использовать их и для базовых запросов, естественно ввести следующее понятие. Пополненной системой троек порядка v называется такая организация 2v объектов fx1; : : : ; xv; x1; : : : :; xv g в тройки, что каждая пара объектов встречается ровно в одной тройке; исключение составляют пары дополнительных элементов fxi; xi g, не входящие ни в одну тройку. Например,

fx1; x2; x3 g; ; fx1; x2; x3 g; fx1; x2; x3 g; fx1; x2; x3 g

есть пополненная система троек порядка 3.

Докажите, что пополненная система троек порядка v существует для любого v 0, не имеющего вида 3k + 2.

12.[М23] В продолжение упр. 11 постройте пополненную систему четверок порядка 7.

13.[М25] Постройте систему четверок, содержащую v = 4n элементов, аналогичную системе троек из упр. 9.

14.[25] Обсудите задачу удаления узлов из почтовых деревьев, подобных изображенному на рис. 45.

Соседние файлы в папке Дональд Кнут. Искусство программирования. т.3