数据结构期末复习总结.pdf
《数据结构期末复习总结.pdf》由会员分享,可在线阅读,更多相关《数据结构期末复习总结.pdf(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1章 绪论1.数据(D ata):是描述客观事物的数字、字符以及所有能输入到计算机中并能被计算机接受的各种符号集合的统称。包括数值数据和非数值数据(字符串、图形、图像、音频、视频)。2.数据元素(D ata E lement):表示一个事物的一组数据称为一个数据元素(结点顶点、记录);数据元素是数据的基本单位。3.数据项(D ata Item):是数据元素中有独立含义的、不可分割的最小标识单位(字段、域、属性)。一个数据元素可由若干个数据项组成。4.数据对象(D ata Object):是性质相同的数据元素的集合,是数据的一个子集。如字符集合C=A,B,C,。数据(D ata):是描述客观事
2、物的数字、字符以及所有能输入到计算机中并能被计算机接受的各种符号集合的统称。包括数值数据和非数值数据(字符串、图形、图像、音频、视频)。数据元素(D ata E lement):表示一个事物的一组数据称为一个数据元素(结点、顶点、记录);数据元素是数据的基本单位。数 据 项(D ata Item):是数据元素中有独立含义的、不可分割的最小标识单位(字段、域、属性)。一个数据元素可由若干个数据项组成。数据对象(D ata Object):是性质相同的数据元素的集合,是数据的一个子集。如字符集合 C=A,B,C,。单击此处添加文本f数据数 据的逻辑结构指数据元素之间的逻辑关系,用一个数据元素的集合
3、和定义在此集合上的若干关系来表示。四种逻辑结构:集合、线性结构、树型结构、图状结构。数据结构的形式定义是一个二元组:D ata-Structure=(D,S)其中:D 是数据元素的有限集,S 是 D 上关系的有限集。例1:设数据逻辑结构B=(K,R)K=kiz k2z/k9R=,数据结构(D ata S tructure):是指相互之间具有(存在)一定联系(关系)的数据元素的集合。数据结构包括三个方面/1.数据的逻辑结构2.数据的存储结构 3.数据的操作 集合 线性结构 树结构H3)图 顺 序存储 链式存储 索引存储 散列存储查找、插入、删除、修改、排序例2:有一种数据结构B 1 =(D,R)
4、,其中:D=1,5,8,1 2,20,26,3 4)R=rr=,)有时候关系图不唯一(一般是无向图)数据结构在计算机内存中的存储包括数据元素的存储和元素之间的关系的表示。两种不同的存储结构:顺序存储结构和链式存储结构。顺序结构:数据元素存放的地址是连续的;链式结构:数据元素存放的地址是否连续没有要求,用该指针来表示数据元素之间的逻辑结构(关系)。顺序存储一使用一组连续的内存单元依次存放数据元素,元素在内存中的物理存储次序体现它们的逻辑次序。通常使用程序设计语言中的数组来实现。i n d e x数据元素0IMn-存储地址lQ C(q)L oclaol+cL ocS ohH.I )XcL o c
5、Q A i X cL oc(oo)+(,+1)XcL oc(a()+(w-l)Xcoc(q)=Loc(aQ)+zxc链式存储一使用若干地址分散的存储单元存储数据元素,逻辑上相邻的数据元素在物理位置上不一定相邻。数据元素间的逻辑关系通过结点间的链接关系来体现。通常使用指针记载直接前驱元素或直接后继元素的存储地址。数据操作指对一种数据结构中的数据元素进行各种运算或处理。每种数据结构都有一组数据操作。初始化。判断是否空状态。统计元素的个数。遍历:按某种次序访问所有元素,每个元素只被访问一次。取值:获取指定元素值。置值:设置指定元素值。插入:增加指定元素。删除:移去指定元素。查找:在数据结构中寻找满足
6、给定条件的数据元素。排序:将数据元素数据操作定义在数据的逻辑结构上;数据操作的实现依赖于数据的存储结构。数据结构三方面的关系:数据的逻辑结构、数据的存储结构及操作这三方面是一个整体例6:线性表是一种逻辑结构,若采用顺序存储,可称其为顺序表;若采用链式存储,则可称其为链表;若采用散列存储,则可称为散列表。在给定了数据的逻辑结构和存储结构之后,按定义的操作集合及其操作的性质不同,也可能导致完全不同的数据结构。类 型(t y p e)是具有相同逻辑意义的一组值的集合。数据类型是指一个类型和定义在这个类型上的操作集合。数据类型定义了数据的性质、取值范围以及对数据所能进行的各种操作例7:J a v a中
7、整型类型i n t的值集是-23 1,,-2,-1,0,1,2,,2 3 1-1 这个值集上的操作集合逻 辑 结 构线性表V物 理 结 构学 顺序存储结构树 -口 链式存储结构图-复合存储结构逻辑结构与所采用的存储结构数据逻辑结构层次关系图 抽 象数据类型(A bstract D ata Type,简称A D T):是指一个数学模型以及定义在该模型上的一组操作。A D T的定义仅是一组逻辑特性描述,与其在计算机内的表示和实现无关。因此,不论A D T的内部结构如何变化,只要其数学特性不变,都不影响其外部使用。A D T的形式化定义是三元组:A D T=(D,S,P)其中:D 是数据对象,S 是
8、 D 上的关系集,P 是对D 的基本操作集。A D T的一般定义形式是:A D T 抽象数据类型名 数据对象:数据对象的定义数据关系:数据关系的定义基本操作:基本操作的定义A D T 抽象数据类型名例 8:复数抽象数据类型描述如下:A D T C omplexdouble realjmag;C omplex(double real,double imag);C omplex add(C omplex c);C omplex sub(C omplex c);)2、算法定义:一个算法(algorithm)是一个有穷规则的集合,其规则确定一个解决某一特定类型问题的操作序列(D.Knuth)。算法的规
9、则必须满足以下5 个特性:有 穷 性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。确 定 性:算法中每一条指令必须有确切的含义。不存在二义性。且算法只有一个入口和一个出口。可 行 性:一个算法是能行的。即算法描述的操作都可以通过已经实现的基本运算执行有限次来实现。输 入:一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。输 出:一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。2、算法设计目标-正 确性-健壮性-高时间效率-高空间效率-可读性3、算法描述 自然语言描述 伪码描述传 统流程图描述 程序设计语言描述(本课程选Java)4、算法与数据结构
10、 算法建立在数据结构之上,对数据的操作需用算法来描述。算法设计依赖数据的逻辑结构,算法实现依赖数据的存储结构。实现一种抽象数据类型,需要选择合适的存储结构。求解同一问题可能有许多不同的算法,如何去评价这些算法的优劣?主要考虑如下三点:A.执行算法所耗费的时间;B.执行算法所耗费的存储空间,其中主要考虑辅助存储空间;C.算法应易于理解,易于编码,易于调试等等。1、时间代价分析算法的时间效率指算法的执行时间随问题规模的增长而增长的趋势,通常采用时间复杂度来度量算法的时间效率,用大。表示法来记:T(n)=O(7(n)例 1 void fun()+x;s=0;)将x自增看成是基本操作,则语句频度为1,
11、即时间复杂度为0(1)。如果将s=0也看成是基本操作,则语句频度为2,其时间复杂度仍为0(1),即常量阶。一个简单语句的时间复杂度为0(1)。例 2 for(i=l;i=n;+i)+x;s+=x;语句频度为:2 n,其时间复杂度为:0(n),即为线性阶。一个循环的时间复杂度为。()。例 3 for(i=l;i=n;+i)for(j=l;j=n;+j)+x;s+=x;)语句频度为:2n2 ,其时间复杂度为:0(M),即为平方阶。定理:A(n)=a mn m+a m-i n m+.+ain+a()是一个 m 次多项式,则 A(n)=O(nm)例4两个n阶方阵的乘法for(i=l,i=n;+i)fo
12、r(j=l;j=n;+j)cij=O;for(k=l;k=n;+k)ciU+=aik*bkQ;)由于是一个三重循环,每个循环从1到n,则总次数为:nXnXn=n3时间复杂度为T(n)=O(n3)例 5 for(i=2;i=n;+i)for(j=2;j=i-l;+j)+x;ai,j=x;)语句频度为:1+2+3+n-2=(l+n-2)X(n-2)/2=(n-l)(n-2)/2=M-3n+2时间复杂度为0(M),即此算法的时间复杂度为平方阶。例 6:int n=8,count=0;for(int i=l;i=n;i*=2)for(int j=l;j=n;j+)count+;循环次数为。时间复杂度为
13、O(nlog2n)。例 7:int n=8,count=0;for(int i=l;i=n;i*=2)for(int j=l;j=i;j+)count+;总的循环次数为。时间复杂度为0(n)。以下六种计算算法时间的多项式是最常用的。其关系为:0(l)0(log n)O(n)O(n log n)O(n2)O(n3)指数时间的关系为:0(2n)0(n!)0时,将非空的线性表记作:(a0,ai,an.i)线性表的顺序表示指的是一组地址连续的存储单元依次存储线性表的数据元素。用顺序存储实现的线性表称之为顺序表。线性表的逻辑顺序与物理顺序一致。顺序表是一种随机存取结构。通常采用数组存储数据元素。设线性表
14、的每个元素需占用c个存储单元。oc(q)=ocQ )+zxcin dex数据元素存储地址0的IQCQ)1aL ocS o)+c*L oc(4o)+(i7)Xc/a.L oc(4o)+iXc/+1L ocQ)+(f+l)XcIL oc(a()+0 L l)Xcpublic boolean isEmpty()时间复杂度 0(1)return this.len=0;)public int length()时间复杂度 0(1)return this.len;)public T get(int i)时间复杂度 0(1)if(i=0&i=0&kthis.len)this.elementi=x;else t
15、hrow newlndexOutOfBoundsException(i+/#,);)public String toString()时间复杂度 0(n)String str=if(this.len0)str+=this.element0.toString();for(int i=1;i this.len;i+)str+=,+this.elementi.toString();return str+)两个线性表相等是指,它们长度相同并且各对应元素相等。链 式 存 储:用一组任意的存储单元存储线性表中的数据元素。存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中
16、的任意位置上的。链表中结点的逻辑顺序和物理顺序不一定相同。链表中的结点结构:数据域和地址域n个结点构成的链表表示为(a,a i,an-i)链表中每个结点只含一个地址域,又称为线性链表或单链表。每个结点有两个地址域的线性链表称为双链表。单链表是由表头唯一确定,因此单链表可以用头指针的名字来命名。q=P;q=p.next;p=p.next;q.next=p;(a)(b)操作后P.q P.M ali-.操作前操作后P ran-rbn.p q.操作前操作后Pp1.操作前操作后qq.H aH n E Jp-Fcn-.P4CI3-.操作前操作后dal-hrbT.q 操作前pHal.,.q.n ext=p.
17、n ext;q qaT-HrbH-.TaFhrbH-.P-PxT H y R-.操作前 操作后q p.-I al H bl-h.|x|-H vl l.(b)q 操作前p.rar r&TF-nh7nyn-操作后头结点的作用是,使所有链表(包括空表)的头指针非空,则对单链表的插入、删除操作不需要区分操作位置。头结点中不存储数据。头插入和头删除操作不会改变head指针总结-顺序表和链表的比较(1)直接访问元素的性能 顺序表能够直接访问数据元素,即只要给出顺序表底层数组element的下标就可以访问数组中的任何一个数据元素。(随机存取)而链表中不能随机地直接访问大多数元素,只能从链表的第一个结点开始,
18、沿着链的方向,依次查找后续结点,直至到达所需访问的结点。(顺序存取)(2)存储空间的利用 由于需要估计顺序表底层数组element的大小(顺序表的容量),因此顺序表存在存储空间的浪费问题。顺序表在进行插入操作时,要判断顺序表是否为满。如果满,则需要扩充容量。而链表每插入一个结点,就向系统申请一个存储单元,只要系统资源足够,系统就会为该结点分配存储空间。(3)存储密度 存储密度(Storage Density)是指结点数据本身所占的存储量和整个结点结构所占的存储量之比,即:(结点数据本身所占的存储量)(整个结点所占的存储总量)顺序表的全部空间都用来存放数据元素,因此存储密度=1;而链表中每个结点
19、都要包含其后继结点或者前驱结点的链,因此存储密度|ist)/深拷贝(this();创建只有头结点的空链表Node p=list.head.next;Node rear=this.head;打算使用尾插入法while(p!=nullXrear.next=new Node(p.data,null);rear=rear.next;rear指向队尾结点p=p.next;)b)深拷贝,复制单链&mt中的所有结点,没有复制元素对象,导致两个结点引用同一个元素对象1 1循环单链表public class CirSinqlvLinkedListhead头结点(a)空循环单链表public Node head;
20、头指针public CirSinalvLinkedList()构造空表.如图(a)this.head=new Node();创建头结点this.head.next=this.head;构成环形)public boolean isEmptvO(判空return this.head.next=this.head;)public String toStrinqO /遍历,循环条件改变了for(Node p=this.head.next;p!=this.head;p=p.next)System.out.Drintin(p.data.toStrinq()+“);)第4章 栈 和 队 列栈的定义:-栈(S
21、tack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行。通常称允许插入、删除操作的这一端为栈顶(T o p),不允许操作的一端称为栈底(Bottom)。当表中没有元素时称为空栈。-假设栈S=(a,a i,a2,a3,.a z),则a0称为栈底元素,a i为栈顶元素,标识栈顶位置的指针称为栈顶指针。栈中元素按a。,a,a2)a3,.a a的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈称为后进先出表(LIF。)。栈的操作:-习惯上将每次删除(也称为退栈)操作又称为出栈或弹出(P O P)操作。删除的元素总是当前栈中“最新”的元素(栈顶
22、元素)。-每次插入(称为进栈)操作称为入栈或压入(P U S H)操作,入栈的元素总是当前栈中“最新”的元素。-在空栈中最先插入的元素总被放在栈的底部,只有所有元素被弹出之后它才能被删除。栈的数据元素:栈的数据元素和线性表的数据元素完全相同,即栈的数据元素是n(n=0)个相同类型的数据元素a。,a i,。a组成的有限序列,记为:a。,am。-其中,n为数据元素的个数,称为栈的长度。n=0时,为空栈。栈的溢出:-当栈满时进栈运算称为“上溢”。-当栈空时退栈运算称为“下溢”。-栈上溢是一种出错状态,应该设法避免之;而下溢则可能是正常现象,通常下溢用来作为程序控制转移的条件。由于栈是运算受限的线性表
23、,因此线性表的存储结构对栈也适应。栈的顺序存储结构简称为顺序栈(Sequential Stack),它是运算受限的线性表。因此,可用数组来实现顺序栈。因为栈底位置是固定不变的,所以可以将栈底位置设置在数组的两端的任何一个端点;栈顶位置是随着进栈和退栈操作而变化的,一般需用一个整型变量top。栈的顺序存储结构及操作实现public class SeqStack implements Stack 顺序栈类,实现栈接 口(Object element;存储栈数据元素的数组int top;栈顶元素下标)注意:element数组存储栈的数据元素;top表示当前栈顶元素的下标。经典实现:(1)栈的初始化p
24、ublic SeqStack(int size)构造容量为 size 的空栈this.element=new ObjectMath.abs(size);this.top=-1;)public SeqStackO 构造默认容量的空栈(this(64);(2)判读栈是否为空public boolean isEmpty()判断栈是否空,若空返回truereturn this.top=-l;判读栈是否为满?本实现采用与顺序表同样的处理:当容量不够时,则将数组容量扩充一倍。(3)入栈public void push(T x)元素x 入栈,空对象不能入栈if(x=null)return;空对象不能入栈if
25、(this.top=element.length-1)若栈满,则扩充栈容量Object temp=this.element;重新申请一个容量更大的数组this.element=new Objecttemp.length*2;for(int i=0;itemp.length;i+)复制数组元素,0(n)this.elementi=tempi;)this.top+;this.elementthis.top=x;(4)出栈栈不空时,取走top位置处栈顶元素,top减 1,下一位置数据元素作为新的栈顶元素public T pop()出栈,返回栈顶元素,若栈空返回nullreturn this.top=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 期末 复习 总结
限制150内