497
правок
Изменения
→Шаг 5: удаление двойных дуг
=== Шаг 5: удаление двойных дуг ===
Разбираемся с двойными дугами (на этом примере их три). Для этого мы должны выяснить , сколько начальных символов таких дуг совпадает. Совпадать может от одного до нескольких символов, или даже все. Проверять их все по очереди нельзя (это даст квадратичное время). Если дуги совпадают полностью, тогда ничего не делаем, удаляем одну из копий и всё. Если начало для двух дуг совпадает только частично, тогда нужно делать для них общее начало, а ветки , которые на концах , снова развести по разным деревъям деревьям (для этого можно во время снияния слияния запомнить их начальный цвет или просто сохранить ссылки на исходные ветки).
[[Файл:Tree101232merged.png|500px]]
Для примера как это сделать возмём возьмём строку <tex>10010010101000</tex>:
[[Файл:Treestep5_1.jpg|550px]]
Для того чтобы узнать общее начало двойной дуги, нужно взять одну чётную и одну нечётную на дереве, для которых родителем является конец нашей двойной дуги. Например , на рисунке выше двойная дуга <tex>(1)</tex>, (конец помечен зелёным - ) является общим родителем для вершин <tex>3</tex> и <tex>6</tex>. Чтобы узнать , на каком расстоянии будет расслаиваться двойная дуга, надо увеличить номера вершин на еденицу единицу и найти их родителя. Он будет находится находиться на единицу ближе к корню (и путь у вершин будет одинаковой строкой, не считая размера). Родитель вершин <tex>4</tex> и <tex>7</tex> помечен жёлтым, он находится на расстоянии <tex>1</tex> от корня, следовательно , дуга <tex>(1)</tex> должна расслаиваться в двух символах от корня, то есть обе дуги совпадают и их просто надо слить.
Разберём дуги по порядку:
* <tex>(1)</tex> расслоение находится на расстоянии два от корня, то есть дуга не расслаивается.
* <tex>(2)</tex> конец является родителем вершин <tex>2</tex>, <tex>7</tex>. Родитель <tex>3</tex>, <tex>8</tex> после слияния дуги <tex>(1)</tex>, находится на глубине <tex>2</tex> символа. Значит , дуга <tex>(2)</tex> расслаивается на глубине <tex>3</tex> символа, то есть так же не расслаивается. Дугу <tex>(2)</tex> нужно вычислять после обработки дуги <tex>(1)</tex>, потому что конец дуги <tex>(1)</tex> после обработки может оказаться на разной высоте, в зависимости от того на каком символе она расслоилась.* <tex>(3)</tex> конец является родителем <tex>2</tex>, <tex>9</tex>. Родитель <tex>3</tex>, <tex>10</tex> находится на расстоянии <tex>3</tex>, а наше расслоение на на расстоянии <tex>4</tex>, то есть сливается первый символ двойной дуги. Дугу <tex>(3)</tex> надо вычислять после дуги <tex>(2)</tex>. Потому что если на дуге <tex>(2)</tex> появится разветвление, то компоненты дуги <tex>(3)</tex> придётся растащить по разным веткам дерева и сравнивать их будет не нужно.
* <tex>(4)</tex> конец является родителем <tex>1</tex>, <tex>4</tex>. Расслаивается на втором символе.
* <tex>(5)</tex> конец является родителем <tex>0</tex>, <tex>3</tex>. Дугу <tex>(5)</tex> можно обрабатывать только после дуги <tex>(4)</tex>, так как от неё будет зависеть глубина расслояниярасслоения.
Дерево после обработки: