Дано очень большое n-арное дерево. Когда у корневого узла есть некоторая информация, которую он хочет передать всем своим дочерним элементам до конца с ограничением, что он может передавать информацию только одному из своих дочерних элементов за один раз (принимайте это как одну итерацию).
Теперь в следующей итерации дочерний узел может передать эту информацию только одному из своих дочерних элементов, и в то же время экземпляр родительского дочернего элемента, то есть root, может передать информацию одному из оставшихся дочерних элементов. Продолжая таким образом, мы должны найти минимальное количество итераций, необходимое для передачи информации всем узлам дерева.
Минимальное число итераций для дерева ниже — 6. Корень A сначала передает информацию в B. В следующей итерации A передает информацию в E, а B передает информацию в H и так далее.

Мы настоятельно рекомендуем свернуть браузер и попробовать это в первую очередь.
Это можно сделать с помощью пост-заказа. Идея состоит в том, чтобы учесть рост, и дети рассчитывают на каждый узел.
Если дочерний узел i принимает ci итераций для передачи информации ниже своего поддерева, то его родительский элемент будет принимать (ci + 1) итераций для передачи информации в поддерево с корнем в этом дочернем i.
Если у родителя больше детей, он будет передавать им информацию в последующих итерациях. Допустим, дочерние элементы родительского элемента принимают итерации c1, c2, c3, c4,…, cn для передачи информации в собственное поддерево. Теперь родительский элемент должен передавать информацию этим n дочерним элементам один за другим в n итерациях. Если родитель выбирает дочерний элемент i в i-й итерации, то родительский процесс будет выполнять (i + ci) итераций для передачи информации дочернему элементу i и всему его поддереву.
На любой итерации, когда родитель передает информацию дочернему элементу i + 1, потомки (от 1 до i), которые получили информацию от родителя уже на предыдущих итерациях, передают информацию дальше вниз на последующих итерациях, если какой-либо дочерний элемент (от 1 до i) имеет собственный ребенок дальше вниз.
Чтобы передать информацию всему дереву за минимальные итерации, необходимо убедиться, что полоса пропускания используется максимально эффективно (т. Е. Максимально проходимый ни один из узлов не должен передавать информацию дальше вниз в любой итерации)
Наилучшим из возможных сценариев было бы то, что в n-й итерации n различных узлов передают информацию своему дочернему элементу.
Узлы с высотой = 0: (тривиальный случай) Конечный узел не имеет дочерних элементов (передача информации не требуется), поэтому ни одна из итераций не будет нулевой.
Узлы с высотой = 1: здесь узел должен передавать информацию всем дочерним элементам один за другим (все дочерние узлы являются конечными, поэтому больше никакой информации не будет проходить дальше). Поскольку все дочерние элементы являются конечными, узел может передавать информацию любому дочернему элементу в любом порядке (выберите любого дочернего элемента, который еще не получил информацию). Одна итерация, необходимая для каждого дочернего элемента, и поэтому ни одна из итераций не будет дочерней. Таким образом, узел с высотой 1 с n дочерними элементами будет принимать n итераций.
Возьмите счетчик, инициализированный нулем, обведите все дочерние элементы и продолжайте увеличивать счетчик.
Узлы с высотой> 1. Предположим, что существует n дочерних элементов (от 1 до n), и минимальное число итераций для всех n дочерних элементов равно c1, c2,…., Cn.
Чтобы обеспечить максимальное количество узлов, участвующих в передаче информации в любой итерации, родитель должен 1-й передать информацию тому дочернему элементу, который примет максимальную итерацию, чтобы передать информацию далее в последующих итерациях. т. е. в любой итерации родитель должен выбрать потомка, который в дальнейшем получит максимальную итерацию. Это можно считать жадным подходом, когда родитель выбирает того ребенка 1-го, которому нужно максимальное количество итераций, чтобы все последующие итерации могли эффективно использоваться.
Если родительский узел работает любым другим способом, то, в конце концов, могут быть некоторые узлы, которые выполняются довольно рано, бездействуют, и поэтому пропускная способность не используется эффективно в дальнейших итерациях.
Если есть два дочерних элемента i и j с минимальными итерациями ci и cj, где ci> cj, то если родительский элемент выбирает дочерний элемент j 1st, то ни одна из итераций, необходимых родительскому элементу для передачи информации обоим дочерним элементам и их поддереву, не будет равна: max (1 + cj) , 2 + ci) = 2 + ci
Если родитель выбирает child i 1st, то ни одна из итераций, необходимых родителю для передачи информации обоим дочерним элементам и их поддереву, будет: max (1 + ci, 2 + cj) = 1 + ci (поэтому выбор ci дает лучший результат, чем выбор cj)
Это говорит о том, что родитель должен всегда выбирать child i с максимальным значением ci в любой итерации.
ТАК вот жадный подход:
сортировать все значения ci в порядке убывания,
скажем, после сортировки значения c1> c2> c3>…. > сп
возьмите счетчик c, установите c = 1 + c1 (для ребенка с максимальным числом итераций)
для всех детей от 2 до n, c = c + 1 + ci
тогда общее количество итераций, необходимых родителю, равно max (n, c)
Пусть minItr (A) будет минимальной итерацией, необходимой для передачи информации из узла A во все это поддерево. Пусть child (A) будет подсчетом всех дочерних элементов для узла A. Таким образом, рекурсивное отношение будет:
1. Get minItr(B) of all children (B) of a node (A) 2. Sort all minItr(B) in descending order 3. Get minItr of A based on all minItr(B) minItr(A) = child(A) For children B from i = 0 to child(A) minItr(A) = max ( minItr(A), minItr(B) + i + 1) Base cases would be: If node is leaf, minItr = 0 If node's height is 1, minItr = children count
Ниже приводится реализация вышеуказанной идеи.
|
Джава
|
Выход:
TestCase 1 - Minimum Iteration: 6 TestCase 2 - Minimum Iteration: 2 TestCase 3 - Minimum Iteration: 0 TestCase 4 - Minimum Iteration: 5 TestCase 5 - Minimum Iteration: 4 TestCase 6 - Minimum Iteration: 3 TestCase 7 - Minimum Iteration: 6 TestCase 8 - Minimum Iteration: 6 TestCase 9 - Minimum Iteration: 8
Эта статья предоставлена Анураг Сингх . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Минимальное расстояние для посещения всех узлов неориентированного взвешенного дерева
- Минимальный и максимальный узел, который лежит на пути, соединяющем два узла в двоичном дереве
- Подсчитайте узлы дерева, которые составляют панграмму при соединении с узлами поддерева
- Поддерево с минимальной цветовой разницей в двухцветном дереве
- Сумма всех узлов в двоичном дереве
- Поддерево всех узлов дерева, использующих DFS
- XOR всех узлов в поддереве данного узла
- Подсчитайте узлы в данном дереве, чей вес равен
- Произведение всех узлов в двоичном дереве
- Сумма всех граничных узлов двоичного дерева
- Количество узлов больше заданного значения в n-арном дереве
- Распечатать все листовые узлы n-арного дерева, используя DFS
- Преобразовать дерево в лес четных узлов
- XOR пути между любыми двумя узлами в двоичном дереве
- Распечатать узлы на нечетных уровнях дерева
0.00 (0%) 0 votes