使用数组实现 4 堆
当使用数组存储所有元素时,你使用什么样的数学来遍历4堆? 具体来说,如何找到特定叶子的父节点的索引?
假设我有以下数组:
0|1|2|3|4|5|6|7|8|9|10|... 等等,
然后根据该数组构建堆,其中 1 为根,2 为根。 .5 它的子级,6..9 2 的子级等等。
如果我需要找到(例如)6 的父级,我到底需要什么数学?
What kind of math do you use to traverse the 4-heap when using an array to store all the elements? Specifically, how do you find the index of a parent node to a specific leaf?
Let's say I have the following array:
0|1|2|3|4|5|6|7|8|9|10|... etc.
with the heap then constructed from that with 1 being the root, 2..5 its children, 6..9 2's children etc.
What exactly is the math i need if I need to find (for example) the parent of 6?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
首先进行简单的观察。 根位于 1,因此所有子节点都从 2 开始。 在索引 i 之前,堆中有 i-1 个顶点(记住,索引 0 不是顶点!),每个顶点都有 4 个子节点。 因此,i第 个孩子将在 2+4*(i-1) 到 2+4*i-1 em> 例如,1 的子级是 2+4*0=2 到 2+4*0+3=5。
输出
无孔,请参阅。
如果first_son(i)=2+4i 且last_son(i)=2+4i+3=4(i+1)+1,我们有father(n)=floor((n-2)/4)+1 。 (+1 是让数组从 1 开始)
让我们测试一下:
输出:
First a simple observation. Root is at 1, so all children begin at 2. Before index i there are i-1 vertices (remember, index 0 is not a vertex!) in the heap, each has 4 children exactly. So ith children will be at 2+4*(i-1) to 2+4*i-1 for example, 1's children are 2+4*0=2 to 2+4*0+3=5.
output
No holes, see.
If first_son(i)=2+4i and last_son(i)=2+4i+3=4(i+1)+1, we have that father(n)=floor((n-2)/4)+1. (the +1 is to make the array to start at 1)
Let's test that:
Output:
查找任何子项的父项(1 除外,它没有父项):
查找父项的第一个和最后一个子项:
您可以在操作中看到这一点,因为在每个级别,您添加的元素数量是您添加的元素的四倍在上一级别中所做的事情:
例子有:
To find the parent of any child (other than 1, which has no parent):
To find the first and last child of a parent:
You can see this in operation since, at each level, you add four times as many elements as you did in the previous level:
Examples are:
您需要整数除法和乘法。
例如,6 的父级是
1+((6-1)/4) = 2
。5 的父级是
1+((5-1)/4) = 2
。10 的父级是
1+((10-1)/4) = 3
等。2 的子级为
2+4*(2-1)..(2+4*(3-1))-1 = 6..9
。You need integer division and multiplication.
For example, the parent of 6 is
1+((6-1)/4) = 2
.The parent of 5 is
1+((5-1)/4) = 2
.The parent of 10 is
1+((10-1)/4) = 3
, etc.2's children are
2+4*(2-1)..(2+4*(3-1))-1 = 6..9
.