Кэширование забывающего массива lookahead - PullRequest
10 голосов
/ 21 мая 2011

Я пытаюсь разобраться в массиве упреждающего кеша, который описан в здесь , и на странице 35 этой презентации

Анализ вставки в упрощенный Фрактальное дерево:

  1. Стоимость объединения двух массивов размера X составляет O (X = B) блоков ввода / вывода. Слияние очень Эффективный ввод / вывод.
  2. Стоимость каждого элемента для слияния составляет O (1 / B), поскольку O (X) элементов были слиты.
  3. Максимальное количество раз, когда каждый элемент объединяется, равно O (logN).
  4. Средняя стоимость вставки O (logN / B)

Я могу понять # 1, # 2 и # 3, но не могу понять # 4. Из статьи, слияние можно рассматривать как двоичное сложение, например, (31) B может быть представлено: 11111
при вставке нового предмета (плюс 1) должно быть 5 = ​​log (32) слияния (5 переносов). Но в этой ситуации мы должны объединить 32 элемента! Кроме того, если каждый раз мы плюс 1, то сколько разносов будет выполнено от 0 до 2 ^ k? Ответ должен быть 2 ^ k - 1. Другими словами, одно слияние на вставку!

так Как вычисляется # 4?

Ответы [ 3 ]

6 голосов
/ 21 мая 2011

Хотя вы правы и в том, что количество объединенных элементов (и, следовательно, переносов) равно N в худшем случае, и что общее количество слияний также одного и того же порядка, средняя стоимость вставки средняя равна все еще логарифмический. Это объясняется двумя фактами: слияния различаются по стоимости, а количество недорогих слияний намного выше, чем количество дорогостоящих.

Это может быть легче увидеть на примере.
Давайте установим B = 1 (т.е. 1 элемент на блок, наихудший случай каждого слияния, имеющий стоимость) и N = 32 (например, мы вставляем 32 элемента в изначально пустой массив).
Половина вставок (16) помещает элемент в пустой подмассив размера 1, поэтому не вызывает слияния. Из оставшихся вставок одной (последней) необходимо объединить (переместить) 32 элемента, один (16-й) ходов 16, два (8-й и 24-й) ходов 8 элементов, четыре элемента ходов 4 и восемь элементов ходов 2. Таким образом, общее количество ходов элемента равно 96, что дает в среднем 3 хода на вставку.

Надеюсь, это поможет.

5 голосов
/ 29 ноября 2011

Первые уровни журнала B помещаются в (одну страницу) памяти, и поэтому все, что происходит на этих уровнях, не требует ввода-вывода.(Это также устраняет проблему с анализом rrenaud, заключающуюся в том, что O (1) объединяется за вставку, поскольку вы начинаете платить за них только после первого объединения B.)

После объединения хотя бы B элементов,Факт 2 вступает в силу.

Рассмотрим работу с точки зрения элемента.Объединяется O (log N) раз.Он получает заряд O (1 / B) каждый раз, когда это происходит.Общая стоимость вставки составляет O ((log N) / B) (нужны дополнительные парены, чтобы отличаться от O (log N / B), что было бы довольно плохой производительностью вставки - даже хуже, чем у B-дерева).

«Средняя» стоимость - это действительно амортизированная стоимость - это сумма, которую вы взимаете с этого элемента за его вставку.Чуть более формально это общая работа по вставке N элементов, а затем делению на N. Амортизированная стоимость O ((log N) / B) действительно означает, что вставка N элементов - это O ((N log N) / B) I /Os - для всей последовательности.Это довольно выгодно для сравнения с B-деревьями, которые для N вставок выполняют всего O ((N log N) / log B) операций ввода-вывода.Деление на B, очевидно, намного лучше, чем деление на журнал B.

Вы можете жаловаться, что работа является комковатой, что вы иногда делаете вставку, которая вызывает большой каскад слияний.Это нормально.Вы не взимаете все слияния до последней вставки.Каждый платит свою небольшую сумму за каждое слияние, в котором он участвует. Поскольку (log N) / B, как правило, будет намного меньше 1, каждому начисляется намного меньше, чем один ввод / вывод в течение всех слияний, в которых он участвует.участвует.

Что произойдет, если вам не нравится амортизированный анализ, и вы говорите, что даже если пропускная способность увеличивается на пару порядков, вам не нравится, когда одна вставка можетвызывать огромное количество работы?Ага!Существуют стандартные способы деамортизации такой структуры данных, когда вы выполняете небольшое вытеснение во время каждой вставки.Вы получаете ту же сложность ввода / вывода (вам придется поверить на мое слово), но это довольно стандартная штука для людей, которым небезразличен амортизированный анализ и дезамортизация результата.

Полное раскрытие: яодин из авторов статьи COLA.Кроме того, Rrenaud был в моем классе алгоритмов.Кроме того, я основатель Tokutek.

0 голосов
/ 21 мая 2011

Как правило, амортизированное число измененных битов на единицу составляет 2 = O (1).

Вот доказательство по логике / рассуждению. http://www.cs.princeton.edu/courses/archive/spr11/cos423/Lectures/Binary%20Counting.pdf

Вот «доказательство» экспериментальным путем. http://codepad.org/0gWKC3rW

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...