我有n个大小为n_1,n_2,...,n_n的AVL树,因此sum(n_i)= n。 我可以在较大的线性时间内合并两个AVL。 我可以在多长时间内合并这些n树? 感谢任何帮助
答案 0 :(得分:0)
如果您有不同的树,那么您需要进行总共(k-1)次合并以将它们一起收集到一棵树中。所以问题是每次合并需要多长时间。
假设您采用的策略是始终将两个最小的树合并在一起。如果在执行此操作时有可用的m树,则第二小的树的大小将主导合并的运行时。此大小最多为(n - 1)/(k - 1),当最小的树只有一个元素而所有其他树都包含其中的所有元素时,就会发生这种情况。这意味着如果你进行k合并,费用将是
N - 1 N - 1 N - 1 N - 1
----- + ----- + ----- + ... + -----
K - 1 K - 2 K - 3 1
但这是(n-1)H(k-1),其中H(k-1)是(k-1)st harmonic number。整个表达式则为O(n log k),因此合并时完成的总工作量为O(n log k)。
然而,最重要的是,你必须有一些简单的方法在每个点找到两棵最小的树。这可以通过优先级队列来完成,该优先级队列按大小的降序存储树。您将有k-1轮从树中进行两次出列,然后进行一次入队,因此所有优先级队列操作的总时间为O(k log k)。这也是O(n log k),因此算法的总运行时间为O(n log k)。
我很确定你不能比这更好,因为你可以从他们自己的AVL树中的每个n个节点开始(k = n)。如果你可以比Ω(n log n)更快地合并,那么你可以通过构建通过合并所有较小树而形成的AVL树,然后在O中进行顺序遍历,仅使用比较来比Ω(n log n)排序更快(n log n) n)排序时间优于Ω(n log n),is known to be impossible。
希望这有帮助!