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


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




[116]

статье Уитни [200].

Задачами этой главы занимались многие авторы - Гаврил [80] (задача о выборе заявок), Лоулер [132], Горовиц и Сахни [105], Брассар и Братли [33] (задача о расписании).

Коды Хаффмена были изобретены в 1952 году [107]. Обзор методов сжатия информации (по состоянию на 1987 год) дали Лелевер и Хиршберг [136].

Корте и Ловас [127, 128, 129, 130] создали теорию гридоидов (greedoids), являющуюся обобщением теории, изложенной в разделе 17.4.


Амортизационный анализ

Амортизационный анализ применяется для оценки времени выполнения нескольких операций с какой-либо структурой данных (например, стеком). Чтобы оценить время выполнения какой-либо последовательности операций, достаточно умножить максимальную длительность операции на общее число операций. Иногда, однако, удается получить более точную оценку времени работы (или, что равносильно, среднего времени выполнения одной операции), используя тот факт, что во многих случаях после длительных операций несколько следующих операций выполняются быстро. Оценки такого рода называются амортизационным анализом (amortized analysis) алгоритма. Подчеркнем, что оценка, даваемая амортизационным анализом, не является вероятностной: это оценка среднего времени выполнения одной операции для худшего случая.

[При амортизационном анализе каждой операции присваивается некоторая учётная стоимость (amortized cost), которая может быть больше или меньше реальной длительности операции. При этом должно выполняться следующее условие: для любой последовательности операций фактическая суммарная длительность всех операций (предполагается, что до выполнения операций структура данных находится в начальном состоянии - например, стек пуст) не превосходит суммы их учётных стоимостей. Если это условие выполнено, то говорят, что учётные стоимости присвоены корректно. Заметим, что для одной и той же структуры данных и одних и тех же алгоритмов выполнения операций можно корректно назначить учётные стоимости несколькими различными способами.]

В первых трёх разделах этой главы рассказывается о трёх основных методах амортизационного анализа. В разделе 18.1 речь идет о методе группировки: мы можем оценить стоимость п операций в худшем случае и установить, что она не превосходит Т(п)). После этого можно объявить, что учётная стоимость любой операции, независимо от ее длительности, равна Т(п)/п.

В разделе 18.2 рассказывается о методе предоплаты. При этом методе амортизационного анализа различным операциям могут присваиваться различные учётные стоимости. У некоторых опера-


ций учётная стоимость объявляется выше реальной. Когда выполняется такая операция, остаётся резерв, который считается хранящимся в определенном месте структуры данных. Этот резерв используется для доплаты за операции, учётная стоимость которых ниже фактической.

В методе потенциалов, обсуждаемом в разделе 18.3, резерв не связывается с какими-то конкретными объектами, а является функцией текущего состояния структуры данных. Эта функция называется «потенциалом», и учётные стоимости должны быть с ней согласованы.

Мы иллюстрируем эти три метода на двух примерах. Первый из них - стек, снабженный дополнительной операцией Multipop, удаляющей из стека несколько элементов одновременно. Второй пример - двоичный счетчик, снабженный единственной операцией Increment (увеличить на единицу).

Заметим, что понятие потенциала используется для анализа алгоритма; в самой программе нет необходимости вычислять и хранить его значение.

Идеи, связанные с амортизационным анализом, полезно иметь в виду при разработке алгоритмов. Пример такого рода дан в разделе 18.4 (таблица переменного размера).

18.1. Метод группировки

Метод группировки (aggregate method) состоит в следующем: для каждого п оценивается время Т(п), требуемое на выполнение п операций (в худшем случае). Время в расчёте на одну операцию, то есть отношение Т(п)/п, объявляется учётной стоимостью одной операции. При этом учётные стоимости всех операций оказываются одинаковыми (при двух других методах амортизационного анализа это будет не так).

Операции со стеком

Мы применим метод группировки для анализа стека с одной дополнительной операцией. В разделе 11.1 мы ввели две основные операции со стеком:

Push ж) добавляет элемент ж к стеку S;

Pop(5*) удаляет вершину стека S (и возвращает её).

Каждая из этих операций выполняется за время 0(1). Следовательно, выполнение п операций Push и Pop требует времени 0(га).

Ситуация становится более интересной, если добавить операцию Multipop(S, к), которая удаляет к элементов из стека (если в стеке



[стр.Начало] [стр.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]