算法导论 堆排序习题

来源:互联网 发布:网络与新媒体专业出国 编辑:程序博客网 时间: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 ,树的高度即需要比较的次数