11.Young tableaus(杨氏矩阵)的分析.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
11.Young tableaus(杨氏矩阵)的分析

Young tableaus(杨氏矩阵)的分析 简介 ? ? 杨氏矩阵是在很多面试和讨论中用到比较多的一个话题。它本身独特的构造使得它的一些增删查改的操作和堆排序以及二分搜索的思想很类似。它本身问题不难,实际操作的时候会稍微有点繁琐。 ? ? 假定我们有一个mxn的矩阵,它的每一行以及每一列都是排好序的。我们可以称这个矩阵为Young tableaus(杨氏矩阵)。在这个矩阵里,可以有某些元素不存在的情况,也就是说,这些位置的值被设置为无穷大(∞)。我们以元素按照非递减的顺序为例,假设我们有这么一组数字{9, 16, 3, 2, 4, 8, 5, 14, 12},我们可以构造一个如下的杨氏矩阵: ? ? ?由前面的基本定义,我们发现几个很直观的特性: 一、对于每个元素,如果不是值为∞的,它的右边和下面的元素都大于或者等于它。那么,对于整个矩阵来说,它最小的元素肯定在最左上角,也就是元素a[0][0]。 ?二、由于整个矩阵可以有空缺的元素,我们用∞来表示。那么,如果它最右下角的元素a[m][n]不是∞的话,我们可以推断这个矩阵是满的矩阵,也就是说不存在∞的元素。 ? ? ?ok,有了前面的这部分定义,我们来看看矩阵的几个常见操作吧。 ? ? insert元素的过程就是我要新增加一个元素到矩阵中,保证我插入的这个元素最后要放在一个适当的位置以满足杨氏矩阵的特性。这里最关键的就是有两个点:1. 找到一个初始插入的点。 2. 调整,将元素放到合适的位置上。 ? ? 放元素的话,我们可以考虑到,只要这个矩阵不是满的,那么他最后的那个放置元素的点应该是最右下角的那个。我们可以考虑先把元素放到这个点。然后再来调整。以前面给出的矩阵为例,假设我们要插入一个元素7,我们插入元素后的矩阵结果如下: ? ? 调整的话,我们考虑,假设它左边的元素和上面的元素都存在,而且比自己大的话,我们就需要取中间最大的那个元素,和当前元素交换位置。对于两边元素一样大的情况,先比较同行的或者同列的都可以。假定我们先比较同一列的,然后比较同一行的,则位置调整的步骤如下: ? ? 1. 7 和上面的∞比较,因为7小于∞,根据先和同列元素比较的方式,则先将7与它上面的元素交换。这样一直将7交换到了最右上角。如下图: ? ?2. 现在,我们再来比较。7已经到了最右上角,它往上没有元素了,往左有一个9。所以在往左或者往上的方向上比它大的最大元素为9。它需要和9交换。如下图: ? ? 前面不断比较交换的过程终止条件是要么元素已经遍历到了矩阵的边角了,要么就是它所有左边和上面的元素都比它要小了。我们可以得出如下的代码: ? Java代码?? public?static?void?insert(int[][]?a,?int?k)?throws?Exception?? {?? ????int?i?=?a.length?-?1;?? ????int?j?=?a[0].length?-?1;?? ????decreaseKeyRec(a,?i,?j,?k);?? }?? ?? public?static?void?decreaseKeyRec(int[][]?a,?int?i,?int?j,?int?k)?throws?Exception?? {?? ????if(a[i][j]??k)?? ????????throw?new?Exception(Invalid?key);?? ????a[i][j]?=?k;?? ????int?largesti?=?i;?? ????int?largestj?=?j;?? ????if(i?-?1?=?0??a[i?-?1][j]??a[i][j])?? ????{?? ????????largesti?=?i?-?1;?? ????????largestj?=?j;?? ????}?? ????if(j?-?1?=?0??a[i][j?-?1]??a[largesti][largestj])?? ????{?? ????????largesti?=?i;?? ????????largestj?=?j?-?1;?? ????}?? ????if(i?!=?largesti?||?j?!=?largestj)?? ????{?? ????????swap(a,?i,?j,?largesti,?largestj);?? ????????decreaseKeyRec(a,?largesti,?largestj,?k);?? ????}?? }?? ? ? 这里代码实现的一个要点就是比较a[i][j]和a[i-1][j]以及a[i][j-1],找到他们中间最大的那个,然后再将a[i][j]和最大的元素交换。前面decreaseKeyRec()方法用了递归的方

文档评论(0)

ldj215322 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档