版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号(数值、字符等)的集合。数据元素(数据成员)是数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等数据对象具有相同性质的数据元素(数据成员)的集合数据结构由某一数据对象及该对象中所有数据成员之间的关系组成。记为Data_Structure = D, R其中, D 是某一数据对象, R 是该对象中所有数据成员之间的关系的有限集合。数据类型是指一种类型,以及定义在这个值集合上的一组操作的总称。判断一个算法的优劣主要标准:正确性、可使用性、可读性、效率、健壮性、简单性。算法效率的衡量
2、方法:后期测试,事前估计算法分析是算法的渐进分析简称数据结构包括逻辑结构”和物理结构”两个方面(层次 ):逻辑结构是对数据成员之间的逻辑关系的描述,它可以用一个数据成员的集合和定义在此集合上的若干关系来表示物理结构是逻辑结构在计算机中的表示和实现,故又称存储结构”线性表的定义: n ( 0)个表项的有限序列L = (a1, a2,an ) ai 是表项, n 是表长度。第一个表项是表头,最后一个是表尾。线性表的特点:表中元素的数据类型相同;线性表中,结点和结点间的关系是一对一的,有序表和无序表线性表的存储方式。一,顺序存储方式,二,链表存储方式。顺序表的存储表示有2 种方式:静态方式和动态方式
3、。顺序表的定义是:把线性表中的所有表项按照其逻辑顺序依次存储到从计算机存储中指定存储位置开始的一块连续的存储空间中。顺序表的特点:用地址连续的一块存储空间顺序存放各表项,各表项的逻辑顺序与物理顺序一致,对各个表项可以顺序访问,也可以随机访问。单链表是一种最简单的链表表示,也叫线性链表,用她来表示线性表时,用指针表示结点间的逻辑关系。特点:是长度可以很方便地进行扩充。连续存储方式(顺序表)特点:存储利用率高,存取速度快缺点:插入、删除等操作时需要移动大量数据:链式存储方式(链表)特点:适应表的动态增长和删除。缺点:需要额外的指针存储空间单链表的类定义:多个类表达一个概念(单链表 ) 。分为:链表
4、结点 (ListNode )类,链表 (List ) 类。循环链表的概念:是另一种形式的表示线性表的链表,它的结点结构与单链表相同,与单链表不同的是链表中表尾结点的 LINK 域中不是NULL ,而是存放了一个指向链表开始结点的指针,这样,只要知道表中任何一个结点的地址,就能遍历表中其他任何一结点。双向链表的概念:在双向链表的没饿结点中应有两个链接指针作为它的数据成员:1LINK 指示它的前驱结点, RLINK指示它的后继结点,因此,双向链表的每个结点至少有3 个域: 1LINK (前驱指针 )DADA (数据) RLINK (后继指针)。栈:定义为只允许在表的末端进行插入和删除的线性表。特点
5、是:后进先出。递归的定义:若一个对象部分地包含它自己,或用它自己给自己定义 ,则称这个对象是递归的;若一个过程直接地或间接地调用自己 ,则称这个过程是递归的过程。 以下三种情况常常用到递归方法一。定义是递归的二。 数据结构是递归的三问题的解法是递归的。队列:队列是只允许在一端删除,在另一端插入的顺序表允许删除的一端叫做队头,允许插入的一端叫做队尾。特性:先进先出。优先级队列:是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。多维数组是一维数组的推广。多维数组是一维数组的推广。多维数组的特点是每一个数据元素可以有多个直接前驱和多个直接后继。数组元素的下标一般具有固定的下
6、界和上界,因此它比其他复杂的非线性结构简单。字符串是 n ( 0)个字符的有限序列,记作 S : “c1c2c3 c 其中, S 是串名字 c1c2c3 ?cn"是串值 ci 是串中字符 n 是 串的长度, n= 0 称为空串。广义表是 n ( >0 ) 个表元素组成的有限序列,记作LS ( a1, a2, a3, an ) , LS 是表名, ai 是表元素,可以是表(称为 子表),可以是数据元素(称为原子)。 n 为表的长度。 n = 0 的广义表为空表。 n > 0 时,表的第一个表元素称为广义表的表头( head ), 除此之外,其它表元素组成的表称为广义表的表尾
7、(tail有根树:一棵有根树 T, 简称为树,它是n (n0) 个结点的有限集合。当 n = 0 时, T 称为空树;否则, T 是非空树, 记作 T= 空集 n=0r,T1,T2 .Tn,n>0欢迎下载r 是一个特定的称为根 (root ) 的结点,它只有直接后继,但没有直接前驱;根以外的其他结点划分为m ( m 0 )个互不相交的有限集合 T1, T2, ,Tm ,每个集合又是一棵树,并且称之为根的子树。每棵子树的根结点有且仅有一个直接前驱,但可以有 0 个或多个直接后继二叉树的定义 : 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树
8、的、互不相交的二叉树组成。完全二叉树 :一若设二叉树的深度为k, 则共有 k 层。除第 k 层外,其它各层( 1? k-1 )的结点数都达到最大个数,第 k 层从右向左连续缺若干结点,这就是完全二叉树二叉树的遍历就是按某种次序访问树中的结点,要求每个结点访问一次且仅访问一次。设访问根结点记作V 遍历根的左子树记作L 遍历根的右子树记作R。则可能的遍历次序有:前序VLR 镜像 VRL ; 中序 LVR 镜像 RVL ; 后序 LRV 镜像 RLV前序遍历二叉树算法的框架是:若二叉树为空,则空操作;否则访问根结点( V); 前序遍历左子树(L); 前序遍历右子树(R) 。遍历结果 -+ a * b
9、 - c d / e f树的后根次序遍历 : 当树非空时依次后根遍历根的各棵子树访问根结点:树后根遍历EFBCGDA ; 对应二叉树中序遍历EFBCGDA ; 树的后根遍历结果与其对应二叉树。表示的中序遍历结果相同:树的后根遍历可以借助对应二叉树的中序遍历算法实现最小堆和最大堆:如果有一个关键码集合K=K0,K1,K2 , K3 ,.,Kn-1 ,把它的所有元素按完全二叉树的顺序存储方式存放在一个一维数组中。并满足Ki < K2i+1 且 Ki < K2i+2 ( 或者 Ki > K2i+1 且 KiK2i+2 ) i=0,1,.(n-2 ) /2,则称这个集合为最小堆或最大
10、堆。堆是最高效的一种数据结构,每次出队列的是优先权最高的元素。用堆实现其存储表示,能够高效运作。堆的建立:有 2 种方式建立最小的堆,一种方式是通过第一个构造函数建立一个空堆,其大小通过动态存储分配得到,另一中建立最小堆的方式是通过第二个构造函数复制一个记录数组并对其加以调整形成一个堆。路径:从树中一个结点到达另一个结点之间的分支构成该两结点之间的路径。路径长度:是指路径上的分支条数,树的路径长度是从树的根结点到每一个结点的路径长度之和。由树的定义,从根结点到达书中每一结点有且仅有一条路径。Huffman 树:带权路径长度最小的二叉树应是权值大的外结点离根结点最近的扩充二叉树。带路径长度最小的
11、扩充二叉树不一定是完全二叉树。集合是成员 (元素)的一个群集。集合中的成员可以是原子(单元素 ),也可以是集合。字典是一些元素的集合,每个元素有一个称作关键码(key )的域,不同元素的关键码互不相同。散列方法:理想的搜索方法是可以不经过比较,一次直接从字典中得到要搜索的元素。如果在元素存储位置与其关键码之间建立一个确定的对应函数关系Hash () , 使得每个关键码与结构中一个唯一的存储位置相对应:Address =Hash (key ) 。在插入时依此函数计算存储位置并按此位置存放。在搜索时对元素的关键码进行同样的计算,把求得的函数值当做元素存储位置,在结构中按此位置搜索。这就是散列方法。
12、在散列方法中所用转换函数叫做散列函数。按此方法构造出来的表叫做散列表。使用散列方法进行搜索不必进行多次关键码的比较,搜索速度比较快 ,可以直接到达或逼近具有此关键码的表项的实际存放地址。散列函数是一个压缩映象函数。关键码集合比散列表地址集合大得多。因此有可能经过散列函数的计算,把不同的关键码映射到同一个散列地址上,这就产生了冲突搜索就是在数据集合中寻找满足某种条件的数据对象。搜索的结果通常有两种可能:搜索成功,即找到满足条件的数据对象。这时,作为结果,可报告该对象在结构中的位置,还可给出该对象中的具体信息。搜索不成功,或搜索失败。作为结果,应报告一些信息,如失败标志、位置等搜索结构通常称用于搜
13、索的数据集合为搜索结构,它是由同一数据类型的对象(或记录 )组成。在每个对象中有若干属性,其中有一个属性,其值可唯一地标识这个对象。称为关键码。使用基于关键码的搜索,搜索结果应是唯一的。但在实际应用时,搜索条件是多方面的,可以使用基于属性的搜索方法,但搜索结果可能不唯一。实施搜索时有两种不同的环境。静态环境,搜索结构在插入和删除等操作的前后不发生改变。静态搜索表动态环境,为保持较高的搜索效率,搜索结构在执行插入和删除等操作的前后将自动进行调整,结构可能发生变化。动态搜索表顺序搜索主要用于在线性表中搜索。设若表中有CurrentSize 个元素,则顺序搜索从表的先端开始,顺序用各元素的关键码与给
14、定值x 进行比较若找到与其值相等的元素,则搜索成功,给出该元素在表中的位置。若整个表都已检测完仍未找到关键码与x 相等的元素,则搜索失败。给出失败信息二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:1 每个结点都有一个作为搜索依据的关键码( key ),所有结点的关键码互不相同。2 左子树(如果非空)上所有结点的关键码都小于根结点的关键码。3 右子树(如果非空)上所有结点的关键码都大于根结点的关键码。4 左子树和右子树也是二叉搜索树。欢迎下载二叉搜索树为二叉排序树如果对一棵二叉搜索树进行中序遍历,可以按从小到大的顺序,将各结点关键码排列起来,所以也称二叉搜索树为二叉排序树在二叉搜索树上进
15、行搜索,是一个从根结点开始,沿某一个分支逐层向下进行比较判等的过程。它可以是一个递归的过程。假设想要在二叉搜索树中搜索关键码为x 的元素,搜索过程从根结点开始。如果根指针为NULL ,则搜索不成功;否则用给定值x 与根结点的关键码进行比较:若给定值等于根结点关键码,贝U 搜索成功,返回搜索成功信息并报告搜索到结点地址。若给定值小于根结点的关键码,贝U 继续递归搜索根结点的左子树;否则。递归搜索根结点的右子二叉搜索树的插入算法:为了向二叉搜索树中插入一个新元素,必须先检查这个元素是否在树中已经存在。在插入之前,先使用搜索算法在树中检查要插入元素有还是没有。如果搜索成功,说明树中已经有这个元素,不
16、再插入;如果搜索不成功,说明树中原来没有关键码等于给定值的结点,把新元素加到搜索操作停止的地方。图定义:图是由顶点集合 (vertex) 及顶点间的关系集合组成的一种数据结构:Graph = ( V, E ) 其中 V = x | x 某个数据对象 是顶点的有穷非空集合;E = (x, y) | x, y V 或 E = < x, y> | x, y V && Path (x, y),是顶点之间关系的有穷集合,也叫做边 (edge) 集合。 Path (x, y) 表示从 x 到 y 的一条单向通路 ,它是有方向的。有向图与无向图:在有向图中,顶点对<x, y
17、> 是有序的。在无向图中,顶点对(x, y) 是无序的。完全图:若有 n 个顶点的无向图有n(n-1)/2 条边 ,则此图为完全无向图。有n 个顶点的有向图有n(n-1) 条边 ,则此图为完全有向图在图的邻接矩阵表示中,有一个记录各个顶点信息的顶点表,还有一个表示各个顶点之间关系的邻接矩阵。邻接表是邻接矩阵的改进形式。为此需要把邻接矩阵的各行分别组织为一个单链表。在邻接表中,同一个顶点发出的边链接在同一个边链表中,每一个链结点代表一条边( 边结点 ),结点中有另一顶点的下标dest 和指针 link。对于带权图,边结点中还要保存该边的权值cost 。顶点表的第 i 个顶点中保存该顶点的数
18、据,以及它对应边链表的头指针adj最短路径问题:如果从图中某一顶点( 称为源点 ) 另一顶点 ( 称为终点 ) 的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。排序:将一组杂乱无章的数据按一定的规律顺次排列起来。数据表 (datalist): 它是待排序数据元素的有限集合。排序码 (key): 通常数据元素有多个属性域,即多个数据成员组成 ,其中有一个属性域可用来区分元素,作为排序依据。该域即为排序码。每个数据表用哪个属性域作为排序码,要视具体的应用需要而定。插入排序基本方法是:每步将一个待排序的元素,按其排序码大小,插入到前面已经排好序的一组元素的适当位置上,直到
19、元素全部插入为止。欢迎下载链表1、单链表中的插入与删除第一种情况:在第一个结点前插入第二种情况 :在链表中间插入第三种情况:在链表末尾插入newno de link = first ;newno de T link = p T link;newno de T link = p T link;first = newno de ;pT link = newno de;pT link = last = newno de ;2、链表插入算法实现3、链表结点删除算法int List: Insert ( const int x, const int i ) int List: Remove ( int/在
20、链表第 i 个结点处插入新兀素xNode *p = first , *q ;i ) / 在链表中删除第 i 个结点 int k = 0;ListNode *p = first ; int k = 0;while ( p != NULL && k< i-1 )while ( p != NULL && k < i -1 ) p = pT linkk+; 找第 i-1 个结点 p = p Tlink; k+;/找第 i-1 个结点if ( p = NULL |pT link = NULL ) if ( p = NULL && first !
21、= NULL ) cout << 无效的删除位置 !n ”;cout << 无效的插入位置n ;return 0;return 0;if ( i = 0 ) 删除表中第 1 个结点ListNode *newnode= new ListNode(x, NULL);q = first ;/q 保存被删结点地址创建新结点 ,其数据为 x,指针为 0p = first = firstT link ;/修改 firstif ( first = NULL | i = 0 ) newnode link /插在表刖irr rr 人I I t=t = first ;else 删除表中或表
22、丿毛兀素if ( first = NULL ) last = newnode;q = pT link;first = newnode ;pTlink = q Tlink;重新链接if ( q = last ) last = p;/可能修改 lastelse 插在表中或木尾newnode link = p T link;k = q T data;if ( p T link = NULL ) last = newnode ;delete q;删除 qp link = newnode ; return k;Treturn 1;在带表头结点的单链表,第一个结点前插入新结点从带表头结点的单链表中删除第一
23、个结点newnode Tlink = p Tlink;q = p T link; p T link=q T link ;if ( p T link = NULL ) last = newnode;delete q;pT link = newnode ;if ( p T link = NULL)last = p ;排序直接插入排序的算法折半插入排序的算法#include "dataList.h"template <class T >void InsertSort (dataList <T>& L, int left, int right) 依次
24、将兀素 L.Vectori 按其排序码插入到有序表L.Vectorleft, 丄 .Vecto 中, 使得/L.Vectorleft 到 L.Vectori 有序。Element<T> temp; int i, j;for (i = left + 1; i <= right; i+)if (Li < Li-1) temp = Li ; j = i-1;do Lj+1 = Lj ;j-; while (j >= left && temp < Lj); Lj+1 = temp;#include "dataList.h"temp
25、late <class T >void BinaryinsertSort (dataList <T>& L,const int left, const int right) 利用折半搜索 , 在 L.Vectorleft 到 L.Vectori-1 中查找 L.Vectori 应插入的位置 ,再进行插入。Eleme nt<T > temp;int i, low , high, middle, k;for (i = left+1 ; i <= right; i+) temp = Li ; low = left; high = i-1;while
26、(low <= high) 折半搜索插入位置middle = (low+high)/2 ; /取中点if (temp < Lmiddle)/插入值小于中点值high = middle-1;/向左缩小区间欢迎下载/对表排序将表转换为堆进行排序 , 使得表;堆排序的算法template <class T >void HeapSort (dataList <T >& L) 对表 L.Vector0 到 L.Vectorn-1中各个兀素按其排序码非递减有序int i, n = L.length();for (i = (n-2)/2; i >= 0; i
27、-)siftDown (L , i, n-1); for (i = n-1; i >= 0; i-) L.Swap(0 , i); siftDown (L, 0 , i-1); ;希尔排序的算法#include "dataList.h"template <class T >void Shellsort (dataList <T>& L,const int left, const intright) int i, j, gap = right-left+1 ;/增量的初始值Eleme nt<T > temp;do gap =
28、gap/3+1;/求下一增量值for (i = left+gap; i <= right; i+)if (Li < Li -gap) 逆序temp = Li ; j = i-gap;do Lj+gap= :Lj ; j = j-gap; while (j >= left && temp < Lj); Lj+gap = temp; / 将 vectori 回送J while (gap > 1);两路归并算法#include "dataList.h"template <class T >void merge (dataL
29、ist<T>& L1 , dataList<T>& L2,else low = middle+1 ;/否则 , 向右缩小区间for (k = i-1; k >= low; k-) Lk+1 = Lk;/成块移动 ,空出插入位置Llow = temp;/ 插入;直接选择排序的算法#include "dataList.h"template <class T >void SelectSort (dataList<T>& L,const int left, const int right) for (in
30、t i = left; i < right; i+) int k = i;/在 Li 到 Ln-1 找最小排序码兀素for (int j = i+1 ; j <= right;j+)if (Lj < Lk) k = j;if (k != i) Swap (Li , Lk) ; /交换 ;起泡排序的算法template <class T >void BubbleSort (dataList <T > & L, con st int left,const int right) int pass = left+1, excha nge = 1;while (pas
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制造业务员工作总结
- 酒店管理岗位考核
- 美容行业前台接待工作总结
- 教师团队专业培训
- 厨具行业采购工作总结
- 2024年设备监理师考试题库带答案
- 2024年热的传递教案设计
- 创意市集活动赞助合同(2篇)
- DB33T 2111-2018 福利彩票视频型彩票销售管理规范
- 安徽省阜阳市阜南县2025届中考三模生物试题含解析
- 新产品试制流程管理办法
- 王牌电话交换机说明书
- 列管式换热器-换热面积计算
- 10个地基基础工程质量通病及防治措施
- 25m预应力混凝土简支T梁桥设计(共30页)
- 篮球校本课程教案
- 高一学生文理分班意向表
- 高等传热学部分答案
- 地球物理学进展投稿须知
- 机床精度检验标准 VDI3441 a ISO230-2
- 解析电力施工项目的信息化管理
评论
0/150
提交评论