📘
Introduction_to_Algorithms
  • Introduction
  • 第6章:堆排序
    • 练习题
    • 思考题
      • 6-3 Young
  • 第7章:快速排序
    • 练习题
    • 思考题
      • 7-6 对区间的模糊排序
  • 第8章:线性时间排序
    • 练习题
      • 8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序
    • 思考题
      • 8-3 排序不同长度的数据项
  • 第9章 排序和顺序统计学算法导论
    • 练习题
      • 9.1-1
      • 9.3-3 快速排序-最坏时间O(nlgn)
      • 9.3-6 nlgk时间求k分位数
      • 9.3-8 求两个数组的中位数
    • 思考题
      • 9-2-c-带权中位数
  • 第10章:栈和队列
    • 10.1 栈和队列
      • 练习题
      • 10.1-2 用一个数组实现两个栈
      • 10.1-5 双端队列
    • 10.2 链表
      • 练习题
      • 10.2-5 环形链表实现字典操作INSERT、DELETE、SEARCH
    • 10.3 指针和对象实现
      • 练习题
      • 10.3-4 紧凑的多重数组
    • 思考题
  • 第11章 散列表
  • [第12章]
    • [笔记和代码]
      • 12-2 基数树
  • 第14章
    • 笔记和代码
      • 14.3-6 MIN GAP
  • 第15章:动态规划
    • 练习题
    • 思考题
      • 15-2 整齐打印
      • 15-3 编辑距离
  • 第20章:斐波那契堆
    • 练习题
    • 思考题
  • ACM解题报告
    • 1043 八数码问题
    • 1053 Entropy
    • 1114 Piggy-Bank 完全背包
    • 1133 catalan数二维变种
    • 1166 敌兵布阵
    • 1281 棋盘游戏 二分匹配与增广链
    • 1394 Minimum Inversion Number
    • 1394 用线段树求逆序数
    • 1787 欧拉函数之在线算法
    • 2438 三分查找
    • 2473 Junk-Mail Filter 并查集的删除
    • 2824 欧拉公式之打表算法
    • 2855 Fibonacci Check-up 矩阵的应用
    • 2642 Stars 二维树状数组
    • 2888 二维RMQ
    • 3033 分组背包之每组至少选一
    • 3307 A^B = C mod D,已知A,C,D,求解B
    • 3465 Life is a Line 用归并排序求逆序数
    • 3483 A Very Simple Problem 数论+矩阵的应用
    • 3518 后缀数组
    • 3579 中国剩余定理(ACM/不互质的情况)
    • 后缀数组
    • B-树
    • 排序算法总结
Powered by GitBook
On this page
  • 一、题目
  • 二、思考
  • 不同点:
  • 相同点:
  • 三、练习
  • a)
  • c)
  • d)
  • e)
  • f)
  • 四、代码
  1. 第6章:堆排序
  2. 思考题

6-3 Young

Previous思考题Next第7章:快速排序

Last updated 5 years ago

一、题目

二、思考

最小Young氏矩阵和最小堆的思想差不多,可以通过比较两者的同异来理解Young氏矩阵

不同点:

header 1

min-Heap

min-Young

堆顶(最小值)

H[1]

Y[i][j]

最后一个元素的位置

H[N]

Y[N][N]

最后一个元素

不一定是最大值

一定是最大值

parent

H[i]的parent是H[i/2]

Y[i][j]的parent是Y[i-1][j]和Y[i][j-1]

child

H[i]的child是H[i2]和H[i2+1]

Y[i][j]的child是Y[i+1][j]和Y[i][j+1]

find(x)

从H[1]开始遍历

从西南角开始,或当前值小于key,则向东走,否则向北走

相同点:

1.堆顶是最小值所在的位置

2.parent的值<=child的值

3.空条件:堆顶元素值为INIT

4.满条件:最后一个元素的值不为INIT

5.delete:插入到最后一个元素的位置,然后向parent调整

6.extract:提取堆顶元素,将堆顶元素置为INIT,然后child调整

三、练习

a)

可以有多种画法

2   3   4   5  
8   9   12    
14  16

c)

提取Y[1][1],并用ox7FFFFFFF填充。然后向右下调整

YOUNG-EXTRACR-MIN(Y)  
1    if  Y[1][1] == 0X7FFFFFFF  
2        then error "heap underflow"  
3    min <- Y[1][1]  
4    A[1][1] <- 0X7FFFFFFF  
5    MAX-HEAPIFY(Y, 1, 1)  
6    return min  
//递归  
MIN-YOUNGIFY(Y, i, j)  
 1    min <- Y[i][j]  
 2    mini <- i  
 3    minj <- j  
 4    if i+1 < m and Y[i+1][j] < min  
 5        mini <- i+1  
 6        minj <- j  
 7        min <- Y[i+1][j]  
 8    if j+1 < n and Y[i][j+1] < min  
 9        mini <- i  
10        minj <- j+1  
11        min <- Y[i][j+1]  
12    if i != mini or j != minj  
13        exchange Y[i][j] <-> Y[mini][minj]  
14        MIN-YOUNGIFY(Y, mini, minj)  
d)  
//若表未满,插入到右下角,然后向左上调整  
MIN-YOUNG-INSERT(Y, key)  
 1    if Y[m][n] < 0x7fffffff  
 2        then error "young overflow"  
 3    Y[m][n] <- key  
 4    flag <-  true  
 5    i <- m  
 6    j <- n  
 7    max <- key  
 8    maxi <- i  
 9    maxj <- j  
10    while true  
11        if i > 1 and max < Y[i-1][j]  
12            maxi <- i - 1  
13            maxj <- j  
14            max <- Y[i-1][j]  
15        if j > 1 and max < Y[i][j-1]  
16            maxi <- i  
17            maxj <- j-1  
18            max <- Y[i][j-1]  
19        if max == Y[i][j]  
20            break  
21        exchange Y[maxi][maxj] <-> Y[i][j]  
22        i <- maxi  
23        j <- maxj  
24        max <- Y[i][j]

d)

将新元素加入到矩阵的Y[m][n]处,然后逐步向上调整

参考产品代码errorType Young::insert(int key)

e)

排序过程为:

step1:取下矩阵Y[1][1]元素,O(1)

step2:将Y[1][1]置为0x7FFFFFFF,O(1)

step3:调整矩阵,O(n)

对所有n^2^个结点各执行以上step1~3一次,因此时间为O(n^3^)

f)

从左下角开找,若比它小,则向上,则比它大,则向右找

FIND-YOUNG-KEY(Y, key)  
 1    i <- m  
 2   j <- 0  
 3   while i >= 1 and j <= n  
 4       if Y[i][j] = key  
 5       then return true  
 6       else if Y[i][j] < key  
 7       then j++  
 8       else if Y[i][j] > key  
 9       then i--  
10   return false

四、代码

头文件
产品代码