算法导论 堆排序习题
来源:互联网 发布:网络与新媒体专业出国 编辑:程序博客网 时间:2024/06/05 22:58
1.怎样利用最大(小)堆构成的优先实现先进先出队列或者栈
开始看这道题没有弄清以什么优先,原来是先进先出队列只要保证先进来优先级高,栈保证后进来优先级高,然后每次弹出堆顶元素即可
2.如何在logN时间里删除一个元素
思路和如何在堆中增加一个元素是一样的,因为堆要的形状要保证是一颗完全二叉树,决定了增减操作只能在堆的尾部进行。
1.先把该元素和堆尾元素交换,并将堆大小减一
2.对该位置调整堆
3.在Nlogk时间里完成对K个有序链表的有序合并,N为所有元素的个数
1.首先将每个队列的队首元素提取出来,组建为一个最小堆,这里要注意,我们应该记录每个元素来自于哪一个队列
堆中元素应为这样<value,from>
耗时O(KlogK),看到有人说O(K)....应该是笔误
2.提取堆顶元素O(1)
3.从刚才出堆的元素来自的队列中添加一个元素到堆尾,调整堆耗时O(logK)
总耗时= O(KlogK)+O(NlogK)=O(NlogK)
4.Young氏矩阵,该矩阵行列均是有序的
问题1:用O(M+N)时间完成以下操作,M,N分别为该矩阵的行和列数
- 1.将最小元素从中删除,同时保持该性质
- 2.向不是满的矩阵中添加一个元素
- 3.查找一个元素是否在其中
问题2:证明利用该矩阵能在O(N^3)时间内完成对N^2个元素进行排序
考虑到书上的一个性质,当Y[M][N]<无穷大时是个满矩阵,好吧,我就不纠结到底这个排序是是升序还是降序了,应该是升序......
1.1有了升序的性质,那么很容易知道矩阵的右上角的元素肯定是最小的
那么每次将其提出,肯定要在剩下的元素中选一个最小的作为新矩阵的最小元素,这个元素为MIN{Y[1][2],Y[2][1]}产生,将两者较小的移到该地方
不难证明经过该操作后矩阵的性质还是满足的。这样每次要么向右移动一个单位,要么向下移动一个单位
然后转而将问题变为Y[M-1][N]或者Y[M][N-1]...直到最后只剩下一个元素,最后的时间复杂度为O(M+N)
1.2 同理向矩阵中欣添加元素的时候先把它添加到矩阵尾部,然后比较左边和上面的元素,取较大者交换之
这样就可以把问题由[M,N]规模变为[M-1,N]或[M,N-1]
1.3 想到这个要稍微转换一下思维,和右上角的元素比较,大,则把这行删掉,小,则把这一列删掉
ps:为什么比较排序的下界是O(NlogN)?
因为堆任意一个序列,排序有N!可能,解2^h>n!得到h>NlogN ,树的高度即需要比较的次数
- 算法导论 堆排序习题
- 算法导论习题6-堆排序
- 算法导论 习题6.2-5 用迭代法实现堆排序
- 算法导论 习题6.2-5 用迭代法实现堆排序
- 《算法导论》 - 第6章 - 堆排序 - 习题解答
- 算法导论 堆排序
- 算法导论--堆排序
- 【算法导论】 堆排序
- 算法导论-----堆排序
- 【算法导论】堆排序
- 算法导论-堆排序
- 堆排序--算法导论
- 算法导论:堆排序
- 算法导论:堆排序
- 【算法导论】堆排序
- 算法导论--堆排序
- 算法导论 堆排序
- 【算法导论】 堆排序
- js/json 数组的操作
- strchr,strstr--字符串
- 利用C#进行Socket通信编程之一
- android:windowSoftInputMode属性使用
- Java-对象多态性
- 算法导论 堆排序习题
- Otsu2D
- 分割数据
- 【Android入门1 概述】
- Android下拉刷新功能实现过程详解
- .net从将数据库中的数据导出到Excel格式的xml
- windbg技巧:列出当前进程所有装载的模块(dll/exe)
- 如何在shell中操作(连接)mysql数据库?
- 自定义控件添加事件