📄 defination.html
字号:
<html><!-- #BeginTemplate "/Templates/article_template.dwt" -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="keywords" content="algorithm, data structure, contest, programming, 算法, 数据结构, 程序设计, 竞赛">
<meta name="description" content="discussing the algorithm and data structure of computer programming, as well as all kinds of programming contest.">
<meta name="description" content="讨论程序设计的算法与数据结构,各类程序设计竞赛试题解析和参赛经验介绍。">
<!-- #BeginEditable "doctitle" -->
<title>算法表达中的抽象机制</title>
<!-- #EndEditable -->
<script id="header" language="JavaScript" src="../lib/header.js"></script>
<!-- #BeginEditable "javascript" -->
<script language="JavaScript">
var previous = "end";
var next = "end";
</script>
<!-- #EndEditable -->
</head>
<body bgcolor="#FFFFFF">
<div id="content">
<!-- #BeginEditable "MainContent" -->
<h1>何谓数据结构</h1>
<p>数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。</p>
<p>数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。 </p>
<h2>数据结构主要研究什么?</h2>
<p>数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。</p>
<h2>什么是数据结构?什么是逻辑结构和物理结构?</h2>
<p><dfn>数据</dfn>是指由有限的符号(比如,"0"和"1",具有其自己的结构、操作、和相应的语义)组成的元素的集合。<dfn>结构</dfn>是元素之间的关系的集合。通常来说,一个<dfn>数据结构<i>DS</i></dfn>
可以表示为一个二元组:</p>
<p><i>DS=(D,S)</i>, //i.e., <i>data-structure=(data-part,logic-structure-part)</i></p>
<p>这里<i>D</i>是数据元素的集合(或者是“结点”,可能还含有“数据项”或“数据域”),<i>S</i>是定义在<i>D</i>(或其他集合)上的关系的集合,<i>S
</i>= { <i>R </i>| <i>R </i>: <i>D</i>×<i>D</i>×...},称之为元素的<dfn>逻辑结构</dfn>。</p>
<p>逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构。<a href="basic/list/chapter1.htm">表</a>和<a href="basic/tree/chapter1.htm">树</a>是最常用的两种高效数据结构,许多高效的算法可以用这两种数据结构来设计实现。<a href="basic/list/chapter1.htm">表</a>是线性结构的(全序关系),<a href="basic/tree/chapter1.htm">树</a>(偏序或层次关系)和<a href="basic/graph/chapter1.htm">图</a>(局部有序(weak/local
orders))是非线性结构。</p>
<p>数据结构的物理结构是指逻辑结构的存储镜像(image)。数据结构 <i>DS</i> 的物理结构 <i>P</i> 对应于从 <i>DS </i>的数据元素到存储区<i>M</i>(维护着逻辑结构<i>S</i>)的一个映射:</p>
<p><i>P</i>:(<i>D</i>,<i>S</i>)<i> </i>--><i> M</i></p>
<p class="noindent"><b>存储器模型:</b>一个存储器<i> M</i> 是一系列固定大小的存储单元,每个单元 <i>U</i>
有一个唯一的地址 <i>A</i>(<i>U</i>),该地址被连续地编码。每个单元 <i>U </i>有一个唯一的后继单元 <i>U'</i>=succ(<i>U</i>)。</p>
<p class="noindent"><i><b>P </b></i><b>的四种基本映射模型:</b>顺序(sequential)、链接(linked)、索引(indexed)和散列(hashing)映射。</p>
<p>因此,我们至少可以得到4×4种可能的物理数据结构:</p>
<TABLE border=1 cellPadding=0 cellSpacing=0 width=284>
<TBODY>
<TR>
<TD width=93><b> </b>
<div align="center"><b>sequential</b></div>
</TD>
<TD align=right width=102>
<div align="center"><b>(sets)</b></div>
</TD>
</TR>
<TR>
<TD width=93><b> </b>
<div align="center"><b>linked</b></div>
</TD>
<TD align=right width=102>
<div align="center"><b>lists</b></div>
</TD>
</TR>
<TR>
<TD width=93><b> </b>
<div align="center"><b>indexed</b></div>
</TD>
<TD align=right width=102>
<div align="center"><b>trees</b></div>
</TD>
</TR>
<TR>
<TD width=93><b> </b>
<div align="center"><b>hash</b></div>
</TD>
<TD align=right width=102>
<div align="center"><b>graphs</b></div>
</TD>
</TR>
</TBODY>
</TABLE>
<br>
(并不是所有的可能组合都合理)
<p class="noindent"><b>数据结构<i>DS</i>上的操作:</b>所有的定义在<i>DS</i>上的操作在改变数据元素(节点)或节点的域时必须保持<i>DS</i>的逻辑和物理结构。</p>
<p class="noindent"><b>DS上的基本操作:</b>任何其他对<i>DS</i>的高级操作都可以用这些基本操作来实现。最好将DS和他的所有基本操作看作一个整体——称之为<dfn>模块</dfn>。我们可以进一步将该模块抽象为数据类型(其中<i>DS</i>的存储结构被表示为私有成员,基本操作被表示为公共方法),称之为<ACRONYM title="Abstract Data Type">ADT</ACRONYM>。作为ADT,堆栈和队列都是一种特殊的表,他们拥有表的操作的子集。</p>
<p class="noindent">对于DATs的高级操作可以被设计为(不封装的)算法,利用基本操作对<i>DS</i>进行处理。</p>
<p class="noindent"><b>好的和坏的DS:</b>如果一个<i>DS</i>可以通过某种“线性规则”被转化为线性的<i>DS</i>(例如线性表),则称它为好的<i>DS</i>。好的<i>DS</i>通常对应于好的(高效的)算法。这是由计算机的计算能力决定的,因为计算机本质上只能存取逻辑连续的内存单元,因此如何没有线性化的结构逻辑上是不可计算的。比如对一个图进行操作,要访问图的所有结点,则必须按照某种顺序来依次访问所有节点(要形成一个偏序),必须通过某种方式将图固有的非线性结构转化为线性结构才能对图进行操作。</p>
<p><a href="basic/tree/chapter1.htm">树</a>是好的DS——它有非常简单而高效的线性化规则,因此可以利用树设计出许多非常高效的算法。树的实现和使用都很简单,但可以解决大量特殊的复杂问题,因此树是实际编程中最重要和最有用的一种数据结构。树的结构本质上有递归的性质——每一个叶节点可以被一棵子树所替代,反之亦然。实际上,每一种递归的结构都可以被转化为(或等价于)树形结构。</p>
<!-- #EndEditable -->
</div>
<script src='../lib/footer.js'>
</script>
</body>
<!-- #EndTemplate --></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -