ImageVerifierCode 换一换
格式:DOCX , 页数:64 ,大小:3.97MB ,
资源ID:6944200      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6944200.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法与数据结构知识点总结.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法与数据结构知识点总结.docx

1、算法与数据结构知识点总结算法与数据结构知识点总结 学习目标1.熟练掌握基本的数据结构2.理解相关操作的算法实现3.掌握算法的复杂度分析方法4.领会从数据结构的设计和实现角度优化解决实际问题的思想 相关术语&基础知识1.数据、数据元素数据:对客观事物的符号表示,所有能输入到计算机中并被计算机程序处理的符号的总称。数据元素:组成数据的、具有意义的基本单位,计算机中通常作为整体处理。2.数据项组成数据的不可分割的最小单位3.数据对象性质相同的数据元素的集合,是数据的子集4.逻辑结构数据对象中数据元素之间的逻辑关系;是从操作对象抽象出来的数学模型5.物理结构(存储结构)数据元素逻辑关系在计算机中的表示

2、(映像);包括数据元素的表示和逻辑关系的表示;关系到数据操作的实现6.数据类型数据类型是一个值的集合和定义在这个值集上的一组操作的总称。7.抽象数据类型(ADT)是指一个数据模型以及定义在该模型上的一组操作。三要素:数据元素、逻辑关系、操作8.算法的设计原则正确性、可读性、健壮性、高效率与低存储量9.算法效率的度量10.常见结构的时间复杂度(1)顺序结构 O(1)(2)分支结构 O(1)(3)循环结构的时间复杂度 = 循环体内语句的频度(重复执行次数)11.时间复杂度的计算时间复杂度的简化求解步骤step 1. 定位最深层循环step 2. 由内向外逐层计算循环体的执行频度step 3. 只保

3、留最高阶项step 4. 去掉最高阶项系数得到的结果即为时间复杂度的大O阶。12.时间复杂度的大小关系13.影响空间复杂度的因素(1)程序本身所占空间(2)输入数据所占空间(3)辅助变量所占空间若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间。 对知识掌握的四种程度1.了解:选择题2.理解:知道原理,题里可能有拐弯的地方3.掌握:算法语句填空4.熟练掌握:整.个.算.法.PS:以下,“要求”会展开详细内容;若无必要,“考点”不展开详细内容。一、线性表 考点:1.线性表的逻辑结构和各种存储表示方法2.定义在逻辑结构上的各种基本运算(知道名字即可)

4、InitList(*L)操作结果:初始化一个空的线性表L。DestroyList(*L)初始条件:线性表L 已经存在。操作结果:销毁线性表L。ClearList(*L)初始条件:线性表L 已经存在。操作结果:将L 清空为空表。ListEmpty(L)初始条件:线性表L 已经存在。操作结果:若L 为空返回true,否则返回false。ListLength(L)初始条件:线性表L 已经存在。操作结果:返回线性表L 的元素个数。GetElem(L,i,*e)初始条件:线性表L 已经存在,i1, ListLength ( L )。操作结果:将L 中第i 个位置的元素返回给e。LocateElem(L,

5、e,compare ( ))初始条件:线性表L 已经存在。操作结果:在L 中查找与给定值e 满足关系compare ( ) 的元素,无参数compare()默认为相等关系,找到后返回其第一个元素的位序,查找失败返回0。ListInsert(L,i,e)初始条件:线性表L 已经存在,i1, ListLength ( L )+1。操作结果:在L 中第i 个位置插入新元素e,L 的长度加1。ListDelete(L,i,*e)初始条件:线性表L 已经存在且非空,i1, ListLength ( L )。操作结果:删除L 中第i 个位置元素,并用e 返回其值,L 的长度减1。3.在各种存储结构上如何实

6、现这些基本运算4.各种基本运算的时间复杂性 要求:1.理解两种存储结构各自的特点、优缺点、适用范围2.熟练掌握顺序表和单链表上建表、插入、删除、查找操作的算法实现及相关的复杂度分析顺序表建表Status ListCreat(SqList * L) /*从屏幕逐位读入数据生成顺序表*/ int n , i; printf(请输入顺序表L 的数据个数:n) ; scanf(%d, &n) ; if (n MAXSIZE) printf(n 数据个数过长,请不要超过%d!n,MAXSIZE); return ERROR; else if(n0) printf(n输入不合法n); return ERR

7、OR; for(i=0 ; i n ; i+) printf(data%d = , i) ; scanf(%d,&(*L).datai); (*L).length=n; printf(n) ; return OK;时间复杂度:O(n)插入/* 初始条件:线性表L 已经存在,i1, ListLength ( L ) */* 操作结果:将L 中第i 个位置插入新元素e,L 长度加1 */int ListInsert SqList L, int i , ElemType eint k;if ( L.length = MAXSIZE) /*顺序表已满*/return ERROR;if ( i L.le

8、ngth + 1 ) /* i 不合法 */return ERROR;if ( i =i-1; k- )L.data k+1 = L.data k; /* 从后向前逐位后移 */L.data i-1 = e; /* 插入新元素e */L.length+;return OK;时间复杂度:最好O(1) 最坏O(n) 平均O(n) (依赖于插入位置i、表长n)删除/* 初始条件:线性表L 已经存在,i1, ListLength ( L ) */* 操作结果:将L 中第i 个位置元素删除,并用e 返回该元素的值,L长度减1 */int ListDelete SqList L, int i , Elem

9、Type *eint k;if ( L.length = 0 ) /*顺序表为空*/return ERROR;if ( i L.length ) /* i 不合法 */return ERROR;*e = L.data i-1; /* 用e 返回删除元素的值 /if ( i L.length ) /* 删除位置不是表尾 */for ( k =i; k length; k+ )L.data k-1 = L.data k; /*删除位置后继元素逐一前移*/L.length-;return OK;时间复杂度:最好O(1) 最坏O(n) 平均O(n) (依赖于插入位置i、表长n)查找(按位获取操作)#

10、define OK 1# define ERROR 0/* 初始条件:线性表L 已经存在,i1, ListLength ( L ) */* 操作结果:将L 中第i 个位置的元素返回给e */int GetElem SqList L, int i , ElemType *eif ( L.length = 0 | i L.length)return ERROR;*e = L.data i-1;return OK;时间复杂度:O(1)单链表建表Node* ListCreatTail() /*尾插法建立带头结点的单链表,链表长度为n,链表元素从屏幕读取,返回头结点位置*/ LinkList p,r,L

11、; int n,i; ElemType d; L = (LinkList)new Node; printf(n请输入链表L 的数据个数:n) ; scanf(%d, &n) ; L-data = n; L-next = Null; r = L; for(i=1 ; i data = d; p-next = Null; r-next = p; r = p; printf(nNode%d=%dn,i,p-data); printf(n) ; return L;时间复杂度:O(n)插入链表的插入:一定,二建,三后,四前Status ListInsert LinkList L, int i , Ele

12、mType eNode * p, *q;p = GetElem ( L, i-1 );if ( p = Null) /*链表为空*/return ERROR;q = (Node*) malloc (sizeof (Node);q-data = e;qnext = pnext;pnext = q;return OK;时间复杂度: O (1)删除链表的删除:一定,二连,三放Status ListDelete LinkList L, int i , ElemType *eNode * p, *q;p = GetElem ( L, i-1 );if ( p = Null | p - next =Nul

13、l ) /*链表为空*/return ERROR;q = p - next;*e = q-data;pnext = q-next;free (q);return OK;时间复杂度: O (1)查找a.按位获取/链表不是随机存取结构Node * GetElem LinkList L, int i int k; /* k 为计数器 */LinkList p; /* 指针p 指向当前结点 */p = L; /* 指针p 指向头结点 */k = 1;while ( p & k next; /* p 指向下一个结点 */+k; /* 计数器加1 */if ( k=i ) /* 结点i 存在 */retu

14、rn p;elsereturn Null;时间复杂度:最好O (1) 最坏O(n)b.按值获取/* 初始条件:线性表L 已经存在*/* 操作结果:定位L 中与给定值相等的元素,返回其位置*/Node * LocateElem LinkList L, ElemType e LinkList p; /* 指针p 指向当前结点 */p = L; /* 指针p 指向头结点 */while ( p & p - data != e )p = p - next; /* p 指向下一个结点 */if ( !p) /* 结点i 不存在 */return Null;elsereturn p;时间复杂度:最好O (

15、1) 最坏O(n)3.了解双向链表和循环链表的定义和特点及插入、删除操作的实现(见书和PPT)二、栈和队列 考点:1.栈和队列的逻辑结构和两种存储表示方法2.定义在逻辑结构上的各种基本运算InitStack(&S)操作结果:初始化一个空的栈S。 DestroyStack(&S) 初始条件:栈S已经存在。 操作结果:销毁栈S。 ClearStack(&S) 初始条件:栈S已经存在。 操作结果:将栈S清空。 StackEmpty(S) 初始条件:栈S已经存在。 操作结果:若栈S为空返回true,否则返回false。 StackLength(S) 初始条件:栈S已经存在。 操作结果:返回栈S的元素个

16、数。 GetTop(S,&e) 初始条件:栈S已经存在且非空。 操作结果:将S的栈顶元素返回给e。 Push(&S,e) 初始条件:栈S已经存在且非空。 操作结果:新元素e入栈。 Pop(&S,&e) 初始条件:栈S已经存在且非空。 操作结果:删除S的栈顶元素,并用e返回其值。3.在各种存储结构上如何实现这些基本运算4.各种基本运算的时间复杂性5.栈的常用应用 要求:1.理解栈和队列的异同点、栈和队列与一般线性表的不同2.了解顺序栈的溢出和顺序队列的假溢问题顺序栈的溢出上溢(overflow):栈满时再压入数据下溢(underflow):栈空时再弹出数据栈满:S.top = MAXSIZE 1

17、空栈:S.top = 13.熟练掌握顺序栈(两栈共享空间)、链栈、循环队列、链队列上的队列初始化、元素插入、删除的算法实现及相关的复杂度分析顺序栈(两栈共享空间)初始化Status InitDuStack(Sqstack &S) S.top1=-1; S.top2=MAXSIZE;return OK;时间复杂度O(1)顺序栈(两栈共享空间)元素插入/* 新元素e 入栈 */Status Push SqDuStack S , SElemType e, int StackNumif ( S.top1 + 1 = S.top2 ) /* 栈满 */return ERROR;if ( StackNum

18、 = 1) /* 新元素压入栈1 */S.top1 +;S.dataS.top1 = e; /* 新元素入栈 */return OK;else if (StackNum = 2)S.top2 -;S.dataS.top2 = e; /* 新元素入栈 */return OK;else return ERROR;时间复杂度O(1)顺序栈(两栈共享空间)元素删除来自网络/若栈不空,则删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERRORStatus Pop(SqDuStack *S , ElemType *e , int stackNumber) if(stackNumber = 1) if

19、(S-top1 = 1) return ERROR; /说明栈1已经是空栈,溢出 *e = S-datas-top1-; /将栈1的栈顶元素出栈 else if(stackNumber = 2) if(S-top2 = MAXSIZE) return ERROR; /说明栈2已经是空栈,溢出 *e = S-dataS-top2+; /将栈2的栈顶元素出栈 return OK;时间复杂度O(1)链栈初始化来自网络void InitLinkStack (linkStack &S)S=new SNode;S-next=NULL;时间复杂度O(1)链栈元素插入/* 新元素e 入栈 */Status P

20、ush ( LinkStack *S , SElemType e )SNode *p = ( SNode * ) malloc ( sizeof (SNode) ); /* 动态申请结点*/p-data = e; /* 结点赋值 */p-next = S-top; /* 新结点插到表头 */S-top = p; /* 栈顶指针改为新结点*/S-length +;return OK;时间复杂度O(1)链栈元素删除/* 栈顶元素出栈 */Status Pop ( LinkStack *S , SElemType *e )StackNode *p;if (StackEmpty(*S)return E

21、RROR;p = S-top; /* p 指向出栈结点*/*e = p-data; /* 返回栈顶元素 */S-top = p-next; /* 栈顶指针下移*/free(p); /* 释放结点空间*/S-length -;return OK;(7)循环队列的初始化/* 队列初始化 */Status IntiQueue ( SqQueue *Q )Q-front = 0;Q-rear = 0;return OK;/* 求队列长度 */int QueueLength (SqQueue Q )return (Q.rear Q.front + MAXSIZE) % MAXSIZE;时间复杂度O(1)

22、(8)循环队列元素插入/* 新元素e 入队列 */Status EnQueue (SqQueue *Q , QElemType e)if (Q-rear+1)% MAXSIZE = Q-front)return ERROR; /* 队满 */Q-dataQ-rear = e; /* 新元素入队 */Q-rear = (Q-rear +1) % MAXSIZE; /* rear 指针后移,若到最后则转到数组头部 */return OK;时间复杂度O(1)(9)循环队列元素删除由书P65修改/队头元素出队StatusDeQueue (SqQueue *Q, QElemType e)if(front

23、=rear) return ERROR; /* 队空 */e=Q-dataQ-front;Q-front = (Q-front +1) % MAXSIZE; /* front 指针后移,若到最后则转到数组头部 */ return OK;(10)链队列的初始化Status InitQueue(LinkQueue &Q) Q.front = Q.rear = ( QNode * ) malloc ( sizeof (QNode) ); if (!Q.front) exit(OVERFLOW); Q.front-next = NULL; return OK;时间复杂度O(1)(11)链队列的元素插入

24、/* 新元素e 入队列 */Status EnQueue( LinkQueue *Q , QElemType e )QNode *p = ( QNode * ) malloc ( sizeof (QNode) ); /* 动态申请结点,C 语言*/ QNode *p = New QNode; /* 动态申请结点, C+*/if (!p) /*存储分配失败*/exit(OVERFLOW);p-data = e; /* 结点赋值 */p-next = Null;Q-rear-next = p; /* 新结点插到队尾 */Q-rear = p; /* 新结点设置为队尾 */return OK;时间复

25、杂度O(1)(12)链队列的元素删除/* 队头元素出队列 */Status DeQueue( LinkQueue *Q , QElemType *e )QNode *p;if (Q-front = Q-rear) /* 队空 */return ERROR;p = Q-front-next; /* p 指向要出队元素所在结点 */*e = p-data; /*用e 返回出队元素 */Q-front-next = p-next; /* 头结点指向出队元素的下一个结点 */if (Q-rear =p) /* 出队前只有一个元素 */Q-rear = Q-front;free (p);return O

26、K;时间复杂度O(1)4.了解栈的常用应用,理解利用栈实现递归的原理,掌握逆波兰式的生成和计算(1)栈的常用应用:数值转换、括号匹配、算术表达式求解、迷宫求解、实现递归(2)利用栈实现递归的原理:见 栈和队列3 课件(3)逆波兰式生成和计算逆波兰表示:所有的符号都在运算数字后面出现例:9 +(3 1)*3+10 / 2 中缀表示法9 3 1 3 * + 10 2 / + 后缀表示法,不再需要括号计算:遇到数字就进栈见到符号就运算运算结果也进栈最终结果栈底见生成:遇到数字就输出符号进栈要比较低级平级都得等高于栈顶才能进左边括号等匹配右括号来了一起闪三、串 考点:1.串的逻辑结构和两种存储表示方法

27、2.堆存储串的基本运算及复杂度分析3.串的模式匹配 要求:1.理解串与线性表的不同(数据对象、操作对象)串: 数据对象:字符集 操作对象:子串线性表:数据对象:集合 操作对象:线形表2.掌握串的复制操作的算法及复杂度分析3.理解串的模式匹配思想及两种基本的模式匹配算法,掌握next数组的计算方法(1)Brute Force算法朴素匹配算法思路:从主串S第i位开始的m位字符串,依次与T第1位-第m位比较,若相等,返回比较之前的i值;否则i退回,从下一位开始比较;如果从S的所有位开始都不能成功匹配T,返回0.int Index ( SString S, SString T)int i = 1, j =1;while (i=S0 & jT0 ) return i-T0;else return 0;时间复杂度 O(m*n) 最坏:m(n-m+1)(2)KMP算法(克努特莫里斯普拉特算法)思路:失配时,i不回溯,T尽量多滑动一段距离int Index_KMP ( SString S, SString T)int i = 1, j =1;while (i=S

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1