Young tableau

大部分的内容来自http://hi.baidu.com/yangchenhao/item/3d0c631200f0b1e75e53b1a7,少部分的内容是自己添加的

首先介绍一下这个数据结构的定义,Young Tableau有一个m*n的矩阵,让后有一数组 a[k],其中 k<=m*n,然后把a[k]中的数填入 m*n的矩阵中,填充规则为(如图1-1):

1. 每一行每一列都严格单调递增(有其他的版本是递减,其原理相同)。

2. 如果将a[k]中的数填完后,矩阵中仍有空间,则填入 ∞。

 

图1-1

则现在讨论,这个数据结构的几种操作,而在这些操作中,我们会发现堆排序的影子,并且这些操作具有很好的时间复杂度。

 

条件:一个已经建好的杨氏矩阵(Young Tableau)

操作:

【1】 在杨氏矩阵中插入元素x ---- Insert(x) -----bumping算法

【2】 在杨氏矩阵中删除位于 (x, y)位置的元素---- Delete(x, y)

【3】 返回x是否在矩阵中----Find(x)

【4】young matrix数数的问题----Count

【5】young tableau排序问题-----其复杂度需要低于直接的全部排序 mnlog(mn).

其中1-2操作类似于堆的操作,而4操作类似于BST的操作。下面我就用我

自己的理解把这几个操作加以解释。

【1】 插入操作

本操作的时间复杂度为O( n + m ),其操作类似于堆排序的SIFT-UP算法(具体算法见《算法设计技巧与分析》 M.H,Alsuwaiyel著)。它的堆的结构在这里表现为某个元素Y[x, y]下面和右面的两个元素 Y[x, y+1] ,Y[x+1, y]均比Y[x, y]要大。于是其插入算法可以描述为,首先把待插入元素以行为主序置于所有有效数字(除了无穷以外的数)最后面,如将x=2,放入 图1-1的d5的位置,然后执行类似于SIFT-UP的操作,将x与它左边(记为x-l)及上面(记为x-u)的数进行比较,根据比较结果有三种可能的操作:

1:x-u > x且x-u >= x-l 则将x与 x-u进行交换

2:x-l > x且x-l > x-u 则将x与 x-l进行交换

3: x >= x-l且 x > x-u 则x不动,此时已经插入成功

(可以有其他合理的约定)

对例子插入2进行操作如图1-2箭头的操作方向。



图1-2

  由上述的操作知其时间复杂度最大为行列之和,即O(m+n)。

【2】 删除操作

操作类似于插入操作,其时间复杂度也为O(m+n)。其操作类似于堆排序的SIFT-DOWN算法。删除算法可以描述为,首先将删除的位置(x, y)的数字删除,然后调整,把杨氏矩阵中的最大值k(可以行为主序进行搜索到最后)填入到被删除位置,然后让此数与其下面的数(k-d)和右面的数进行(k-r)比较,此时比较结果为两种,因为此时元素一定会下移:

 1:k-d > k-r将k-r和 k进行交换

 2:k-d < k-r将k-d和 k进行交换

举例 删除图1-1的a3位置的元素5如图1-3



图1-3

 由操作知,删除算法时间复杂同样最多为行列之和,即O(m + n)。

   【3】查找算法

   查找算法类似于BST二叉排序树,不过需要在其思想上稍微进行修改,才能满足杨氏矩阵的查找操作,同样利用杨氏矩阵的性质,不过此时应该换一个角度思考问题,因为与BST二叉排序树类比,所以应该从左下角开始看起(如图1-1d1位置),该元素的上面的元素比本身小和右面的元素比本身大,这样就与BST二叉排序树具有相同的性质。所以在查找时从左下角不断的比较,从而最终确定所查找元素位置。

   如查找19,比较顺序如图1-4

 

图1-4

 此算法的时间复杂度同前两个算法,复杂度也是O(m + n)。

【4】young矩阵数数的问题。来自黑书P93.

  定理1:1~n所组成的young table的个数满足如何的递推公式:a(1) = 1 a(2) = 2, a(n) = a(n-1) + (n-1)a(n-2),这个数还等于自可逆的排列数目 

  定理2:钩子公式:对于不同的形状,不同的young tableau的个数为n!除以每个格子的钩子长度(该各自右边的各自数和它上边的格子数之和)+1的积 n!/∏(i+j+1).

转载于:https://www.cnblogs.com/kwill/archive/2013/03/05/2943735.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值