Union Find算法中的特殊序列

招RD和QA 2014-12-03 01:49:59
其复杂度为O(n*G(n)),同时教材上有一段话,对于任意的c,都存在一个特殊的Unoin-Find指令序列,
使得执行该序列的时间复杂度>cn,即算法在最坏情况下不是线性的。

问下这是个什么样的序列?
...全文
274 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
熊熊大叔 2014-12-05
  • 打赏
  • 举报
回复
引用 5 楼 Viper 的回复:
我看的那个材料中说了这么一句话,“Aho书中构造了一个特殊的例子,它对于任意的c, 执行O(n)条Unoin-Find指令的时间复杂度均大于cn,证明略” 所以就想问问这个特殊的序列是什么样的。
证明有两类,一类是构造性证明,也就是找到一个实际的例子,证明这种情况存在。另一种是非构造性证明,也就是说我肯定这种情况存在,但我也不知道它是什么样子。非构造性证明的典型例子就是欧几里德证明不存在最大的质数。 4楼已经说了,这个问题用构造性证明是很难的,并给你介绍了一篇非构造性证明。如果你一定要找到一个构造性证明,恐怕得去找业界大牛,比如俄罗斯斯捷克洛夫数学研究所什么的去探讨了。
招RD和QA 2014-12-05
  • 打赏
  • 举报
回复
楼上的,我引用的材料中已经说了,Aho构造了一个例子,也就是说这个例子是已经构造出来的,我就是想知道这个例子是什么。
招RD和QA 2014-12-05
  • 打赏
  • 举报
回复
楼上的,我引用的材料中已经说了,Aho构造了一个例子,也就是说这个例子是已经构造出来的,我就是想知道这个例子是什么。
招RD和QA 2014-12-04
  • 打赏
  • 举报
回复
上面的代码中很多“=”号没打出来。
招RD和QA 2014-12-04
  • 打赏
  • 举报
回复
是O(n)条Union和Find指令,Aho的算法, Union(i,j) /*i,j可以是任意结点,不一定是根结点*/ aFind(i) /*a是含结点i的树的根结点编号*/ ← bFind(j) /*b是含结点j的树的根结点编号*/ ← if a=b return a; /*i,j在同一个集合中,无需进行Union */ if rank[a]>rank[b] then {p[b]a; return a;} /*根结点为a的树‘深’,b指向a*/ ← else { p[a]b; /*根结点为b的树‘深’或相等,a指向b*/ ← if rank[a]=rank[b] then rank[b]增1; return b;} /*注意,rank的改动只在:两树相等时,新根结点rank才被增1*/ Find是做路径压缩的。 想不明白现在这样的算法会在项目中使用嘛?这种数据结构只支持Union和Find,都没法遍历树的。
熊熊大叔 2014-12-04
  • 打赏
  • 举报
回复
这里说的是union算法还是find算法,用的哪种实现?
招RD和QA 2014-12-04
  • 打赏
  • 举报
回复
我看的那个材料中说了这么一句话,“Aho书中构造了一个特殊的例子,它对于任意的c, 执行O(n)条Unoin-Find指令的时间复杂度均大于cn,证明略” 所以就想问问这个特殊的序列是什么样的。
FancyMouse 2014-12-04
  • 打赏
  • 举报
回复
>想不明白现在这样的算法会在项目中使用嘛?这种数据结构只支持Union和Find,都没法遍历树的。 直接用的情况比较少(虽然我在公司里用了,但是也就我一个人在那里用),但是要牵涉到某些固定算法(Kruskal,LCA查询等等)那间接用到的可能性就大很多了。 原问题。rank+路径压缩的话估计要把原来的均摊Omega(alpha(n))的证明搬出来大半了。因为有O(alpha(n))的均摊上界,所以要举反例的话n的增长速度肯定要比A还要快,这种函数估计都不好找,更不要说举反例了,可能这么做真的找出来的例子还不如Tarjan原证明里的反例简单。Tarjan的反例在这篇论文里:Efficiency of a Good But Not Linear Set Union Algorithm

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧