<?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=109.188.169.214&amp;*</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=109.188.169.214&amp;*"/>
		<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/109.188.169.214"/>
		<updated>2026-04-26T03:19:03Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%B2%D0%B5%D1%80%D1%85%D1%83&amp;diff=21588</id>
		<title>Обсуждение:Реализация запроса в дереве отрезков сверху</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%B2%D0%B5%D1%80%D1%85%D1%83&amp;diff=21588"/>
				<updated>2012-04-30T05:47:03Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.169.214: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: {{tick | ticked=1}} описание перенести в шапку статьи&lt;br /&gt;
: {{tick | ticked=1}} зачем какое-то тире перед началом ссылки в разделе «Ссылки».&lt;br /&gt;
: {{tick}} А почему в описании алгоритма одни интервалы полуоткрытые, а другие — закрытые?&lt;br /&gt;
: {{tick}} не надо объяснять алгоритм на примере RSQ, объясняй на примере абстрактной операции с деревом отрезков. Вот уже в примере работы — ок, пусть будет RSQ.&lt;br /&gt;
:: «возвращаем нулевое значение» — это совсем не абстрактно.&lt;br /&gt;
:: «как некоторую функцию» — почему «некоторую»?&lt;br /&gt;
: {{tick | ticked=1}} обычно вершина в дереве отрезков — node, vertex (у тебя же от этого название «ver» образовано?) — ближе к графам.&lt;br /&gt;
: {{tick | ticked=1}} Псевдокод надо делать как можно абстрактнее. Зачем передавать в рекурсию левую и правую границу отрезка, если ты уже передаешь ver? Левую и правую границу можно получить как tree[ver].left, tree[ver].right, значение — как tree[ver].value. И почитай правила оформления псевдокода. Можно вообще передавать в рекурсии node, тогда не нужны будут вот эти ver * 2 и ver * 2 + 1, можно будет вызываться от node.left, node.right.&lt;br /&gt;
: {{tick | ticked=1}} ver * 2 и ver * 2 + 1 — неправильно, так как мы все-таки используем 0-индексацию, а 0 * 2 == 0&lt;br /&gt;
: {{tick | ticked=1}} Отрезки в псевдокоде должны быть полуотурытыми, иначе он у тебя может входить в бесконечную рекурсию. (l=k, r=k =&amp;gt; m = k, дальше опять вызов от l=k, r=k). &lt;br /&gt;
: {{tick}} =&amp;gt; смотрится фигово, лучше в техе хотя бы. И названия вершин (1, 2 и т.д.) там в техе пиши. еще в примере в одном месте форматирование поехало.&lt;br /&gt;
:: '''не исправлено'''&lt;br /&gt;
: {{tick | ticked=1}} Тут надо просто все нормально переписать, а то как-то обрывисто. Добавить интервики, категории. --[[Участник:Dgerasimov|Дмитрий Герасимов]] 00:08, 7 февраля 2012 (MSK)&lt;br /&gt;
: {{tick}} какие-то странные опечатки и фразы&lt;br /&gt;
:: `«причем левые границы обоих отрезков - включительно, а правые — нет»&lt;br /&gt;
:: «Текущий полуинтервал совпадает, то возвращаем»&lt;br /&gt;
:: «Используем в реализаций полуинтервалы»&lt;br /&gt;
:: «каждый полуинтервал разбивается не более, чем на O(log n)  полуинтервал»&lt;/div&gt;</summary>
		<author><name>109.188.169.214</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%B2%D0%B5%D1%80%D1%85%D1%83&amp;diff=21587</id>
		<title>Обсуждение:Реализация запроса в дереве отрезков сверху</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%B2%D0%B5%D1%80%D1%85%D1%83&amp;diff=21587"/>
				<updated>2012-04-30T05:44:18Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.169.214: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: {{tick | ticked=1}} описание перенести в шапку статьи&lt;br /&gt;
: {{tick | ticked=1}} зачем какое-то тире перед началом ссылки в разделе «Ссылки».&lt;br /&gt;
: {{tick}} А почему в описании алгоритма одни интервалы полуоткрытые, а другие — закрытые?&lt;br /&gt;
: {{tick}} не надо объяснять алгоритм на примере RSQ, объясняй на примере абстрактной операции с деревом отрезков. Вот уже в примере работы — ок, пусть будет RSQ.&lt;br /&gt;
: {{tick | ticked=1}} обычно вершина в дереве отрезков — node, vertex (у тебя же от этого название «ver» образовано?) — ближе к графам.&lt;br /&gt;
: {{tick | ticked=1}} Псевдокод надо делать как можно абстрактнее. Зачем передавать в рекурсию левую и правую границу отрезка, если ты уже передаешь ver? Левую и правую границу можно получить как tree[ver].left, tree[ver].right, значение — как tree[ver].value. И почитай правила оформления псевдокода. Можно вообще передавать в рекурсии node, тогда не нужны будут вот эти ver * 2 и ver * 2 + 1, можно будет вызываться от node.left, node.right.&lt;br /&gt;
: {{tick | ticked=1}} ver * 2 и ver * 2 + 1 — неправильно, так как мы все-таки используем 0-индексацию, а 0 * 2 == 0&lt;br /&gt;
: {{tick | ticked=1}} Отрезки в псевдокоде должны быть полуотурытыми, иначе он у тебя может входить в бесконечную рекурсию. (l=k, r=k =&amp;gt; m = k, дальше опять вызов от l=k, r=k). &lt;br /&gt;
: {{tick}} =&amp;gt; смотрится фигово, лучше в техе хотя бы. И названия вершин (1, 2 и т.д.) там в техе пиши. еще в примере в одном месте форматирование поехало.&lt;br /&gt;
:: '''не исправлено'''&lt;br /&gt;
: {{tick | ticked=1}} Тут надо просто все нормально переписать, а то как-то обрывисто. Добавить интервики, категории. --[[Участник:Dgerasimov|Дмитрий Герасимов]] 00:08, 7 февраля 2012 (MSK)&lt;br /&gt;
: {{tick}} какие-то опечатки&lt;br /&gt;
:: «Используем в реализаций полуинтервалы»&lt;br /&gt;
:: «каждый полуинтервал разбивается не более, чем на O(log n)  полуинтервал»&lt;/div&gt;</summary>
		<author><name>109.188.169.214</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%B2%D0%B5%D1%80%D1%85%D1%83&amp;diff=21586</id>
		<title>Реализация запроса в дереве отрезков сверху</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%B2%D0%B5%D1%80%D1%85%D1%83&amp;diff=21586"/>
				<updated>2012-04-30T05:25:33Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.169.214: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данная операция позволяет выполнять запросы на [[Дерево отрезков. Построение|дереве отрезков]], причем алгоритм запускается от корня и рекурсивно идет сверху вниз.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Пусть есть уже [[Дерево отрезков. Построение|построенное дерево отрезков]]  и идет запрос на отрезке &amp;lt;tex&amp;gt;[a .. b]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл:123.jpg|right|380px|thumb|Пример дерева отрезков]]&lt;br /&gt;
&lt;br /&gt;
Будем передавать в качестве параметров рекурсий следующие переменные:&lt;br /&gt;
* &amp;lt;tex&amp;gt;node&amp;lt;/tex&amp;gt; {{---}} номер(в массиве с деревом отрезков) текущей вершины дерева.&lt;br /&gt;
* &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;  {{---}} левая и правая границы запрашиваемого отрезка.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; {{---}} это левая и правая границы отрезков, за которые &amp;quot;отвечает&amp;quot; наша вершина, причем левые границы обоих отрезков - включительно, а правые - нет. В дальнейшем будем называть подобную структуру полуинтвервалом.&lt;br /&gt;
&lt;br /&gt;
Запустим рекурсивную процедуру от всего отрезка(то есть от корневой вершины).&lt;br /&gt;
&lt;br /&gt;
Для текущего состояния проверяем следующие условия :&lt;br /&gt;
&lt;br /&gt;
* Если текущий полуинтервал не пересекается с искомым, то возвращаем нулевое значение.&lt;br /&gt;
''Например'': текущий &amp;lt;tex&amp;gt;[1..3)&amp;lt;/tex&amp;gt;, а искомый &amp;lt;tex&amp;gt;[3 .. 5)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* Текущий полуинтервал совпадает, то возвращаем значение в текущей вершине.&lt;br /&gt;
''Например'': текущий и искомый &amp;lt;tex&amp;gt;[2..4)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* Иначе переходим к рекурсивным вызовам функций от детей вершины. При этом в зависимости от типа запроса возвращаем значение на текущем отрезке, как некоторую функцию от результатов выполнения на детях.&lt;br /&gt;
''Замечание:''&lt;br /&gt;
&lt;br /&gt;
При передаче новых параметров следует изменять не только границы, за которые отвечает текущая вершина, но и границы запрашиваемого полуинтервала, чтобы на последующих шагах произошло полное совпадение полуинтервалов.&lt;br /&gt;
&lt;br /&gt;
Так как каждый полуинтервал разбивается не более, чем на &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; полуинтервал (поскольку на каждом уровне дерева может быть не более двух полуинтервалов из разбиения, а всего уровней &amp;lt;tex&amp;gt;\log n&amp;lt;/tex&amp;gt; ), то данная реализация выполняется за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
Рассмотрим данный алгоритм на примере задачи RSQ(запрос суммы на отрезке).&lt;br /&gt;
&lt;br /&gt;
При этом сумма на текущем отрезке (в случае вызова рекурсий от детей) равна сумме результатов выполнения операций на этих детях.&lt;br /&gt;
&lt;br /&gt;
Пусть дерево содержит &amp;lt;tex&amp;gt;8&amp;lt;/tex&amp;gt; листьев и запрашиваемая сумма - это отрезок &amp;lt;tex&amp;gt;[1 .. 4]&amp;lt;/tex&amp;gt;( полуинтервал &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Рассмотрим данную рекурсию:&lt;br /&gt;
&lt;br /&gt;
*Текущий полуинтервал &amp;lt;tex&amp;gt;[0 .. 8)&amp;lt;/tex&amp;gt;, он больше &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt; =&amp;gt; переходим по рекурсивным вызовам на &amp;lt;tex&amp;gt;[0 .. 4)&amp;lt;/tex&amp;gt;  и &amp;lt;tex&amp;gt;[4 .. 8)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;[0 .. 4)&amp;lt;/tex&amp;gt; выходит за границы&amp;lt;tex&amp;gt; [1 .. 5)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;[4 .. 8)&amp;lt;/tex&amp;gt; выходит за границы &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt; =&amp;gt; переходим по рекурсивным вызовам на &amp;lt;tex&amp;gt;[0 .. 2)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;[2 .. 4)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;[4 .. 6)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;[6 .. 8)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;[0 .. 2)&amp;lt;/tex&amp;gt; выходит за границы &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt; =&amp;gt; переходим в листья &amp;lt;tex&amp;gt;0, 1 &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;[2 .. 4)&amp;lt;/tex&amp;gt; целиком внутри &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt; =&amp;gt; возвращаем значение в &amp;lt;tex&amp;gt;[2 .. 4)&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;[6 .. 8)&amp;lt;/tex&amp;gt; не пересекается с &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt; =&amp;gt; возвращаем нулевое значение; &amp;lt;tex&amp;gt;[4 .. 6)&amp;lt;/tex&amp;gt; выходит за границы &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt; =&amp;gt; переходим к листьям &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*листья &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; не пересекается с полуинтервалом &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt; =&amp;gt; возвращаем нулевое значение, а листья &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; целиков внутри &amp;lt;tex&amp;gt;[1 .. 5)&amp;lt;/tex&amp;gt; =&amp;gt; возвращаем значения в этих листьях.&lt;br /&gt;
&lt;br /&gt;
==Реализация==&lt;br /&gt;
Рассмотрим реализацию задачи RSQ.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  int get_sum (int node, int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
        // Используем в реализаций полуинтервалы &lt;br /&gt;
        &lt;br /&gt;
        l = tree[node].left;&lt;br /&gt;
        r = tree[node].right; &lt;br /&gt;
        if [l, r) &amp;lt;tex&amp;gt;\bigcap&amp;lt;/tex&amp;gt; [a, b) == &amp;lt;tex&amp;gt; \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
            return 0;&lt;br /&gt;
        if [l, r) == [a, b)&lt;br /&gt;
            return tree[node];&lt;br /&gt;
        int m = (l + r) / 2;&lt;br /&gt;
        return get_sum (node * 2 + 1, a, min(b, m))&lt;br /&gt;
            + get_sum (node * 2 + 2, max(a, m), b);&lt;br /&gt;
  } &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&lt;br /&gt;
[http://e-maxx.ru/algo/segment_tree MAXimal :: algo :: Дерево отрезков]&lt;br /&gt;
&lt;br /&gt;
[http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2  Дерево отрезков — Википедия]&lt;br /&gt;
&lt;br /&gt;
[http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006 Визуализатор дерева отрезков]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Дерево отрезков]]&lt;/div&gt;</summary>
		<author><name>109.188.169.214</name></author>	</entry>

	</feed>