Техника частичного каскадирования — различия между версиями
(Закончена тема "различные подходы к решению") |
(Добавлена тема "Построение" с небольшим примером) |
||
Строка 5: | Строка 5: | ||
}} | }} | ||
+ | == Различные подходы к решению == | ||
[[Файл:FCT_pic1.jpg|500px|right|thumb|Пример ответа на запрос]] | [[Файл:FCT_pic1.jpg|500px|right|thumb|Пример ответа на запрос]] | ||
− | |||
− | |||
− | |||
Пусть <tex> n = \sum\limits_{i = 1}^k n_i </tex>. | Пусть <tex> n = \sum\limits_{i = 1}^k n_i </tex>. | ||
<br> | <br> | ||
Строка 15: | Строка 13: | ||
2) Для второго способа построим сбалансированное бинарное дерево поиска их всех элементов всех каталогов. В каждой вершине дерева будет хранится дополнительно кортеж из <tex> k </tex> элементов - максимальных представителей каталогов меньше либо равных ключу вершины. Таким образом такая структура будет занимать <tex> O(n) </tex> на дерево поиска и <tex> O(kn) </tex> на дополнительные кортежи.Тогда для ответа на запрос <tex> x </tex> найдем в дереве поиска максимальный ключ меньше либо равный <tex> x </tex> и выведем <tex> k </tex> элементов соответствующего кортежа, итого ответ на запрос производится за <tex> O(\log n + k) </tex>. | 2) Для второго способа построим сбалансированное бинарное дерево поиска их всех элементов всех каталогов. В каждой вершине дерева будет хранится дополнительно кортеж из <tex> k </tex> элементов - максимальных представителей каталогов меньше либо равных ключу вершины. Таким образом такая структура будет занимать <tex> O(n) </tex> на дерево поиска и <tex> O(kn) </tex> на дополнительные кортежи.Тогда для ответа на запрос <tex> x </tex> найдем в дереве поиска максимальный ключ меньше либо равный <tex> x </tex> и выведем <tex> k </tex> элементов соответствующего кортежа, итого ответ на запрос производится за <tex> O(\log n + k) </tex>. | ||
<br> <br> | <br> <br> | ||
− | Итого имеем | + | Итого имеем: |
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
Строка 24: | Строка 22: | ||
| <center>Построение бинарного дерева поиска с кортежами</center> || <center><tex> O(kn) </tex></center> || <center><tex> O(\log n + k) </tex></center> | | <center>Построение бинарного дерева поиска с кортежами</center> || <center><tex> O(kn) </tex></center> || <center><tex> O(\log n + k) </tex></center> | ||
|} | |} | ||
+ | |||
+ | == Решение с помощью техники частичного каскадирования == | ||
+ | Как будет показано далее, эта техника берет лучшее от подходов к решению этой задачи, что были рассмотрены выше, а именно она требует <tex> O(n) </tex> памяти и <tex> O(\log n + k) </tex> времени для ответа на запрос. | ||
+ | <br> | ||
+ | Идея данной техники построена на следующем: <br> | ||
+ | 1) Мы можем проводить ссылки из каталога номер <tex> i </tex> в <tex> (i + 1) </tex>-ый каталог таким образом, что разница между элементами соединенными ссылками минимальна, что, очевидно, в некоторых случаях уменьшит время поиска. <br> | ||
+ | 2) Мы можем для оптимизации пункта 1 создать модифицированные каталоги <tex> M_i </tex>, где <tex> i </tex>-ый каталог будет представлять каталог <tex> C_i </tex> слитый с <tex> M_{i + 1} </tex> | ||
+ | <br> | ||
+ | |||
+ | === Построение === | ||
+ | Рассмотрим подробнее построение каталогов <tex> M_i </tex>. | ||
+ | Введем определения: | ||
+ | {{Определение | ||
+ | |definition='''Подставной элемент''' {{---}} элемент каталога <tex> M_i </tex>, который пришел из каталога <tex> M_{i + 1} </tex>. А также каталоги <tex> M_i </tex> будем называть '''модифицированными каталогами'''. | ||
+ | }} | ||
+ | [[Файл:FCT_pic2.jpg|600px|left|thumb|Построение модифицированных каталогов без ссылок из подставных элементов]] | ||
+ | <br>''Первый этап построения'': | ||
+ | <br> <tex> i = k </tex> : Данный каталог не имеет никаких ссылок и равен <tex> C_i </tex>. | ||
+ | <br> <tex> i < k </tex> : Для построения данного каталога будем сливать каталог <tex> C_i </tex> с каждым вторым элементом каталога <tex> M_{i + 1} </tex>. Каждый элемент из каталога <tex> M_{i + 1} </tex> оснастим ссылкой на позицию, откуда мы его взяли. | ||
+ | |||
+ | <br>''Второй этап построения'': | ||
+ | <br> В каждом ''модифицированном каталоге'' для каждого элемента заведем две ссылки. Для ''неподставных элементов'' это будут ссылки на минимальный ''подставной элемент'' больше текущего и на максимальный ''подставной элемент'' меньше текущего. И наоборот, если ''элемент подставной'', то ссылки будут на минимальный ''неподставной элемент'' больше текущего и на максимальный ''неподставной элемент'' больше текущего. | ||
+ | |||
+ | <br> Рассмотрим на процесс построения на примере. | ||
+ | <br> Пусть дано <tex> k = 5 </tex> каталогов : | ||
+ | <br> <tex> C_1 = \{1, 3, 6, 7, 11, 12\} </tex> | ||
+ | <br> <tex> C_2 = \{4, 9, 10\} </tex> | ||
+ | <br> <tex> C_3 = \{1, 2, 7, 8, 11, 12\} </tex> | ||
+ | <br> <tex> C_4 = \{3, 4, 8, 10, 12\} </tex> | ||
+ | <br> <tex> C_5 = \{1, 2, 4, 6, 9\} </tex> | ||
+ | <br> Для наглядности заведем таблицу, где в <tex>i</tex>-ой строке <tex> j </tex>-ая ячейка будет окрашена в зеленый цвет, если она присутствует в каталоге <tex> C_i </tex>. Тогда результатом построения будет таблица, которая представлена на рисунке (без ссылок из ''подставных элементов''). |
Версия 19:05, 7 июня 2017
Техника частичного каскадирования (англ. fractional cascading technique) — это способ организации структуры данных, который предназначен для быстрого итеративного поиска в
каталогах.
Задача: |
Дано | каталогов , каталог представляет собой упорядоченный массив размера . Поступают запросы, которые представляют собой один элемент . Требуется для каждого запроса определить в каждом каталоге максимальный элемент меньше либо равный .
Различные подходы к решению
Пусть
1) Пусть пришел запрос . Пробежимся по всем каталогам. Пусть мы находимся в -ом каталоге, тогда мы можем ответить на запрос для данного каталога за используя бинарный поиск. Так как каталогов штук, то в итоге мы обработаем запрос за . Для хранения всех каталогов понадобится памяти.
2) Для второго способа построим сбалансированное бинарное дерево поиска их всех элементов всех каталогов. В каждой вершине дерева будет хранится дополнительно кортеж из элементов - максимальных представителей каталогов меньше либо равных ключу вершины. Таким образом такая структура будет занимать на дерево поиска и на дополнительные кортежи.Тогда для ответа на запрос найдем в дереве поиска максимальный ключ меньше либо равный и выведем элементов соответствующего кортежа, итого ответ на запрос производится за .
Итого имеем:
Тип подхода к решению | Необходимая память | Время ответа на один запрос |
---|---|---|
|
|
|
|
|
|
Решение с помощью техники частичного каскадирования
Как будет показано далее, эта техника берет лучшее от подходов к решению этой задачи, что были рассмотрены выше, а именно она требует
Идея данной техники построена на следующем:
1) Мы можем проводить ссылки из каталога номер в -ый каталог таким образом, что разница между элементами соединенными ссылками минимальна, что, очевидно, в некоторых случаях уменьшит время поиска.
2) Мы можем для оптимизации пункта 1 создать модифицированные каталоги , где -ый каталог будет представлять каталог слитый с
Построение
Рассмотрим подробнее построение каталогов
. Введем определения:Определение: |
Подставной элемент — элемент каталога | , который пришел из каталога . А также каталоги будем называть модифицированными каталогами.
Первый этап построения:
: Данный каталог не имеет никаких ссылок и равен .
: Для построения данного каталога будем сливать каталог с каждым вторым элементом каталога . Каждый элемент из каталога оснастим ссылкой на позицию, откуда мы его взяли.
Второй этап построения:
В каждом модифицированном каталоге для каждого элемента заведем две ссылки. Для неподставных элементов это будут ссылки на минимальный подставной элемент больше текущего и на максимальный подставной элемент меньше текущего. И наоборот, если элемент подставной, то ссылки будут на минимальный неподставной элемент больше текущего и на максимальный неподставной элемент больше текущего.
Рассмотрим на процесс построения на примере.
Пусть дано каталогов :
Для наглядности заведем таблицу, где в -ой строке -ая ячейка будет окрашена в зеленый цвет, если она присутствует в каталоге . Тогда результатом построения будет таблица, которая представлена на рисунке (без ссылок из подставных элементов).