在Union-Find结构中分析m个运算的时间复杂度

时间:2018-06-23 21:43:57

标签: data-structures time-complexity union-find

任务是在“查找”和“联合”的Union-Find结构中找到m个操作的最坏情况下的时间复杂度,即所有“联合”操作都发生在所有“查找”操作之前。

联合查找结构以n个不相交的集合开始,每个集合包含一个元素。而且,每个集合都表示为一棵树,并且该结构使用路径压缩和逐级并集。

我在想的是,首先,所有联合操作将合计为O(log(n)),因为每个联合操作都取O(1),并且发生的此类操作最多为log(n)个。

此后,如果我们查看find元素,则对于每个元素,第一个查找将采用O(log(n)),但是下一次,它将对其路径中的每个元素采用O(1)。因此所需的时间少于O(m * log(n))。

我不确定如何从这里继续。我认为可能会这样:

log(n)+ log(n / 2)+ log(n / 4)+ .... = log(n)* log(n)

因为每次我们需要走的路径的级别变短。

但是。我不确定,也看不到在这里使用m参数。 也许在分析中还需要使用Ackerman逆函数,但我不知道怎么做。

1 个答案:

答案 0 :(得分:1)

“查找”操作(FindSet)

  • 跟随指针从v到树的“根”以找到v的集合标识符
  • 当递归调用返回集合标识符时,每个节点将其指针从其父节点更改为根节点,从而压缩树
  • “查找”操作期间不会更新树的等级(树的高度上限)

“联合”操作

  • 对于每个集合或“树”,维持一个等级,该等级是树的高度的上限
  • 具有较小等级(较短树)的根指向具有较大等级(更矮树)的根
  • 让树木“矮”
  • 如果两棵树的等级相等,则选择一棵树指向另一棵树。然后将树的等级加1

时间复杂度

  • 我们将执行O(E)“查找”和“联合”操作
  • 我们执行V MakeSet操作
  • “查找”,“联合”和MakeSet花费α(V)时间(阿克曼函数的倒数,增长非常缓慢)
  • 这给了我们O((V + E)α(V))
  • | E | > = | V | -1,因此“联合查找”取O(Eα(V))
  • α(V)在O(log V)中,而在O(log E)中
  • 因此,Union-Find结构的时间复杂度为O(E log E)或O(E log V)