1.堆中的路径
Problem
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。详细描述
Analysis
- 首先建堆有两种方式:(1)元素先用数组按顺序存放好使之满足完全二叉树结构,要构造一个堆,那么我们只需要左右子树为堆,然后调整当前堆为堆即可。(2)首先堆为空,然后按照完全二叉树的结构每次插入一个节点,然后调整当前树为一个堆,即找出插入节点应该在的位置进行插入,与插入排序类似。因为建堆的时间复杂度为O(logN),有N个元素,时间复杂度为O(NlogN)。根据题目描述只能选择第二种建堆方式。
- 建堆过程中可以使用哨兵,如果是最小堆,则H[0]定义为一个足够小的值使得堆元素都大于它。同理可推最大堆应选用一个足够大的值。
Code
1 |
|
2.File Transfer
Problem
We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any computer on the network to any other?详细描述
Analysis
- 考察集合的并查集,即查找集合中的元素,求集合并集。
- 思路是数组下标i表示各台电脑,s[i]表示电脑的根,如果电脑属于同一个集合那么两台电脑相互连通,根为负数证明该节点是根节点,这里可以利用根节点的根s[root]表示树高的负数或者表示树规模的负数,都称为按秩归并,进行路径压缩可以加快查找效率。
Code
1 |
|
声明:本站所有文章均为原创或翻译,遵循署名 - 非商业性使用 - 禁止演绎 4.0 国际许可协议,如需转载请确保您对该协议有足够了解,并附上作者名 (Tsukasa) 及原文地址