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


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




[117]

Рис. 18.1 Действие операции multipop на стеке S. (а) Начальное состояние стека. Multipop(5, 4) удаляет из стека верхние четыре элемента, и стек приходит в состояние (б). Если теперь применить операцию Multipop(5, 7), то стек станет пуст (в), так как перед применением этой операции в стеке было менее семи элементов.

содержится менее к элементов, то удаляется всё, что там есть). Её можно реализовать так (Stack-Empty возвращает true тогда и только тогда, когда стек пуст):

Пример работы операции Multipop приведен на рис. 18.1.

При применении операции Multipop(S, к) к стеку, содержащему s элементов, будет произведено mm(s,k) операций Pop. Поэтому (имеется в виду фактическая стоимость, а не учётная) время ее работы пропорционально min(s,A;).

Считая, что операции Push, Pop имеют единичную стоимость (имеется в виду фактическая стоимость, а не учётная), а операция Multipop имеет стоимость min(s,A;), оценим суммарную стоимость га операций, применённых к изначально пустому стеку. Стоимость любой из операций не превосходит га (самая дорогая операция Multipop стоит не более га, поскольку за га операций в стеке не наберётся более га элементов). Следовательно, суммарная стоимость га операций есть О (га2). Эта оценка, однако, слишком груба. Чтобы получить точную оценку, заметим, что, коль скоро первоначально стек был пуст, общее число реально выполняемых операций Pop (включая те из них, что вызываются из процедуры Multipop) не превосходит общего числа операций Push, а это последнее не превосходит га. Стало быть, стоимость любой последовательности из га операций Push, Pop и Multipop, примененных к пустому стеку, есть О (га). Тем самым можно объявить, что учётная стоимость каждой из операций есть 0(га)/га = 0(1).

Подчеркнём ещё раз, что наша оценка не является вероятностной: стоимость (в расчёте на одну операцию) оценивается для худшего случая.

Multipop (5, к)


counter value - значение счетчика, total cost - стоимость

Рис. 18.2 Состояния восьмибитового двоичного счетчика в процессе выполнения 16 последовательных операций INCREMENT. Заштрихованы биты, значения которых изменятся при следующей операции INCREMENT. В правой графе показана общая стоимость всех операций по установке или очистке битов, необходимых, чтобы досчитать до данного числа. Заметьте, что в строке номер к эта стоимость не превосходит 2к.

Двоичный счётчик

В этом разделе мы применим метод группировки к анализу к-битного двоичного счётчика. Счётчик реализован как массив битов А[0 . .к - 1] и хранит двоичную запись числа х = 2 i=o (так что А[0] - младший бит). Первоначально х = 0, т.е. A[i] = О для всех г. Определим операцию Increment (увеличить на 1 по модулю 2к) так:

Increment(A)

1г <- О

2while г < length[A] and A[i] = 1

3do А[г\ <- О

4i <r- i + 1

5if i < length[A]

6then A[i] <- 1

По существу тот же алгоритм используется в реальных компьютерах (каскадное сложение - см. раздел 29.2.1). На рис. 18.2 изображены состояния двоичного счетчика при 16 последовательных применениях операции Increment, начиная от 0 до 16. Увеличение счетчика на единицу происходит следующим образом: все начальные единичные биты в массиве А становятся нулями (цикл в строках 2-4), а следующий непосредственно за ними нулевой бит (если


таковой есть) устанавливается в единицу. Стоимость операции Increment линейно зависит от общего количества битов, подвергшихся очистке или установке. Отсюда сразу получается грубая оценка: поскольку в худшем случае (массив А состоит из одних единиц) меняются к битов, требуется О(пк) операций, чтобы сосчитать от 0 до га.

Чтобы получить более точную оценку, заметим, что не каждый раз значения всех к битов меняются. В самом деле, младший бит А[0] меняется при каждом исполнении операции Increment (см. рис. 18.2). Следующий по старшинству бит А[1] меняется только через раз: при отсчете от нуля до га этот бит меняется [п/2\ раз. Далее, A[N] меняется только каждый четвертый раз, и так далее: если 0 г lg га, то в процессе счета от 0 до га бит А[г] меняется [ra/28J раз, а если г > lgnJ> то бит г вообще не меняется. Стало быть, общее количество операций очистки и установки битов равно

Тем самым увеличение двоичного счётчика от 0 до га требует в худшем случае О (га) операций, причём константа не зависит от к (и равна 2); учётную стоимость каждой операции можно считать равной 0(п)/п = 0(1) (константа опять же не зависит от к).

Упражнения

18.1-1 Предположим, что мы разрешили не только операцию Multipop, но и Multipush, добавляющую к стеку произвольное количество элементов. Можно ли теперь считать учётную стоимость каждой операции равной 0(1)?

18.1-2 Определим для /г-битового двоичного счетчика операцию Decrement (вычитание единицы по модулю 2к). Покажите, последовательность из га операций Increment и Decrement в худшем случае требует времени @(пк).

18.1-3 Рассмотрим последовательность операций, в которой стоимость операции номер г равна г, если г является степенью двойки, и 1 в противном случае. Оцените среднюю стоимость одной операции в последовательности из га операций.

г=0

г=0

18.2. Метод предоплаты

При проведении амортизационного анализа по методу предоплаты (accounting method) каждой операции присваивается своя



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