⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds5.1.htm

📁 这是清华大学所用的数据结构的电子版教材
💻 HTM
📖 第 1 页 / 共 2 页
字号:
  <!--mstheme--><font face="宋体"></center>
</div>
<p><b><font color="#FFFFFF" size="5">&nbsp;&nbsp;&nbsp;&nbsp; 2×3<font FACE="??ì?,SimSun" LANG="ZH-CN">数组的逻辑状态  
</font>(a)<font FACE="??ì?,SimSun" LANG="ZH-CN">以行为主序</font> (b) <font FACE="??ì?,SimSun" LANG="ZH-CN">以列为主序</font></font></b></p> 
<p ALIGN="JUSTIFY"><font size="5"><b><font color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">&nbsp;  
设有</font>m×n<font FACE="??ì?,SimSun" LANG="ZH-CN">二维数组</font>A<sub>mn</sub></font><font FACE="??ì?,SimSun" LANG="ZH-CN" color="#FFFFFF">,下面我们看按元素的下标求其地址的计算:</font></b></font></p>
<p ALIGN="JUSTIFY"><font size="5"><b><font color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">&nbsp;  
以“以行为主序”的分配为例:设数组的基址为</font>LOC(a<sub>11</sub>)<font FACE="??ì?,SimSun" LANG="ZH-CN">,每个数组元素占据</font>L<font FACE="??ì?,SimSun" LANG="ZH-CN">个地址单元,那么</font>a<sub>ij 
</sub></font><font FACE="??ì?,SimSun" LANG="ZH-CN" color="#FFFFFF">的物理地址可用一线性寻址函数计算:</font></b></font></p>
<p ALIGN="JUSTIFY"><b><font color="#FFFFFF" size="5">LOC(a<sub>ij</sub>) = LOC(a<sub>11</sub>)  
+ ( (i-1)*n + j-1 ) * L</font></b></p> 
<p ALIGN="JUSTIFY"><font size="5"><b><font color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">&nbsp;  
这是因为数组元素</font>a<sub>ij</sub><font FACE="??ì?,SimSun" LANG="ZH-CN">的前面有</font>i-1<font FACE="??ì?,SimSun" LANG="ZH-CN">行,每一行的元素个数为</font>n<font FACE="??ì?,SimSun" LANG="ZH-CN">,在第</font>i<font FACE="??ì?,SimSun" LANG="ZH-CN">行中它的前面还有</font>j-1</font><font FACE="??ì?,SimSun" LANG="ZH-CN" color="#FFFFFF">个数组元素。</font></b></font></p>
<p ALIGN="JUSTIFY"><font size="5"><b><font color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">在</font>C<font FACE="??ì?,SimSun" LANG="ZH-CN">语言中,数组中每一维的下界定义为</font>0</font><font FACE="??ì?,SimSun" LANG="ZH-CN" color="#FFFFFF">,则:</font></b></font></p>
<p ALIGN="JUSTIFY"><b><font color="#FFFFFF" size="5">LOC(a<sub>ij</sub>) = LOC(a<sub>00</sub>)  
+ ( i*n + j ) * L</font></b></p> 
<p ALIGN="JUSTIFY"><font size="5"><b><font color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">&nbsp;  
推广到一般的二维数组:</font>A[c<sub>1</sub>..d<sub>1</sub>] [c<sub>2</sub>..d<sub>2</sub>]<font FACE="??ì?,SimSun" LANG="ZH-CN">,则</font>a<sub>ij</sub></font><font FACE="??ì?,SimSun" LANG="ZH-CN" color="#FFFFFF">的物理地址计算函数为:</font></b></font></p> 
<p ALIGN="JUSTIFY"><b><font color="#FFFFFF" size="5">LOC(a<sub>ij</sub>)=LOC(a<sub> 
c1 c2</sub>)+( (i- c<sub>1</sub>) *( d<sub>2 </sub>- c<sub>2</sub> + 1)+ (j- c<sub>2</sub>)  
)*L</font></b></p>
<p ALIGN="JUSTIFY"><font size="5"><b><font color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">&nbsp;  
同理对于三维数组</font>A<sub>mnp</sub><font FACE="??ì?,SimSun" LANG="ZH-CN">,即</font>m×n×p<font FACE="??ì?,SimSun" LANG="ZH-CN">数组,对于数组元素</font>a<sub>ijk</sub></font><font FACE="??ì?,SimSun" LANG="ZH-CN" color="#FFFFFF">其物理地址为:</font></b></font></p>
<p ALIGN="JUSTIFY"><b><font color="#FFFFFF" size="5">LOC(a<sub>ijk</sub>)=LOC(a<sub>111</sub>)+(  
( i-1) *n*p+ (j-1)*p +k-1)*L</font></b></p> 
<p ALIGN="JUSTIFY"><font size="5"><b><font color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">&nbsp;  
推广到一般的三维数组:</font>A[c<sub>1</sub>..d<sub>1</sub>] [c<sub>2</sub>..d<sub>2</sub>]  
[c<sub>3</sub>..d<sub>3</sub>]<font FACE="??ì?,SimSun" LANG="ZH-CN">,则</font>a<sub>ijk</sub></font><font FACE="??ì?,SimSun" LANG="ZH-CN" color="#FFFFFF">的物理地址为:</font></b></font></p>
<p ALIGN="JUSTIFY"><b><font color="#FFFFFF" size="5">LOC(i,j)=LOC(a<sub> c1 c2 
c3</sub>)+( (i- c<sub>1</sub>) *( d<sub>2 </sub>- c<sub>2</sub> + 1)* (d<sub>3</sub>-  
c<sub>3</sub> + 1)+ (j- c<sub>2</sub>) *( d<sub>3</sub>- c<sub>3</sub> + 1)+(k-  
c<sub>3</sub>))*l</font></b></p>
<p><font size="5"><b><font color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">三维数组的逻辑结构和以行为主序的分配示意图如图</font>5.4</font><font FACE="??ì?,SimSun" LANG="ZH-CN" color="#FFFFFF">所示</font></b></font></p>
<div align="left">
<!--mstheme--></font>
<table border="1" width="117" height="292" align="right" bordercolorlight="#3366CC" bordercolordark="#000000">
  <tr>
    <td width="117" height="14" align="center"><!--mstheme--><font face="宋体"><b><font color="#FFFFFF" size="4">a111</font></b><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="18" align="center"><!--mstheme--><font face="宋体"><b><font color="#FFFFFF" size="4">a112</font></b><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="14" align="center"><!--mstheme--><font face="宋体"><b><font color="#FFFFFF" size="4">a121</font></b><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="7" align="center"><!--mstheme--><font face="宋体"><b><font color="#FFFFFF" size="4">a122</font></b><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="6" align="center"><!--mstheme--><font face="宋体"><b><font color="#FFFFFF" size="4">a131</font></b><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="18" align="center"><!--mstheme--><font face="宋体"><b><font color="#FFFFFF" size="4">a132</font></b><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="16" align="center"><!--mstheme--><font face="宋体"><b><font color="#FFFFFF" size="4">a141</font></b><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="18" align="center"><!--mstheme--><font face="宋体"><b><font color="#FFFFFF" size="4">a142</font></b><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="30" align="center"><!--mstheme--><font face="宋体"><font color="#FFFFFF" size="4"><b>a211</b></font><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="1" align="center"><!--mstheme--><font face="宋体"><font color="#FFFFFF" size="4"><b>...</b></font><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="21" align="center"><!--mstheme--><font face="宋体"><font color="#FFFFFF" size="4"><b>a341</b></font><!--mstheme--></font></td>
  </tr>
  <tr>
    <td width="117" height="27" align="center"><!--mstheme--><font face="宋体"><font color="#FFFFFF" size="4"><b>a342</b></font><!--mstheme--></font></td>
  </tr>
</table>
<!--mstheme--><font face="宋体">
</div>
<p><img border="0" src="ds5.1.2.gif" align="left" width="252" height="158"></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size="5" color="#FFFFFF"><b>a</b></font></p> 
<p><img border="0" src="ds5.1.3.gif" align="left" width="279" height="73"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;  
<b><font size="5" color="#FFFFFF"> b</font></b></p>
<p ALIGN="JUSTIFY"><b><font size="5" color="#FFFF00"><font FACE="oúì?,SimHei" LANG="ZH-CN">例5.1</font> 
</font><font size="5" color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN">若矩阵</font>A<sub>m×n  
</sub><font FACE="??ì?,SimSun" LANG="ZH-CN">中存在某个元素</font>a<sub>ij</sub><font FACE="??ì?,SimSun" LANG="ZH-CN">满足:</font>a<sub>ij</sub><font FACE="??ì?,SimSun" LANG="ZH-CN">是第</font>i<font FACE="??ì?,SimSun" LANG="ZH-CN">行中最小值且是第</font>j<font FACE="??ì?,SimSun" LANG="ZH-CN">列中的最大值,则称该元素为矩阵</font>A<font FACE="??ì?,SimSun" LANG="ZH-CN">的一个鞍点。试编写一个算法,找出</font>A</font></b><font size="5" color="#FFFFFF"><font FACE="??ì?,SimSun" LANG="ZH-CN"><b>中的所有鞍点。</b></font></font></p>
<font SIZE="3">
<p ALIGN="JUSTIFY"></font><font size="5" color="#FFFFFF"><b><font FACE="??ì?,SimSun" LANG="ZH-CN">&nbsp;  
基本思想:在矩阵</font>A<font FACE="??ì?,SimSun" LANG="ZH-CN">中求出每一行的最小值元素,然后判断该元素它是否是它所在列中的最大值,是则打印出,接着处理下一行。矩阵</font>A</b><font FACE="??ì?,SimSun" LANG="ZH-CN"><b>用一个二维数组表示。</b></font></font></p>
<p ALIGN="JUSTIFY"><b><font FACE="??ì?,SimSun" LANG="ZH-CN" size="5" color="#FFFFFF">算法如下:</font></b></p>
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">void  
saddle (int A[ ][ ],int m, int n)</font></b></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><font size="5" color="#FFFFFF"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
/*m,n<font FACE="??ì?,SimSun" LANG="ZH-CN">是矩阵</font>A<font FACE="??ì?,SimSun" LANG="ZH-CN">的行和列</font>*/</b></font></p>
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">{int 
i,j,min;</font></b></p>
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><font size="5" color="#FFFFFF"><b>&nbsp;for  
(i=0;i&lt;m;i++) <font FACE="??ì?,SimSun" LANG="ZH-CN"> </font>/*<font FACE="??ì?,SimSun" LANG="ZH-CN">按行处理</font>*/</b></font></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">&nbsp;{  
min=A[i][0]</font></b></p>
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">&nbsp;&nbsp;  
for (j=1; j&lt;n; j++)</font></b></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><font size="5" color="#FFFFFF"><b>&nbsp;&nbsp;  
if(A[i][j]&lt;min ) min=A[I][j];/*<font FACE="??ì?,SimSun" LANG="ZH-CN">找第</font>I<font FACE="??ì?,SimSun" LANG="ZH-CN">行最小值</font>*/</b></font></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><font size="5" color="#FFFFFF"><b>&nbsp;&nbsp;  
for (j=0; j&lt;n; j++)</b></font></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><font face="??ì?,SimSun" lang="ZH-CN" size="5" color="#FFFFFF"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
</b></font><font size="5" color="#FFFFFF"><b>/*<font FACE="??ì?,SimSun" LANG="ZH-CN">检测该行中的每一个最小值是否是鞍点</font>*/</b></font></p>
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">&nbsp;&nbsp;  
if (A[i][j]==min )</font></b></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">&nbsp;&nbsp;  
{k=j; p=0;</font></b></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">&nbsp;&nbsp;&nbsp;  
while (p&lt;m &amp;&amp; A[p][j]&lt;min)</font></b></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;  
p++;</font></b></p>
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><font size="5" color="#FFFFFF"><b>&nbsp;&nbsp;&nbsp;  
if ( p&gt;=m) printf (<font FACE="??ì?,SimSun" LANG="ZH-CN">"</font>%d,%d,%d\n<font FACE="??ì?,SimSun" LANG="ZH-CN">"</font>,  
i ,k,min);</b></font></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">&nbsp;&nbsp;  
}/* if */</font></b></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">&nbsp;  
}/*for i*/</font></b></p> 
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"><b><font size="5" color="#FFFFFF">}</font></b></p>
<p ALIGN="JUSTIFY" style="margin-top: 0; margin-bottom: 0"> </p>
<p style="margin-top: 0; margin-bottom: 0"><font size="5" color="#FFFFFF"><b><font FACE="??ì?,SimSun" LANG="ZH-CN">算法的时间性能为</font>O(m*(n+m*n))</b><font FACE="??ì?,SimSun" LANG="ZH-CN"><b>。</b></font></font></p>
<p style="margin-top: 0; margin-bottom: 0"> </p>
<p style="margin-top: 0; margin-bottom: 0"> </p>
<p style="margin-top: 0; margin-bottom: 0" align="center"><b><a href="ds5.HTM"><font face="??ì?,SimSun" lang="ZH-CN" size="5" color="#FFFF00">返回</font></a></b></p>
<!--mstheme--></font>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -