第l 3卷第lO期 2014年10月 软件导刊 Soflware Guide 、-01.13NO.JO 0ct.2Ol4 螺旋矩阵算法研究 魏 林 (江西经济管理干部学院信息工程系,江西南昌330088) 摘 要:螺旋矩阵问题是数据结构算法问题中常求解问题之一。介绍了几种常见的螺旋矩阵,对求解螺旋矩阵的两 种常用算法进行了详细分析,并在此基础上将算法转化为C语句,对两种算法的时间性能进行了测试分析。结果表 明,两种算法的时间复杂度相同.算法执行时间效率也基本一致。 关键词:螺旋矩阵;时间复杂度;c语言 DOI:10.11 907/rjdk.143427 中图分类号:TP3l2 文献标识码:A 文章编号:1672—7800(20l4)O1O-0056—02 阵元素按顺时针方向分成4个部分:矩阵的上半边(3 1 螺旋矩阵 螺旋矩阵 。是指一个呈螺旋形状的矩阵,矩阵的数字 从第一行开始至右边不断增大,向下增大,向左增大,向上 增大,按此规律循环。按旋转的方向分顺时针、逆时针螺 旋矩阵,按数字开始的位置又分为由外向内、由内向外扩 行),矩阵的右半边(2列),矩阵的下半边(2行),矩阵的左 半边(2列)。 a00 01 .102",103 a0 散螺旋矩阵,如图1所示。 l 2 3 8 9 4 7 6 5 1 8 2 9 6 3 4 5 7 8 9 6】2 5 4 3 9 8 7 2】6 3 4 5 置 l ^: l3 ^} 图3坐标求值 图2按旋转方向构建 从外到内顺时针 从外到内逆时针 从内至 顺时针 从内到外逆时针 5阶螺旋矩阵可判断层数k—N/2—2,用循环控制产 生的层数,C语句为for(k一0;k<一N/2;k++);。 步骤1:寻找矩阵上半边行的规律(一方向),行下标 图l各种螺旋矩阵 螺旋矩阵的问题常出现在公司面试、学生竞赛试题 中,主要考察学生的观察能力、逻辑思维能力及对程序设 计的算法设计能力。 正好是层数k的值(0、1、2),列下标在第一列从0变到4, 第二行从l变到3,在第三行从2变到2,故得出~阶螺旋 矩阵上半边从左到右的列循环结构为:for(j—k;j<一N 2螺旋矩阵常用算法求解 2.1 按旋转方向构建螺旋矩阵求解 k—l;j4-+)aEk][j]一num++;该循环执行一次将产 生一行元素,而循环执行的次数由外层循环来予以控制, 当N:5时,层数k从0自增至2.循环执行共3次,将产 从数字的起始位置开始,沿螺旋矩阵的矩形边框按照 旋转的方向(顺时针或逆时针)依次给矩阵的每一个元素 生螺旋矩阵的上半边3行元素。 步骤2:寻找矩阵右半边列的规律( 方向),列下标 从4变到3,行下标由外到内第一列从1变到3,第二列从 赋值,在计算机内存中构造出一个完整的螺旋矩阵,然后 将每个矩阵元素顺序输 。以5阶从外到内顺时针螺旋 矩阵为例,对应的二维数组如图2所示。 解5阶螺旋矩阵算法思想:按顺时针方向从外向内, 一2变到2,由此得出N阶螺旋方阵右半边列从上到下的循 环结构为:for(i—k+1;i<N—k—l;i++)aEi]IN—k一 1]一hum++;当N一5时,层数k从0自增至2,该循环 层层给每个下标变量赋值。由于用户输入螺旋矩阵的 阶数N具有任意性,因而需要解决以下问题:①层数k与 阶数N的关系式;②阶数N由用户输入,层数k应根据N 执行2次,产生矩阵右半边两列元素。 步骤3:寻找矩阵下半边行的规律(一方向),列下标 第一行从4变化到1,第二行从3变到2,因此可知行标和 列标的初值均为N—k一1,行标没有变化,两行的行标分 来计算;③定义变量nUITI,赋值后变量rlum的值白增1。分 析每层矩形四条边元素的行标和列标变化规律,将螺旋矩 作者简介:魏林(1981一)。女。江西九江人,江西经济管理干部学院信息工程系讲师,研究方向为计算机软件技术。 第1O期 魏林:螺旋矩阵算法研究 ·57· 别为4和3,故得出矩阵下半边的行从右到左的循环结构 为:for(j:N—k一1;j i>k;j一一)a[N—k一1][j]一nurn +4-;当N一5时,层数尼从0自增至2,该循环执行2次, 产生矩阵下半边两行元素。 步骤4:寻找矩阵左半边行规律(十方向):经观察发 现,列下标刚好可用层次矗来表示,列下标从0变到1,行 下标由外到内第一列从4变到1,第二列从3变到2,因此 可得出左半边的列从下至上的循环结构为:for(i—N—k ~1;i>k;i--一)aEi]Ekl—num++;当N一5时,层数忌 从0自增至2,循环执行2次,产生矩阵左半边两列元素。 当用户输入螺旋矩阵的阶数N的值时,层数走确定, 当五取一个值时,以上4个循环依序产生一行或者一列矩 阵元素,当矗值在0至N/Z范围内依次取值时,4个循环 轮流执行,忌值取完后,螺旋矩阵构造完成。 2.2螺旋矩阵坐标求值求解 以上算法是在构建螺旋矩阵的基础上进行元素赋值, 那么能否根据行号和列号直接计算出矩阵元素的值?当 用户输入螺旋矩阵的阶数N时,矩阵中每一个元素是唯 一的,螺旋矩阵也是唯一的,因此行标和列标必然与元素 值之间存在着某种唯一的映射关系。 通过观察,将螺旋矩阵划分成若干个正方形,这些正 方形有如下规律,如图3所示。①N为奇数时最内圈是一 个点(只有一个元素);②每一个正方形左上角的元素最 小;③每一个正方形上的元素从左上角开始递增;④N阶 螺旋矩阵共有(N+1)/Z层正方形。 以5阶螺旋矩阵为例,即N一5,设忌为正方形的层数 编号(是一0,1,2),最外层为第0层,每层的第1个元素值 最小,即a(k,是),其对应的值为2*尼*(2*~一2*忌)-5 1,如5阶螺旋矩阵的a(0,0)一1;a(1,1):17;a(2,2)一 25。 步骤1:首先确定N阶螺旋矩阵的层数及每层的第1 个元素值。用一维数组£[愚]来存储每层的第1个元素即 每层的最小值,当N为给定值时,螺旋矩阵有(N+1)/z 层正方形,需要用到一维数组£[]中N/Z+1个元素。如 N一5时,螺旋矩阵有3层正方形,需要用到一维数组的t [O]、t[1]、tEzl,值分别为1、17、25,当N一6时,螺旋矩阵 仍然有3层正方形,但需要用到一维数组的t[0]、tE1]、t [2]、tE31,值分别为1、21、33、37。 步骤2:构建双重循环遍历N阶矩阵,设i和 分别 为矩阵的行标与列标。 步骤3:根据行标i和列标 的值,确定该元素在哪层 正方形上,通过min{i,J,N—i一1,N— 一1}可知某一行 列标元素处于第愚层正方形上。 步骤4:根据行标 和列标 的值求出该元素所在位 置处于螺旋矩阵中的值,分两种情况赋值:①当 ≤ 时,a EiJEj]一t[k]+i+j--2*k;②当i>j时,aEil[jl:t[k+1] i~j+2*k;。 以上双重循环按矩阵的行列规律遍历了N阶矩阵的 每一个元素,在遍历元素的同时并赋予螺旋矩阵的值,当 访问完所有元素后,螺旋矩阵便形成。 3算法时间性能分析 一个算法所耗费的时间,从理论上来讲不能算出来, 必须在计算机上运行测试。但不可能、也没有必要对每一 个算法都在计算机上测试,只需要知道哪个算法耗费的时 间多,哪个算法耗费的时间少,由此来粗略判断算法的优 劣。通常情况下,算法所耗费的时间等于算法中每条语句 的执行时间之和,而每条语句的执行时间等于语句的执行 次数(频度)乘以语句执行一次所需时间口 。然而,把算法 转换为程序后,程序的运行测试将受到计算机的指令性 能、运算速度以及编译产生的代码质量等因素的影响,如 果忽略这些影响因素,则一个算法的时间耗费就是该算法 中所有语句的频度之和,而算法的时间复杂度T(n)就是 该算法的时间耗费口 。基于以上两种算法,分别进行时间 复杂度分析。 3.1 按旋转方向构建螺旋矩阵算法关键代码(C语句) for(k一0;k<一N/2;n++) {for(j—k;j<一N—k—l;j++) (1)a[k][j]一num++; for(i—k+1;i<N—k一1;i++) (2)a[ ][N—k一1]:num++; for(j—N—k一1;j>k;j~一) (3)a[N—k一1][j]一num++; for(i—N—k—l;i>k;i一一) (4)a[i][k]一nHm++;) 从语句(1)(2)(3)(4)的内层循环来看,是为最小值0 时,各语句频度最大,语句(1)的频度是N一是一1一是+1一 N,语句(2)的频度是N一志一1一点一1+1一N一1,语句 (3)的频度是N一1,语句(4)的频度是N一1,再看外层循 环,外层循环频度为N/Z十1因此语句(1)的平均频度为 (N/2+1)*N/Z,语句(2)(3)(4)的频度均为(N/Z+1)* (N一1)/Z,因此该程序段频度_厂(N)一(N/24-1)*(4N 一3)/2,该程序段的时间复杂度T( )一O(n )。 3.2坐标求值算法关键程序代码(C语句) for(i一0;i<(N/2+1);i++) (1)t[il一2*i*(N+N一2*i)+1; for(i一0;i<N;i++) {for(j一0;j<N;j++) (2){k—rain(rain(i,j),rain(N一1一i,N一1--j)); (3) if(i<一j)a[i][j]一tEkl+i+j一2*k; (4) else aEilEj ̄一t[k+1]一i—j+2*k; } f 在坐标求值算法的关键代码中语句(1)位于单层循环 内,其频度为N/2,而语句(2)、(3)、(4)都位于双层循环 内,语句(2)的频度为(N+1)(N+1),语句(3)和语句(4) 的频度之和为(N+1)(N+1),因此该算法程序段的频度 厂(N)一N/Z十2*(N+1)(N+1),该程序段的时间复杂 第13卷第1O期 2O14年1O月 软件导刊 Software Guide V01.13NO.1O 0ct.2O14 自定义采煤机滚筒式碰撞体研究与实现 宋园园 ,宋代广。,彭延军 (1.山东科技大学信息科学与工程学院,山东青岛266590; 2.临矿集团临沂亿金物资有限责任公司,山东临沂276016) 摘 要:在交互式仿真环境下,采煤机削采煤炭的核心技术就是一个不规则几何体对另一个不规则几何体的碰撞检 测问题。为了使采煤机和煤块之间的碰撞效果更逼真,定义了一种面向采煤机滚筒的自定义碰撞体,并将其作为自 定义插件应用到Unity环境下。 关键词:不规则几何体;碰撞检测;自定义碰撞体 DOI:10.11907/rjdk.143328 中图分类号:TP312 文献标识码:A 文章编号:1672-7800(2014)010—0058—03 方向包围盒,离散方向多面体包围盒的方法 ]。但这些 0 引言 三维场景下的物体形状大多是不规则的、复杂的,物 体间碰撞检测的实现困难、耗时,碰撞检测的实时性和准 确性尤为重要。 方法很难同时实现碰撞的实时性和精确性。 Unity 3D交互式仿真工具提供了球体包围盒、立体 包围盒、胶囊包围盒、面包围盒4种包围盒碰撞检测模型。 使用这4种包围盒的原则是尽可能地使得碰撞模型最大 限度地充满包围盒。球体包围盒适用于类球形,立体包围 盒适用于有棱角的凹凸多面体,胶囊包围盒适用于圆滑的 类椭球形体,也可与其它包围盒结合使用,面包围盒则适 用于不规则的碰撞体。 目前,国内外的碰撞检测算法有层次包围盒方法、时 空包围盒法、距离跟踪法、空间分解法等多种,其中应用最 广泛的是层次包围盒方法,包括球体包围盒、轴向包围盒、 度也为T(n)一O(n )。 3.3算法执行时间效率测试 算法和坐标求值求解算法的空间复杂度一样,两种算法的 执行时间效率也基本一致。虽然螺旋矩阵的问题早已解 决,但相同的问题可以用不同算法来解决,因为算法的质量 优劣将直接影响到算法乃至程序的执行效率。算法分析的 目的是选择合适的算法和改进算法,以最优方法解决问题, 算法执行时间效率是依据该算法编制的程序在计算 机上运行时所消耗的时间来度量。通常度量一个程序的 执行时间有两种方法:事前分析估算的方法和事后统计的 方法,而算法的时间复杂度研究正是对算法的事前分析估 算。于是将两种算法置于VC6.0的测试环境中,通过改 变N的大小,得到两个算法消耗的时间量,如表1所示。 表1算法时间耗费统计 算法1时间量算法2时间量0 0 0 0 31 31 156 156 655 624 1 840 1 684 因此在螺旋矩阵问题上还需研究者探寻更优的算法。 参考文献: [1]潘大志,张世禄.螺旋矩阵算法设计与实现[J].电脑开发与应用, 2007,20(6):40-41. (单位:ms) 6 146 6 115 22 932 22 900 N一4 N=8 N=16 N一32 N=64 N=128 N=256 N=500 [2]严蔚敏,吴伟民.数据结构:C语言版[M].北京:北京清华大学出版 社,2007. [3] [美]CORMEN T H.算法导论[M].殷建平,译.北京:机械工业出 4 结语 通过以上分析与测试,按旋转方向构建螺旋矩阵求解 基金项目:国家863课题(2012AA062202) 版社,2O13. (责任编辑:孙娟) 作者简介:宋园园(1990--),女,山东聊城人,山东科技大学信,gNuS与工程学院硕士研究生,研究方向为多媒体技术;宋代广(1978--), 男,山东临沂人,临矿集团临沂亿金物资有限责任公司科长,研究方向为信息管理;彭延军(1971一),男,山东青岛人,博士,山 东科技大学信息科学与工程学院教授,研究方向为计算机体系结构、科学计算可视化。