Даны два k-way дерева, T1 и T2. Если любые два узла (A, B) из T1 имеют свойство, что узел B является потомком A, и эта связь поддерживается во втором дереве T2, то T1 эквивалентно T2. K-путь дерева определяется как дерево, в котором узел может иметь до k ветвей в узле. Определите, эквивалентны ли два k-way дерева.
Любые идеи относительно очень эффективного алгоритма с точки зрения как времени, так и пространства, и побейте его, будут оценены.
Например, T1 и T2 эквивалентны.
T1:
n1
/ | \
n2 n3 n4
/ \
n5 n6
/ | \
n7 n8 n9
\
n12
T2:
n10
/ | \
n3 n6 n2
/ | | \
n15 n9 n0 n7
Моя попытка:
Составить список смежности T1: n1: {n2, n3, n4}, n2: {n5, n6}, n3: {}, n4: {}, n5: {}, n6: {n7, n8, n9}, n9: {n12 }, n12: {}
Составить список смежности T2: n10: {n3, n6, n2}, n6: {n9}, n2: {n0, n7}, ...
- Go для каждого узла в T2 и проверьте, находятся ли они в T1. Сохраните эти узлы.
- Создайте все возможные пары из этих узлов.
- Go для каждой пары, начните с одного узла в T1 и выполните команду dfs, чтобы увидеть, достигает ли он второго узла.
Например, ,
Pick (n9, n6). Используйте список смежности T1, чтобы увидеть, достижим ли n6 из n9. Это невозможно. В какой-то момент мы доберемся до пары (n6, n9) и начнем с n6. Доступен ли n9 из n6? Да.
Худшее пространство :
- Предположим, num_nodes в T1 = num_x
- Предположим, что num_nodes в T2 = num_y
- В худшем случае пробел: O (num_x + num_y + (num_y * (num_y-1)) // // последний член для пар
Худшее время :
- Время создания всех пар: O (num_y * (num_y-1))
- Время, чтобы определить, достижимы ли два узла в T1, связанных в T1: O (высота T1) = O (h)
- Общее время = O (h * num_y * (num_y-1))
Возможно, чтобы определить, достижимы ли два узла в T1, тур Эйлера и rmq может достичь его в O (1)