
发表日期: 2021-04-14 15:26:00 浏览次数:128
张北网站推广【张北办理400电话】张北SEO优化、张北微信公众号APP客户端小程序开发、张北网站托管、张北APP开发
河北省张家口市张北县地处河北省西北部,内蒙古高原南缘的坝上地区,境域东西109公里,南北67公里,东南部与崇礼区交界,桦皮岭为全县最高点,海拔2128米;北、中部地势平坦,向西北渐低,安固里淖为最低点,海拔1300米。全县总面积4185平方公里,辖18个乡镇、366个行政村、1167个自然村,总人口37.2万人。居民以汉族为主,占总人口的98%,还有蒙古族、回族、满族等。张北县是离京津地区最近的高原地区,夏天气候凉爽是避暑胜地。
张北县被列为第一批国家新型城镇化综合试点地区。 [1] 2019年11月,入选第二批节水型社会建设达标县(区)名单。 [2] 2020年2月29日,退出贫困县序列,正式脱贫“摘帽”。 [3] 2020年12月,入选河北省数字乡村试点地区名单。
在第(2)行,将n 减少1,实际上就是删除现在处于旧的A[n]中的最大元素。因为现在的根节点可能会违背偏序树属性,所以在第(3)行调用bubbleDown(A,1,n),它会递归地将违背偏序树属性的元素向下压,直到该元素到达一个不再小于它子节点的位置或是成为叶子节点,不管哪种情况,都不再会违反偏序树属性了。
void deletemax(int A[], int *pn)
{(1) swap(A, 1, *pn);(2) --(*pn);(3) bubbleDown(A, 1, *pn);
}复制代码图 5-49 用堆实现的优先级队列deletmax操作
假设对图5-45中的堆执行deletemax操作。在交换了A[1]和A[10]之后,将n 置为9。这样堆就变成了

在执行bubbleDown(A,1,9)时,会将child 置为2。因为A[2]≥A[3],所以在图5-48的第(3)行不用增加child 。然后,因为child≤n 而且A[1]<A[2],所以交换这两个元素,得到数组

接着调用bubbleDown(A,2,9)。这要求我们在第(2)行对A[4]和A[5]加以比较,比较的结果是前者更大。因此,在图5-48的第(4)行,child=4。又因为可知A[2]<A[4],所以交换这两个元素,并对如下数组调用bubbleDown(A,4,9)。

再下来要比较A[8]和A[9],结果后者更大,所以bubbleDown(A,4,9)的第(4)行有child=9。因为A[4]<A[9],所以再次进行交换,得到数组

随后调用bubbleDown(A,9,9)。在第(1)行将child 置为18,而且因为child<n 为假,第(2)行的第一个测试会失败。同样,第(4)行的测试也会失败,所以不用再进行交换或递归调用。这一数组现在已经是还原偏序树属性的堆了。
优先级队列堆实现的每次插入或deletemax操作的运行时间是O(logn)。要知道原因,首先考虑一下图5-47所示的insert程序。该程序前两步花的时间显然是O(1),此外还要加上对bubbleUp的调用所花的时间。因此,需要确定bubbleUp的运行时间。
粗略地讲,我们注意到每次bubbleUp递归调用自身时,就是离根节点更近了一个节点的位置。因为平衡偏序树的高度大约是log2n,所以递归调用的次数是O(log2n)。因为对bubbleUp的每次调用花的时间是O(1)外加递归调用的时间(如果有的话),所以总时间应该为O(logn)。
更严格地讲,设T (i )是bubbleUp(A,i)的运行时间,那么可以构建如下T (i )的递推关系。
依据。如果i=1,那么T(i )是O(1),因为很容易看出,在这种情况下,图5-46中的bubbleUp程序不会执行任何递归调用,只是执行了if语句的测试。
归纳。如果i>1,那么if语句的测试可能会失败,因为A[i ]不再需要继续上升了。若该测试成功,则花O(1)的时间执行swap,并以参数i /2(若i 为奇数则略小于i /2)递归调用bubbleUp一次。因此T(i )≤T(i /2)+O(1)。
所以可以说,对于某些常数a 和b,递推关系
T(1)=a
T(i )=T(i /2)+b, i>1,
能作为bubbleUp运行时间的上界。如果将T(i /2)展开,就得到,对每个j,有
T(i )=T(i /2 j )+bj (5.2)
如3.10节中那样,可以对j 的值加以选择,使得T(i /2j )最为简单。在这种情况下,可以令j 等于logi,这样一来i/2j=1。因此,(5.2)式就成了T(i )=a+b log2i,也就是说T(i )是O(logi )。因为bubbleUp的运行时间是O(logi ),所以插入操作的运行时间也是O(logi )。
现在考虑deletemax。从图5-49中可以看出,deletemax 的运行时间是O(1)加上bubbleDown的运行事件。对图5-48所示bubbleDown函数的分析基本上与对bubbleUp的分析相同。这里就不再赘述分析过程,直接得出bubbleDown和deletemax 的运行时间也是O(logn)这一结论。
1. 考虑图5-45中的堆,说明在下列情况下分别会发生什么。
(a) 插入3
(b) 插入20
(c) 删除最大元素
(d) 再次删除最大元素
2. 通过对i 的归纳证明(5.2)式。
3. 通过对违背偏序树属性的节点的深度进行归纳,证明图5-46中的bubbleUp函数可以正确地将有一处违背偏序树属性的树还原为具有偏序树属性的树。
4. 证明:如果A之前是大小为n-1的堆,那么insert(A,x,n)函数可以使A变为大小为n 的堆。
5. 通过对违背偏序树属性的节点的高度进行归纳,证明图5-48中的bubbleDown函数可以正确地将有一处违背偏序树属性的树还原为具有偏序树属性的树。
6. 证明:deletemax(A,n)可以让大小为n 的堆变为大小为n-1的堆。如果A之前不是堆,会发生什么?
7. 证明:bubbleDown(A,1,n)处理长度为n 的堆所花时间是O(logn)。
8. ** 随机选出不同优先级的n 个元素构成堆,该堆是偏序树的概率是多少?如果没法总结出一般规则,就编写递归函数计算这一表示为n 的函数的概率。
9. 实现偏序树不一定要使用堆。假设使用之前用于二叉树的常规的左子节点右子节点数据结构。展示如何使用这一结构实现bubbleDown、insert和deletemax函数。
10. * 二叉查找树也可以用作优先级队列的抽象实现。展示如何使用具有左子节点右子节点数据结构的二叉查找树实现插入和deletemax操作。这些操作在最坏情况下以及在一般情况下的运行时间分别是多少?
现在要介绍被称为堆排序的算法。它会分两个阶段为数组A[1..n]排序。在第一个阶段,堆排序会给A 偏序树属性。堆排序的第二个阶段会反复从堆中选出剩余元素中的最大元素,直到堆只由最小的元素构成,这样就完成了对数组A 的排序。

图 5-50 堆排序过程中数组A 的情况
图5-50展示了处于第二阶段的数组A。数组的开头部分具有偏序树属性,而剩下的部分则是以非递减次序排好序的元素。此外,已排序部分是数组中前n-i大的元素。在第二阶段,i的值可以从n减到1,从而让一开始为整个数组A的堆,最终减少到只剩下位于A[1]的最小元素。更详细地讲,第二阶段由如下步骤组成。
1. 将A[1..i]中最大元素A[1]与A[i ]交换。因为A[i+1..n]中所有元素都不小于A[1..i]中的元素,而且我们刚刚将A[1..i]中最大的元素移动到了位置i,所以可知A[i..n]是数组中前n-i-1大的元素,而且已经是排好次序的。
2. i 的值是递减的,每次将堆的大小减少1。
3. 通过下压根节点处的元素(就是刚移动到A[1]的元素),还原开头部分的偏序树属性。
考虑图5-45中的数组,它是具有偏序树属性的。这里从第二阶段的第一次迭代开始分析。在第一步中,要将A[1]与A[10]交换,得到:

第二步是将堆的大小减小为9,而第三步则是通过调用bubbleDown(1)还原前9个元素的偏序树属性。在这次调用中,A[1]和A[2]进行了交换。

接着,A[2]与A[4]进行了交换。

最后,A[4]和A[9]交换:

至此,A[1..9]具有了偏序树属性。
第二阶段的第二次迭代首先要交换A[1]中的元素18与A[9]中的元素5。在将5往下压到合适位置后,数组就成了

到这里,数组中最后两个元素已经是最大的两个元素,而且是已经排好次序的。
第二阶段会不断继续,直到完成对数组的排序。

张北网站推广【张北办理400电话】张北SEO优化、张北微信公众号APP客户端小程序开发、张北网站托管、张北APP开发
服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878