Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[71]

Структуры данных, основанные на указателях, также, видимо, относятся к «фольклору». Согласно Кнуту, указатели использовались еще в первых компьютерах с магнитными барабанами. В 1951 году Хоппер (СМ. Hopper) разработал язык А-1, в котором алгебраические формулы представлялись в виде двоичных деревьев. Тот же Кнут указывает, что систематическое использование указателей началось с языка IPL-II, который разработали в 1956 году Ньюэлл, Шоу и Саймон (A. Newell, J.C.Shaw, H.A.Simon). В разработанном теми же авторами в 1957 году языке IPL-III появились в явном виде операции со стеками.


12Хеш-таблицы

Часто бывают нужны динамические множества, поддерживающие только «словарные операции» добавления, поиска и удаления элемента. В этом случае часто применяют так называемое хеширование; соответствующая структура данных называется «хеш-таблица» (или «таблица расстановки»). В худшем случае поиск в хеш-таблице может занимать столько же времени, сколько поиск в списке (О(га)), но на практике хеширование весьма эффективно. При выполнении некоторых естественных условий математическое ожидание времени поиска элемента в хеш-таблице есть 0(1).

Хеш-таблицу можно рассматривать как обобщение обычного массива. Если у нас достаточно памяти для массива, число элементов которого равно числу всех возможных ключей, для каждого возможного ключа можно отвести ячейку в этом массиве и тем самым иметь возможность добраться до любой записи за время 0(1) («прямая адресация», см. разд. 12.1). Однако если реальное количество записей значительно меньше, чем количество возможных ключей, то эффективнее применить хеширование: вычислять позицию записи в массиве, исходя из ключа. В разделе 12.2 обсуждаются основные идеи, а в разделе 12.3 - конкретные способы такого вычисления. В этой главе представлено несколько вариантов хеширования.

Мы увидим, что хеширование - эффективный и удобный способ выполнять основные словарные операции (среднее время 0(1) при некоторых предположениях).

12.1. Прямая адресация

Прямая адресация применима, если количество возможных ключей невелико. Пусть возможными ключами являются числа из множества U = {0,1,..., то - 1} (число то не очень велико). Предположим также, что ключи всех элементов различны.

Для хранения множества мы пользуемся массивом Г[0 . .то - 1], называемым таблицей с прямой адресацией (direct-address table).


Переводы надписей на самой картинке: universe of keys - всевозможные ключи, actual keys - используемые ключи, key - ключ, satellite data - дополнительные данные.

Рис. 12.1 Реализация динамического множества с помощью таблицы Т с прямой адресацией. Множество возможных ключей есть U = {О, 1, . . . , 9}. Каждому из этих ключей соответствует своё место в таблице. В позициях таблицы с номерами 2, 3, 5 и 8 (фактически используемые ключи) записаны указатели на элементы множества, а в неиспользуемых позициях таблицы (тёмно-серые) записан nil.

Каждая позиция, или ячейка, (по-английски slot или position) соответствует определённому ключу из множества U (рис. 12.1: Т[к] - место, предназначенное для записи указателя на элемент с ключом к; если элемента с ключом к в таблице нет, то Т[к] = nil). Реализация словарных операций тривиальна:

Direct-Address-Search (Г, к) return Т[к]

Direct-Address-Insert (Г, ж) Т[&е?/[ж]] <- ж

Direct-Address-Delete (Г, ж) Т[&е?/[ж]] <- nil

Каждая из этих операций требует времени 0(1).

Иногда можно сэкономить место, записывая в таблицу Г не указатели на элементы множества, а сами эти элементы. Можно обойтись и без отдельного поля «ключ»: ключом служит индекс в массиве. Впрочем, если мы обходимся без ключей и указателей, то надо иметь способ указать, что данная позиция свободна.

Упражнения

12.1-1 Опишите процедуру для нахождения наибольшего элемента динамического множества, представленного в виде таблицы с прямой адресацией. Каково время работы этой процедуры в худ-



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]