<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dull+jester</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dull+jester"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Dull_jester"/>
		<updated>2026-05-11T23:38:50Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%87%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B0%D1%81%D0%BA%D0%B0%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=62115</id>
		<title>Техника частичного каскадирования</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0_%D1%87%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B0%D1%81%D0%BA%D0%B0%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=62115"/>
				<updated>2017-10-26T22:03:50Z</updated>
		
		<summary type="html">&lt;p&gt;Dull jester: /* Различные подходы к решению */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition='''Каталог''' (англ. ''catalog'') {{---}} упорядоченный массив из элементов, на которых введено [[Отношение порядка|отношение порядка]]. В данной статье предполагается, что массив упорядочен по неубыванию.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Техника частичного каскадирования''' (англ. ''fractional cascading technique'') {{---}} это способ организации структуры данных, который предназначен для быстрого итеративного поиска в &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; каталогах.&lt;br /&gt;
}}&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; каталогов &amp;lt;tex&amp;gt; C_i &amp;lt;/tex&amp;gt;, каталог &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; имеет размер &amp;lt;tex&amp;gt; n_i &amp;lt;/tex&amp;gt;. Поступают запросы, которые представляют собой один элемент &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Требуется для каждого запроса определить в каждом каталоге максимальный элемент меньше либо равный &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Различные подходы к решению ==&lt;br /&gt;
[[Файл:FCT_pic1.jpg|500px|right|thumb|Пример ответа на запрос]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; n = \sum\limits_{i = 1}^k n_i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Для ответа на запрос последовательно посетим все каталоги. Пусть мы находимся в &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt;-ом каталоге, тогда мы можем ответить на запрос для данного каталога за &amp;lt;tex&amp;gt; O(\log n_i) &amp;lt;/tex&amp;gt;, используя [[Целочисленный двоичный поиск|бинарный поиск]]. Так как каталогов &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; штук, то для ответа на запрос понадобится &amp;lt;tex&amp;gt; O(k \log n) &amp;lt;/tex&amp;gt; времени. Для хранения всех каталогов понадобится &amp;lt;tex&amp;gt; O(n) &amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
# Для второго способа построим сбалансированное бинарное дерево поиска из всех элементов всех каталогов. В каждой вершине дерева со значением будет храниться дополнительно кортеж из &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; элементов {{---}} максимальных представителей каждого каталога меньше либо равных данному значению. Таким образом такая структура будет занимать &amp;lt;tex&amp;gt; O(n) &amp;lt;/tex&amp;gt; на дерево поиска и &amp;lt;tex&amp;gt; O(kn) &amp;lt;/tex&amp;gt; на дополнительные кортежи.Тогда для ответа на запрос найдем в дереве поиска максимальный ключ меньше либо равный &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и выведем &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; элементов соответствующего кортежа, итого ответ на запрос производится за &amp;lt;tex&amp;gt; O(\log n + k) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пример работы второго алгоритма: пусть &amp;lt;tex&amp;gt; C_1 = \{1, 2, 3\}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; C_2 = \{2, 3, 4\} &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; C_3 = \{1, 3, 4\} &amp;lt;/tex&amp;gt; и запрос &amp;lt;tex&amp;gt; x = 2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
*Построим кортежи для каждого значения по определению выше.&amp;lt;br&amp;gt;&amp;lt;tex&amp;gt; key_1 = 1 \Leftrightarrow p_1 = \{1, \emptyset, 1\} &amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tex&amp;gt; key_2 = 2 \Leftrightarrow p_2 = \{2, 2, 1\} &amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tex&amp;gt; key_3 = 3 \Leftrightarrow p_3 = \{3, 3, 3\} &amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;&amp;lt;tex&amp;gt; key_4 = 4 \Leftrightarrow p_4 = \{3, 4, 4\} &amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; key_i &amp;lt;/tex&amp;gt; - значение, которое попадает в дерево поиска, &amp;lt;tex&amp;gt; p_i &amp;lt;/tex&amp;gt; кортеж из элементов, который соответствует &amp;lt;tex&amp;gt; key_i &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
*Для ответа на запрос найдем в дереве поиска ключ максимальный &amp;lt;tex&amp;gt; key \leqslant x &amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt; x = 2 &amp;lt;/tex&amp;gt; ключ &amp;lt;tex&amp;gt; key = key_2 = 2 &amp;lt;/tex&amp;gt;, тогда в качестве ответа будет выступать кортеж &amp;lt;tex&amp;gt; p_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Итого имеем:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Тип подхода к решению !! Необходимая память !! Время ответа на один запрос&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; [[Целочисленный двоичный поиск|бинарных поисков]] &amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt; O(n) &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt; ||  &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt; O(k \log n) &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;center&amp;gt;Построение бинарного дерева поиска с кортежами&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt; O(kn) &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt; || &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt; O(\log n + k) &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Решение с помощью техники частичного каскадирования ==&lt;br /&gt;
Как будет показано далее, эта техника берет лучшее от подходов к решению этой задачи, что были рассмотрены выше, а именно она требует &amp;lt;tex&amp;gt; O(n) &amp;lt;/tex&amp;gt; памяти и &amp;lt;tex&amp;gt; O(\log n + k) &amp;lt;/tex&amp;gt; времени для ответа на запрос.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Идея данной техники построена на следующем: &amp;lt;br&amp;gt;&lt;br /&gt;
# Мы можем проводить ссылки из каталога номер &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; (i + 1) &amp;lt;/tex&amp;gt;-ый каталог таким образом, что разница между элементами, соединенными ссылками минимальна, что, в некоторых случаях уменьшит время поиска элемента в следующем каталоге, так как область поиска сожмется. &amp;lt;br&amp;gt;&lt;br /&gt;
# Мы можем для оптимизации пункта 1 создать модифицированные каталоги &amp;lt;tex&amp;gt; M_i &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;-ый каталог будет представлять каталог &amp;lt;tex&amp;gt; C_i &amp;lt;/tex&amp;gt; слитый с &amp;lt;tex&amp;gt; M_{i + 1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Построение === &lt;br /&gt;
Будем называть подставным элементом такой элемент каталога &amp;lt;tex&amp;gt; M_i &amp;lt;/tex&amp;gt;, который пришел из каталога &amp;lt;tex&amp;gt; M_{i + 1} &amp;lt;/tex&amp;gt;. Сами каталоги &amp;lt;tex&amp;gt; M_i &amp;lt;/tex&amp;gt; будем называть модифицированными каталогами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:FCT_pic2.jpg|800px|left|thumb|Построение модифицированных каталогов]]&lt;br /&gt;
'''Первый этап построения''':&lt;br /&gt;
*&amp;lt;tex&amp;gt; i = k &amp;lt;/tex&amp;gt; : Данный каталог не имеет никаких ссылок и равен &amp;lt;tex&amp;gt; C_i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt; i &amp;lt; k &amp;lt;/tex&amp;gt; : Для построения данного каталога будем сливать каталог &amp;lt;tex&amp;gt; C_i &amp;lt;/tex&amp;gt; с каждым вторым элементом каталога &amp;lt;tex&amp;gt; M_{i + 1} &amp;lt;/tex&amp;gt;. Каждый элемент из каталога &amp;lt;tex&amp;gt; M_{i + 1} &amp;lt;/tex&amp;gt; оснастим ссылкой на позицию, откуда мы его взяли, такие ссылки будет называть ссылками вниз.&lt;br /&gt;
&lt;br /&gt;
'''Второй этап построения''':&lt;br /&gt;
* В каждом модифицированном каталоге для каждого элемента заведем две ссылки. Для неподставных элементов это будут ссылки на максимальный подставной элемент меньше текущего и на минимальный любого типа больше текущего. Если элемент подставной, то ссылки будут на минимальный неподставной элемент больше текущего и на максимальный неподставной элемент меньше текущего. Назовем их ссылками влево и вправо.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Рассмотрим на процесс построения на примере.&lt;br /&gt;
&amp;lt;br&amp;gt; Пусть дано &amp;lt;tex&amp;gt; k = 5 &amp;lt;/tex&amp;gt; каталогов: &lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; C_1 = \{1, 3, 6, 7, 11, 12\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; C_2 = \{4, 9, 10\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; C_3 = \{1, 2, 7, 8, 11, 12\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; C_4 = \{3, 4, 8, 10, 12\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; C_5 = \{1, 2, 4, 6, 9\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; Для наглядности заведем таблицу, где в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой строке &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;-ая ячейка будет окрашена в зеленый цвет, если она присутствует в каталоге &amp;lt;tex&amp;gt; C_i &amp;lt;/tex&amp;gt;. Тогда результатом построения будет таблица, которая представлена на рисунке. Для упрощения рисунка ссылки вправо из неподставных элементов не были отображены, их следует воспринимать как следующий справа от рассматриваемого элемент в ряду таблицы любого цвета.  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Из-за необходимости хранения ссылок будет удобно завести структуру для хранения элементов в модифицированных каталогах:&lt;br /&gt;
 '''struct''' Node:  &lt;br /&gt;
     '''T''' key                   &lt;br /&gt;
     '''Node''' left, right, down        &lt;br /&gt;
     '''bool''' is_alien                 &lt;br /&gt;
&lt;br /&gt;
Псевдокод построения модифицированных каталогов:&lt;br /&gt;
 M[k] = C[k]&lt;br /&gt;
 '''for''' i = k - 1 '''downto''' 1&lt;br /&gt;
     '''int''' pointer_in_C = 1                     &amp;lt;font color=green&amp;gt;// указатель на самый левый элемент каталога C[i], который еще не рассмотрели &amp;lt;/font&amp;gt;&lt;br /&gt;
     '''int''' pointer_in_next_M = 1                &amp;lt;font color=green&amp;gt;// указатель на самый левый элемент каталога M[i + 1], который еще не рассмотрели &amp;lt;/font&amp;gt;&lt;br /&gt;
     '''int''' pointer_in_M = 1                     &amp;lt;font color=green&amp;gt;// указатель на самый левый элемент каталога M[i], в который будем добавлять элемент &amp;lt;/font&amp;gt; &lt;br /&gt;
     '''Node''' last_non_alien = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;                 &amp;lt;font color=green&amp;gt;// указатель на последний неподставной элемент для текущей позиции &amp;lt;/font&amp;gt;&lt;br /&gt;
     '''Node''' last_alien = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;                     &amp;lt;font color=green&amp;gt;// указатель на последний подставной элемент для текущей позиции&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''while''' ''true''&lt;br /&gt;
         '''if''' pointer_in_next_M &amp;gt; M[i + 1].size '''and''' pointer_in_C &amp;gt; C[i].size &lt;br /&gt;
             '''break''' &lt;br /&gt;
         '''if''' pointer_in_next_M &amp;gt; M[i + 1].size '''or''' M[i + 1][pointer_in_next_M] &amp;lt;tex&amp;gt; \geqslant &amp;lt;/tex&amp;gt; C[i][pointer_in_C]&lt;br /&gt;
             M[i][pointer_in_M].key = C[i][pointer_in_C].key&lt;br /&gt;
             M[i][pointer_in_M].left= last_alien&lt;br /&gt;
             last_non_alien = M[i][pointer_in_M]&lt;br /&gt;
             pointer_in_C++&lt;br /&gt;
         '''else'''&lt;br /&gt;
             M[i][pointer_in_M].key = M[i + 1][pointer_in_next_M].key&lt;br /&gt;
             M[i][pointer_in_M].down = M[i + 1][pointer_in_next_M]&lt;br /&gt;
             M[i][pointer_in_M].is_alien = ''true''&lt;br /&gt;
             M[i][pointer_in_M].left = last_non_alien&lt;br /&gt;
             last_alien = M[i][pointer_in_M]&lt;br /&gt;
             pointer_in_next_M += 2&lt;br /&gt;
         pointer_in_M++&lt;br /&gt;
     '''if''' '''not''' M[i][M[i].size].is_alien&lt;br /&gt;
         last_non_alien = M[i][M[i].size]&lt;br /&gt;
     '''else''' &lt;br /&gt;
         last_non_alien = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;     &amp;lt;font color=green&amp;gt;// теперь last_non_alien указатель на первый справа неподставной элемент для текущей позиции&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = M[i].size - 1 '''downto''' 1       &lt;br /&gt;
         '''if''' M[i][j].is_alien&lt;br /&gt;
             M[i][j].right = last_non_alien&lt;br /&gt;
         '''else'''&lt;br /&gt;
             M[i][j].right = M[i][j + 1]&lt;br /&gt;
             last_non_alien = M[i][j]&lt;br /&gt;
&lt;br /&gt;
Из построения понятно, что мы тратим &amp;lt;tex&amp;gt; O(n_k) &amp;lt;/tex&amp;gt; на построение последнего каталога, &amp;lt;tex&amp;gt; O(n_{k-1} + n_k / 2) &amp;lt;/tex&amp;gt; на построение предпоследнего и т.д. Пусть &amp;lt;tex&amp;gt; p = 2^{n - 1} &amp;lt;/tex&amp;gt;. Тогда получаем оценку &amp;lt;tex&amp;gt; O(n_k (1 + 1/2 + 1/4 + \dots + 1/p) + n_{k - 1} (1 + 1/2 + 1/4 + \dots + 1/(p/2)) + \dots + n_1 ) &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; = O(2 n_k + 2 n_{k -1} + \dots n_1) = O(n) &amp;lt;/tex&amp;gt; памяти. По алгоритму понятно, что такая же оценка верна и для времени на предподсчет.&lt;br /&gt;
&lt;br /&gt;
=== Ответ на запрос ===&lt;br /&gt;
&lt;br /&gt;
*В первом каталоге ответ на запрос найдем с помощью [[Целочисленный двоичный поиск|бинарного поиска]] по &amp;lt;tex&amp;gt; M_1 &amp;lt;/tex&amp;gt;. Пусть ответом для этого каталога будет ячейка &amp;lt;tex&amp;gt; cell &amp;lt;/tex&amp;gt;, тогда если &amp;lt;tex&amp;gt; cell &amp;lt;/tex&amp;gt; {{---}} подставная вершина, то перейдем по ссылке влево.&lt;br /&gt;
*Проитерируемся по оставшимся каталогам. &lt;br /&gt;
**Для того, чтобы перейти в новый модифицированный каталог мы перейдем из &amp;lt;tex&amp;gt; cell &amp;lt;/tex&amp;gt; по ссылке влево, чтобы попасть в подставную вершину, а потом из нее перейдем по ссылке вниз, чтобы попасть в следующий каталог. &lt;br /&gt;
**Если теперь &amp;lt;tex&amp;gt; cell &amp;lt;/tex&amp;gt; {{---}} неподставная вершина, то нам достаточно рассмотреть двух ее соседей справа в &amp;lt;tex&amp;gt; C_i &amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt; cell.key \leqslant x &amp;lt;/tex&amp;gt;, а каждая вторая ячейка из &amp;lt;tex&amp;gt; M_i &amp;lt;/tex&amp;gt; попадает в &amp;lt;tex&amp;gt; M_{i - 1} &amp;lt;/tex&amp;gt;, т.е. мы бы встретили ее ранее и перешли мы вниз по ней, но этого не случилось.&lt;br /&gt;
**Обновив &amp;lt;tex&amp;gt; cell &amp;lt;/tex&amp;gt; максимальным из подходящих значений нужно проверить, является ли она подставным элементом, если да, то перейдем по ссылке влево, попав в ответ для текущего каталога, иначе это и будет ответ.&lt;br /&gt;
&lt;br /&gt;
 '''Node''' cell = binary_search(M[1], x)&lt;br /&gt;
 '''if''' cell.is_alien &lt;br /&gt;
     cell = cell.left&lt;br /&gt;
 ans[1] = cell.key;                &amp;lt;font color=green&amp;gt;// ans[i] - ответ на текущий запрос для каталога С[i] &amp;lt;/font&amp;gt; &lt;br /&gt;
 '''for''' i = 2 '''to''' k&lt;br /&gt;
     cell = cell.left.down         &lt;br /&gt;
     '''if''' cell.right &amp;lt;tex&amp;gt; \leqslant &amp;lt;/tex&amp;gt; x            &amp;lt;font color=green&amp;gt;// Попытка сдвинуться к большему элементу &amp;lt;/font&amp;gt;&lt;br /&gt;
          cell = cell.right      &lt;br /&gt;
     '''if''' cell.right &amp;lt;tex&amp;gt; \leqslant &amp;lt;/tex&amp;gt; x            &amp;lt;font color=green&amp;gt;// Попытка сдвинуться к большему элементу &amp;lt;/font&amp;gt;&lt;br /&gt;
          cell = cell.right       &amp;lt;font color=green&amp;gt;// Замечание: по построению, если мы стоим в ''неподставном элементе'', то при сдвиге вправо мы можем оказаться в элементе любого типа&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''if''' cell.is_alien             &amp;lt;font color=green&amp;gt;// Для этого есть проверка &amp;lt;/font&amp;gt;&lt;br /&gt;
          cell = cell.left&lt;br /&gt;
     ans[i] = cell.key&lt;br /&gt;
&lt;br /&gt;
Как можно видеть, для того, чтобы найти ответ для первого каталога необходимо сделать один [[Целочисленный двоичный поиск|бинарный поиск]], что требует &amp;lt;tex&amp;gt; O(\log n) &amp;lt;/tex&amp;gt; времени, после чего необходимо &amp;lt;tex&amp;gt; O(k) &amp;lt;/tex&amp;gt; времени, чтобы ответить на запрос для всех остальных каталогов. Суммарное время работы &amp;lt;tex&amp;gt; O(\log n + k) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Примеры ответа на запрос====&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; center&lt;br /&gt;
|[[Файл:FCT_pic3.jpg|600px|center|thumb|Ответ на запрос &amp;lt;tex&amp;gt; x = 9 &amp;lt;/tex&amp;gt;]]&lt;br /&gt;
|[[Файл:FCT_pic4.jpg|600px|center|thumb|Ответ на запрос &amp;lt;tex&amp;gt; x = 6 &amp;lt;/tex&amp;gt;]]&lt;br /&gt;
|}&lt;br /&gt;
Рассмотрим, как будет происходить ответ на запрос для &amp;lt;tex&amp;gt; x = 9 &amp;lt;/tex&amp;gt; (картинка справа) и для &amp;lt;tex&amp;gt; x = 6 &amp;lt;/tex&amp;gt; (картинка слева). Каталоги взяты из примера для [[Техника частичного каскадирования#Построение | построения]]. Оставлены только ссылки, по которым осуществляется переход, а элементы пронумерованы в порядке обхода.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дополнительно===&lt;br /&gt;
Данная техника может использоваться для ускорения некоторых алгоритмов, где требуется ответить на запрос на отрезке &amp;lt;tex&amp;gt; [L, R] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; L, R \in R^n, n \in \mathbb N &amp;lt;/tex&amp;gt;. Однако иногда наблюдается замедление&amp;lt;ref&amp;gt;[http://codeforces.com/blog/entry/21892?locale=en Fractional cascading is in fact slow? ifsmirnov's blog]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Пересечение прямоугольника с множеством непересекающихся отрезков (segment tree)]]&lt;br /&gt;
*[[Перечисление точек в произвольном прямоугольнике за n * log ^(d - 1) n (range tree)]]&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-12.pdf Fractional Cascading. Bernard Chazelle and Leonidas J. Guibas]&lt;br /&gt;
* [http://intsys.msu.ru/magazine/archive/v15(1-4)/pivovarov-205-222.pdf Техника частичного каскадирования для итеративного поиска в линейно упорядоченных множествах А.П. Пивоваров]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Структуры данных]]&lt;/div&gt;</summary>
		<author><name>Dull jester</name></author>	</entry>

	</feed>