<?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=217.66.156.244&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=217.66.156.244&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/217.66.156.244"/>
		<updated>2026-06-11T00:42:41Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B0%D0%B7%D1%8B_%D0%B2_%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%BE%D0%B8%D0%B4%D0%BE%D0%B2&amp;diff=68090</id>
		<title>Алгоритм построения базы в объединении матроидов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B0%D0%B7%D1%8B_%D0%B2_%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%BE%D0%B8%D0%B4%D0%BE%D0%B2&amp;diff=68090"/>
				<updated>2018-12-28T11:07:31Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.156.244: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=&lt;br /&gt;
Даны [[Определение матроида|матроиды]] &amp;lt;tex&amp;gt;M_1 = (S, \mathcal{I}_1), \ldots ,(S, \mathcal{I}_k)&amp;lt;/tex&amp;gt;. Необходимо найти максимальное по мощности [[Определение матроида#def_matroid|независимое множество]] в объединении &amp;lt;tex&amp;gt;M_1\ldots M_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Объединение матроидов''' (англ. ''matroid union'') &amp;lt;tex&amp;gt;M = (S,\mathcal{I}) = \bigcup\limits_{k=1}^{n}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M_i = (S,\mathcal{I}_i)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
Эта задача [[Объединение матроидов, проверка множества на независимость#Проверка множества на независимость| сводится к пересечению матроидов]], однако есть другой способ её решить. &lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;I_i \in \mathcal{I}_i&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;i = 1\ldots k&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;I_i \cap I_j = \emptyset&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;i \neq j&amp;lt;/tex&amp;gt;. Определим [[Граф замен|граф замен]]: для каждого &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt; построим [[Основные определения теории графов#defBiparateGraph|двудольный ориентированный граф]] &amp;lt;tex&amp;gt;D_{M_i}(I_i)&amp;lt;/tex&amp;gt; так, что в левой доле находятся вершины из &amp;lt;tex&amp;gt;I_i&amp;lt;/tex&amp;gt;, а в правой — вершины из &amp;lt;tex&amp;gt;S \setminus I_i&amp;lt;/tex&amp;gt;. Построим ориентированные ребра из &amp;lt;tex&amp;gt;y \in I_i&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;x \in S \setminus I_i&amp;lt;/tex&amp;gt;, при условии, что &amp;lt;tex&amp;gt;(I_i \setminus y) \cup x \in \mathcal{I}_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объединим все &amp;lt;tex&amp;gt;D_{M_i}(I_i)&amp;lt;/tex&amp;gt; в один граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, который будет суперпозицией ребер из этих графов. Пусть для каждого &amp;lt;tex&amp;gt;i:&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;F_i&amp;lt;/tex&amp;gt; {{---}} множество элементов &amp;lt;tex&amp;gt;s \notin I_i&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;I_i \cup {s} \in \mathcal{I}_i&amp;lt;/tex&amp;gt;. Определим &amp;lt;tex&amp;gt;I = I_1 \cup \ldots \cup I_k&amp;lt;/tex&amp;gt;,  &amp;lt;tex&amp;gt;F = F_1 \cup \ldots \cup F_k&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathcal{I} = \mathcal{I}_1 \cup \ldots \cup  \mathcal{I}_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нам известно, что объединение матроидов — матроид. При поиске базы матроида используется жадный алгоритм. На каждом шаге мы выбираем элемент не из текущего множества в новом графе замен &amp;lt;tex&amp;gt;D_{M_i}(I_i)&amp;lt;/tex&amp;gt; ([[Алгоритм построения базы в объединении матроидов#th_1|следующая теорема]] отвечает на вопрос, как представить это в графе). Здесь мы обозначим текущее множество как &amp;lt;tex&amp;gt;I&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда нужно найти такой элемент &amp;lt;tex&amp;gt;s \in S \setminus I&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;I \cup s&amp;lt;/tex&amp;gt; — снова независимо.&lt;br /&gt;
Все наши кандидаты находятся в &amp;lt;tex&amp;gt;S \setminus I&amp;lt;/tex&amp;gt; . Если мы найдем путь из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S \setminus I&amp;lt;/tex&amp;gt;, то элемент &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, которым путь закончился, можно будет добавить в &amp;lt;tex&amp;gt;I&amp;lt;/tex&amp;gt;.&lt;br /&gt;
То есть шаг жадного алгоритма заключается в создании нового &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и поиске такого пути.&lt;br /&gt;
&lt;br /&gt;
Это подразумевает, что максимальное независимое множество в &amp;lt;tex&amp;gt; \mathcal{I} = \mathcal{I}_1 \cup \ldots \cup  \mathcal{I}_k&amp;lt;/tex&amp;gt; мы можем найти за полиномиальное время (жадно наращивать независимое множество в &amp;lt;tex&amp;gt;M = M_1 \cup \ldots \cup M_k&amp;lt;/tex&amp;gt;). Cunningham&amp;lt;ref&amp;gt;Alexander Schrijver. Combinatorial Optimization. Polyhedra and Efficiency, Volume A-C, стр.732&amp;lt;/ref&amp;gt; разработал алгоритм, которым за &amp;lt;tex&amp;gt;O((n^{(3/2)} + k)mQ + n^{(1/2)}km)&amp;lt;/tex&amp;gt; можно найти максимальное независимое множество в &amp;lt;tex&amp;gt; \mathcal{I} = \mathcal{I}_1 \cup \ldots \cup  \mathcal{I}_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; максимальный размер множества в &amp;lt;tex&amp;gt; \mathcal{I} = \mathcal{I}_1 \cup \ldots \cup  \mathcal{I}_k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; размер подмножества и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; время, необходимое, чтобы определить принадлежит ли множество &amp;lt;tex&amp;gt; \mathcal{I}_j&amp;lt;/tex&amp;gt; для каждого &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
  &amp;lt;tex&amp;gt;J&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
  '''for''' &amp;lt;tex&amp;gt;i \leftarrow 0&amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
      построить [[Граф замен|граф замен]] &amp;lt;tex&amp;gt;D_{M_i}(I_i)&amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''if''' &amp;lt;tex&amp;gt;I_i + s \in \mathcal{I}_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
          &amp;lt;tex&amp;gt;J \leftarrow I_i + s&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th_1&lt;br /&gt;
|statement=&lt;br /&gt;
Для любого &amp;lt;tex&amp;gt;s \in S \setminus I&amp;lt;/tex&amp;gt; имеем &amp;lt;tex&amp;gt;I \cup s \in \mathcal{I} \Leftrightarrow &amp;lt;/tex&amp;gt; существует ориентированный путь из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; по ребрам графа &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть существует путь из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; — самый короткий такой путь. Запишем его вершины как {&amp;lt;tex&amp;gt;s_0, s_1, \ldots s_p&amp;lt;/tex&amp;gt;}. &amp;lt;tex&amp;gt;s_0 \in F&amp;lt;/tex&amp;gt;, так что не умаляя общности можно сказать, что &amp;lt;tex&amp;gt;s_0 \in F_1&amp;lt;/tex&amp;gt;. Для каждого &amp;lt;tex&amp;gt;j = 1\ldots k&amp;lt;/tex&amp;gt; определим множество вершин &amp;lt;tex&amp;gt;S_j =&amp;lt;/tex&amp;gt; {&amp;lt;tex&amp;gt;s_i, s_{i+1}:(s_i, s_{i+1}) \in D_{M_j}(I_j)&amp;lt;/tex&amp;gt;}, где &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; пробегает от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;p - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Положим, что &amp;lt;tex&amp;gt;I'_1 = (I_1 \oplus S_1) \cup \{s_0\}&amp;lt;/tex&amp;gt;, для всех &amp;lt;tex&amp;gt;j &amp;gt; 1&amp;lt;/tex&amp;gt; положим &amp;lt;tex&amp;gt;I'_j = (I_j \oplus S_j)&amp;lt;/tex&amp;gt;. Ясно, что &amp;lt;tex&amp;gt;\cup _j I'_j = I + s&amp;lt;/tex&amp;gt;. Для того, чтобы показать независимость &amp;lt;tex&amp;gt;I + s&amp;lt;/tex&amp;gt; в объединении матроидов нужно показать, что &amp;lt;tex&amp;gt;I'_j \in J_j&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;. Заметим, что так как мы выбирали путь &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; таким, что он будет наименьшим, для каждого &amp;lt;tex&amp;gt;j &amp;gt; 1&amp;lt;/tex&amp;gt; существует единственное паросочетание между элементами, которые мы добавляли и удаляли, чтобы сконструировать &amp;lt;tex&amp;gt;I'_j = I_j \oplus S_j&amp;lt;/tex&amp;gt;. Так как паросочетание единственно, &amp;lt;tex&amp;gt;I'_j \in J_j&amp;lt;/tex&amp;gt;. Аналогично &amp;lt;tex&amp;gt;s_0 \in F_1&amp;lt;/tex&amp;gt;, значит &amp;lt;tex&amp;gt;I'_1 \in J_1&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;I + s&amp;lt;/tex&amp;gt; независимо в объединении матроидов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть нет пути из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; по ребрам &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Тогда пусть существует множество &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, состоящее из вершин &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, из которого мы можем достичь &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;T = \{x, \exists x \leadsto s\}&amp;lt;/tex&amp;gt; по допущению &amp;lt;tex&amp;gt;F\cap T = \varnothing&amp;lt;/tex&amp;gt;. Утверждается, что для всех &amp;lt;tex&amp;gt;i : |I_i \cap T| = r_i(T)&amp;lt;/tex&amp;gt;(что означает, что &amp;lt;tex&amp;gt;I_i \cap T&amp;lt;/tex&amp;gt; — максимальное подмножество &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, независимое в &amp;lt;tex&amp;gt;M_i&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Предположим, что это не так. &amp;lt;tex&amp;gt;|I_i \cap T| = r_i(I_i\cap T) \leqslant r_i(T)&amp;lt;/tex&amp;gt;, это возможно только если &amp;lt;tex&amp;gt;|I_i \cap T| &amp;lt; r_i(T)&amp;lt;/tex&amp;gt;. Значит существует такой &amp;lt;tex&amp;gt;x \in T \cap (S \setminus I_i)&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;(I_i \cap T) + x \in J_i&amp;lt;/tex&amp;gt;. Но &amp;lt;tex&amp;gt;x \notin F&amp;lt;/tex&amp;gt; (по предположению вначале доказательства), значит &amp;lt;tex&amp;gt;I_i + x \notin J_i&amp;lt;/tex&amp;gt;. Из этого следует, что &amp;lt;tex&amp;gt;I_i + x&amp;lt;/tex&amp;gt; содержит единственный цикл. Значит существует &amp;lt;tex&amp;gt;y \in I_i - T&amp;lt;/tex&amp;gt;, такой что &amp;lt;tex&amp;gt;I_i + x - y \in J_i&amp;lt;/tex&amp;gt;. Получается, что &amp;lt;tex&amp;gt;(y, x)&amp;lt;/tex&amp;gt; — ребро в &amp;lt;tex&amp;gt;D_{M_i}(I_i)&amp;lt;/tex&amp;gt; и оно содержит этот &amp;lt;tex&amp;gt;y \in T&amp;lt;/tex&amp;gt;, что противоречит тому как был выбран &amp;lt;tex&amp;gt;y \in I_i \setminus T&amp;lt;/tex&amp;gt;. Следовательно для всех &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; нам известно : &amp;lt;tex&amp;gt;|I_i \cap T| = r_i(T)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
У нас есть &amp;lt;tex&amp;gt;s \in T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(I + s) \cap T = (\cup I_i + s)\cap T = \cup(I_i \cap T) + s&amp;lt;/tex&amp;gt; . Из определния функции [[Определение матроида#def_rank_of_matroid|ранга]] объединения матроидов имеем : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;r_M(I + s) \leqslant (|(I + s)\setminus T| + \sum\limits_{k=1}^{n}r_i(T))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;r_M(I + s) \leqslant |(I + s)\setminus T| + \sum\limits_{k=1}^{n} |I_i \cap T| = |I\setminus T| + \sum\limits_{k=1}^{n} |I_i \cap T| = |I| &amp;lt; |I + s|&amp;lt;/tex&amp;gt; &lt;br /&gt;
и значит &amp;lt;tex&amp;gt;(I + s) \notin J&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;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
[https://math.mit.edu/~goemans/18438F09/lec13.pdf Michel X. Goemans. Advanced Combinatorial Optimization. Lecture 13]&lt;br /&gt;
&lt;br /&gt;
Alexander Schrijver. Combinatorial Optimization. Polyhedra and Efficiency, Volume A-C, {{---}} Springer, 2004, {{---}} стр.732&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Матроиды]]&lt;br /&gt;
[[Категория:Объединение матроидов]]&lt;/div&gt;</summary>
		<author><name>217.66.156.244</name></author>	</entry>

	</feed>