数据结构第二章
数据结构第二章课后答案

数据结构第二章课后答案数据结构第二章课后答案1. 线性表1.1 数组实现线性表Q1. 请说明线性表的定义,并结合数组实现线性表的特点进行解释。
线性表是由n(n≥0)个数据元素构成的有序序列,其中n表示线性表的长度。
数组实现线性表的特点是使用一组具有相同数据类型的连续存储空间存储线性表中的元素,通过下标访问和操作元素。
A1. 线性表的定义指出,线性表是由若干个数据元素组成的有序序列。
具体地,在数组实现线性表中,我们将元素存储在一组连续的内存空间中,通过下标访问和操作元素。
由于数组的存储空间具有连续性,这样的实现方式可以在O(1)的时间复杂度下进行元素的访问和修改操作。
1.2 链表实现线性表Q2. 请说明链表实现线性表的特点,并与数组实现进行比较。
链表实现线性表的特点是通过指针将线性表中的元素按照节点的形式连接起来,每个节点包含了存储的元素和指向下一个节点的指针。
与数组实现相比,链表的插入和删除操作更为高效,但是访问某个位置的元素需要从头开始遍历,时间复杂度较大。
A2. 链表实现线性表的特点是通过使用节点和指针将线性表中的元素连接起来。
每个节点中包含了一个存储的元素和指向下一个节点的指针。
链表的插入和删除操作的时间复杂度为O(1),因为只需要改变指针的指向即可。
但是,访问某个位置的元素需要从头开始遍历链表,所以时间复杂度为O(n)。
2. 栈和队列2.1 栈的定义和基本操作Q3. 请给出栈的定义和基本操作。
栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作,该端称为栈顶。
栈的基本操作包括入栈(push)和出栈(pop),分别用于将元素压入栈和将栈顶元素弹出。
A3. 栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
这个特定的一端称为栈顶,而另一端称为栈底。
栈的基本操作包括入栈(push)和出栈(pop)。
入栈操作将一个元素压入栈顶,出栈操作将栈顶元素弹出。
2.2 队列的定义和基本操作Q4. 请给出队列的定义和基本操作。
数据结构各章概要

数据结构各章概要数据结构是计算机科学中非常重要的一个学科,其主要研究各种数据的组织方式和操作方法。
善于运用合适的数据结构可以提高算法的效率,并优化程序的性能。
本文将对数据结构的各个章节进行概要介绍,帮助读者了解不同章节的主要内容和应用。
第一章:引论在引论章节,我们将引入数据结构的基本概念和术语,例如什么是数据、数据项、数据对象等等。
同时,还将介绍数据结构的分类和基本操作,如搜索、遍历、插入、删除和排序。
这些基础知识是后续章节的基础。
第二章:线性表线性表是数据结构中最简单、最基本的一种结构。
其特点是数据元素之间的前驱和后继关系非常明确。
线性表可以用数组和链表两种方式实现。
在本章节中,我们将分别介绍顺序表和链表的实现原理、插入、删除、合并以及应用场景。
第三章:栈和队列栈和队列是两种特殊的线性表结构,它们对数据的访问具有限制性。
栈具有“先进后出”的特点,而队列则具有“先进先出”的特点。
在本章节中,我们将介绍栈和队列的实现方式以及常见的应用场景,如递归、表达式求值、广度优先搜索等。
第四章:串串是由零个或多个字符组成的有限序列,其长度可以为零。
在本章节中,我们将介绍串的定义和操作,包括字符串的模式匹配、模式识别和编辑操作。
串的相关算法在文本处理、计算机网络等领域具有广泛的应用。
第五章:数组和广义表数组是一种在内存中以连续方式存储的数据结构,它具有高效的随机访问特性。
广义表是线性表的一种扩展,可以包含表结构、原子结构以及其他广义表。
本章节将介绍数组和广义表的定义、操作和应用。
第六章:树树是一种非线性的数据结构,具有分层次、递归和层次遍历等特点。
在本章节中,我们将介绍树的基本概念、二叉树、树的遍历算法、平衡树以及树的应用,如编译器中的语法树、文件系统的目录结构等。
第七章:图图是一种复杂的非线性数据结构,由顶点集合和边集合组成。
在本章节中,我们将介绍图的各种表示方式,图的遍历算法、最短路径算法以及常用的图算法,如最小生成树算法和拓扑排序。
实用数据结构电子教案第二章 数组与线性表

第二章 数组与线性表
3. 算法的时间复杂性
可以用数据元素的移动次数来度量这两个算 法的时间复杂性。
插入时,最少循环0次,最多循环n次,如i 的各种取值概率相同,则平均循环次数为 n/2;
else {
x=ST[top]; top=top-1; /*栈顶位置下移*/ } }
第二章 数组与线性表
2.3.2 堆栈的应用
1. 堆栈在函数调
A1
用中的应用:
设有三个函数A1,
A2
A2,A3,这三个 r
函数有如下的调 用关系:函数A1
在其函数体的某
A3 t
处r调用函数A2,
函数A2又在其函
数体某处t调用函
计算机处理表达式时,常把运算符放在两个 运算数的后面或前面。
1. 把运算符放在两个运算数的后面,例如 AB+ , 称为后缀形式,也叫做波兰式 。
2. 把运算符放在两个运算数的前面,例如 +AB, 则称做前缀形式,也叫做逆波兰表达式。
第二章 数组与线性表
算术表达式的不同运算符有不同的运算优先 顺序,如,在没有括号时,乘除运算(*或/) 要比加减运算(+或-)优先进行。
数据结构数据结构第二章数组与线性表第二章数组与线性表第第二数组与线性表数组与线性表数组的基本特点及寻址方式线性数据结构的基本特征和基本运算堆栈的定义和基本运算队列的定义和基本运算循环队列的特征运算以及判断溢出的条件与普通队列的差别堆栈队列的简单应用循环队列的特点及判断溢出的条件利用本章的基本知识设计有效的算法解决与线性相关的应用问题第二章数组与线性表熟练掌握以下内容
数据结构第二章:线性表

实现:可用C 实现:可用C语言的一维数组实现
6
V数组下标 0 1
内存 a1 a2
元素序号 1 2
typedef int DATATYPE; #define M 1000 DATATYPE data[M]; 例 typedef struct card { int num; char name[20]; char author[10]; char publisher[30]; float price; }DATATYPE; DATATYPE library[M];
4
{加工型操作 加工型操作} 加工型操作
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, &e ) 初始条件:线性表L已存在,1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值同 e 的值 ListInsert( &L, i, e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。 操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。 ListDelete( &L, i, &e ) 初始条件:线性表 L 已存在且非空,1≤i≤LengthList(L)。 操作结果:删除 L 的第 i 个元素,并用 e 返回其值,L 的长度减1。 }ADT LIST
3
PriorElem( PriorElem L, cur_e, &pre_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回 它的前驱,否则操作失败,pre_e 无定义。 NextElem( NextElem L, cur_e, &next_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返 回它的后继,否则操作失败,next_e 无定义。 GetElem( GetElem L, i, &e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)。 操作结果:用 e 返回 L 中第 i 个元素的值。 LocateElem( LocateElem L, e, compare( ) ) 初始条件:线性表 L 已存在,compare( ) 是元素判定函数。 操作结果:返回 L 中第1个与 e 满足关系 compare( ) 的元 素的位序。若这样的元素不存在,则返回值为0。 ListTraverse(L, visit( )) ListTraverse 初始条件:线性表 L 已存在,visit( ) 为元素的访问函数。 操作结果:依次对 L 的每个元素调用函数 visit( )。 一旦 visit( ) 失败,则操作失败。
数据结构 线性表

(9) Status NextElem_Sq(SqList L, ElemType cur_e, ElemaType &next_e)
//若cur_e是线性表L的元素且不是最后一个,返回它的后继 { for (i=0; i<L.length-1; i++) if (cur_e==L.elem[i]) { next_e=L.elem[i+1]; return OK; } return ERROR; }//NextElem_Sq O(n)
抽象数据类型 唯 一 数据的逻辑结构 确 操作的定义 定
集合 *
线性表
特殊线性表 扩展线性表
线性结构
树形结构 图形结构
灵 活 数据的存储结构 操作的实现 设 计
顺序存储 链式存储 散列(哈希)存储
数据的基本操作:针对结构、针对元素、针对状态
数据结构---第二章 线性表 1
第二章 线性表
2.1 2.2 2.3 2.4
数据结构---第二章 线性表
9
2.2 线性表的顺序存储结构(顺序表)
起始地址为b、最多可容纳maxlen个元素的线性表
下标 存储地址
0
1
b b+c
b+(i-1)c
a1 a2
ai
c个存储单元
i-1
LOC(ai)=LOC(a1)+(i-1)c LOC(ai)=LOC(ai-1)+c
n-1
b+(n-1)c
n-1
int LocateElem_Sq(SqList L, ElemType e, (7) Status (*compare)(ElemType,ElemType) ) //在线性表L中查找第1个值与e满足 //compare()的元素的位序 { for (i=0; i<L.length; i++) L.elem[i]==e if ( (*compare)(L.elem[i],e) ) return i+1; return 0 ; //作为未找到的特殊标记 } // LocateElem_Sq O(n) P25-2.6
数据结构课件第2章线性表

27
线性表的顺序存储结构适用于数据 元素不经常变动或只需在顺序存取设备 上做成批处理的场合。为了克服线性表 顺序存储结构的缺点,可采用线性表的 链式存储结构。
28
2.3 线性表的链式存储结构
线性表的链式存储表示 基本操作在单链表上的实现 循环链表 双向链表 线性表链式存储结构小结
2.3.1 线性表的链式存储表示 29
2.1.1 线性表的定义
6
一个线性表(linear_list)是 n(n≥0)个具有相同属性的数 据元素的有限序列,其中各元素有着依次相邻的逻辑关系。
线性表中数据元素的个数 n 称为线性表的长度。当 n = 0 时 该线性表称为空表。当 n > 0 时该线性表可以记为:
(a1,a2,a3,…,ai,…,an)
数据域 指针域
结点 data next
31
(2) 线性表的单链表存储结构
通过每个结点的指针域将线性表中 n 个结点按其逻辑顺序链 接在一起的结点序列称为链表,即为线性表 ( a1, a2, a3, …, ai, …, an ) 的链式存储结构。如果线性链表中的每个结点只有一个指针域, 则链表又称为线性链表或单链表 (linked list)。
17
(2) 算法编写
#define OK 1
#define ERROR 0
Int InsList ( SeqList *L, int i, ElemType e ) /*在顺序线性表 L 中第 i 个位置插入新的元素 e。*/ /* i 的合法值为 1≤i ≤L->last+2*/ {
int k; if ( i < 1) ||( i > L->last+2)) /*首先判断插入位置是否合法*/ { printf(“插入位置i值不合法”);
《数据结构》课程课件第二章线性表

Step2:数据域赋值
插入后: Step3:插入(连接)
X q
(1)式和(2)式的顺序颠倒,可以吗?
4、插入元素(在第i个元素之前插入元素e)
为什么时间复杂度不再是O(1)?
第i-1个元素
第i个元素
p
s
新插入元素
5、删除p所指元素的后继元素
P
删除前:
P->next P->next->next
删除:
五、线性表ADT的应用举例
Void mergelist(list La,list Lb,list &Lc)
{ //已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc中的元素也按值非递减排列
例: 将两个各有n个元素的有序表归并成一个有序表, 其最小的比较次数是( )。 A、n B、2n-1 C、2n D、n-1
三、线性表的ADT
四、线性表的分类
五、线性表ADT的应用举例
例1:已知有线性表L,要求删除所有X的出现
五、线性表ADT的应用举例
例2: 已知有两个分别有序的线性表(从小到大),要 求合并两个线性表,且合并后仍然有序。——归并 方法1: 合并,再排序O((m+n)2)
方法2: 归并,利用分别有序的特点O((m+n))
二、线性表上常见的运算
8、删除 Delete(L,i):删除线性表的第i个元素 删除前 a1 a2 … ai-1 ai ai+1 … an 删除后 a1 a2 … ai-1 ai+1 … an 9、判断是否为空 Empty(L):线性表空,则返回TRUE, 否则FALSE 10、输出线性表 Print(L):输出线性表的各个元素 11、其它操作 复制、分解、合并、分类等
数据结构考研笔记整理(全)

数据结构考研笔记整理(全)一、第二章线性表●考纲内容●一、线性表的基本概念●线性表是具有相同数据结构类型的n个数据元素的有限序列;线性表为逻辑结构,实现线性表的存储结构为顺序表或者链表●二、线性表的实现●1、顺序表●定义(静态分配)●#define MaxSize 50 \\ typedef struct{ \\ ElemType data[MaxSize];\\ intlength;\\ }SqList;●定义(动态分配)●#define MaxSize 50\\ typedef strcut{\\ EleType *data; //指示动态非配数组的指针\\ int MaxSize,length;\\ }SqList;●c的动态分配语句为L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);●c++动态分配语句为L.data=new ElemType[InitSize];●插入操作●删除操作●按值寻找●2、链表●单链表●单链表的定义●●头插法建立单链表●●尾插法建立单链表●●按序号查找getElem(LinkList L,int i)和按值查找locateElem(LinkListL,ElemType e)●插入结点(后插)●p=getElem(L,i-1); //查找插入位置的前驱结点\\ s.next=p.next;\\p.next=s;●将前插操作转化为后插操作,即先将s插入的p的后面然后调换s和p的数据域●s.next=p.next;\\ p.next=s.next;\\ temp=p.data;\\ p.data=s.data;\\s.data=temp;●删除结点●p.getElem(L,i-1);\\ q=p.next;\\ p.next=q.next;\\ free(q);●双链表(结点中有prior指针和next指针)●循环链表●静态链表●借助数组来描述线性表的链式存储结构,结点中的指针域next为下一个元素的数组下标●三、线性表的应用●使用的时候如何选择链表还是顺序表?●表长难以估计,经常需要增加、删除操作——链表;表长可以估计,查询比较多——顺序表●链表的头插法,尾插法,逆置法,归并法,双指针法;顺序表结合排序算法和查找算法的应用●小知识点(选择题)二、第三章栈,队列和数组●考纲内容●一、栈和队列的基本概念●栈:后进先出,LIFO,逻辑结构上是一种操作受限的线性表●队列:先进先出,FIFO,逻辑结构上也是一种操作受限的线性表●二、栈和队列的顺序存储结构●栈的顺序存储●●队列的顺序存储●进队:队不满时,送值到队尾元素,再将队尾指针加一●出队:队不空时,取队头元素值,再将队头指针加一●判断队空:Q.front==Q.rear==0;●循环队列(牺牲一个单元来区分队空和队满,尾指针指向队尾元素的后一个位置,也就是即将要插入的位置)●初始:Q.front==Q.rear●队满:(Q.rear+1)%MaxSize=Q.front●出队,队首指针进1:Q.front=(Q.front+1)%MaxSize●入队,队尾指针进1:Q.rear=(Q.rear+1)%MaxSize●队列长度:(Q.rear+MaxSize-Q.front)%MaxSize●三、栈和队列的链式存储结构●栈的链式存储●●队列的链式存储●实际是上一个同时带有头指针和尾指针的单链表,尾指针指向单链表的最后一个结点,与顺序存储不同,通常带有头结点●四、多维数组的存储●行优先:00,01,02,10,11,12●列优先:00,10,01,11,02,12●五、特殊矩阵的压缩存储●对称矩阵●三角矩阵●三对角矩阵(带状矩阵)●稀疏矩阵●将非零元素及其相应的行和列构成一个三元组存储●十字链表法●六、栈、队列、数组的应用●栈在括号匹配中的应用●栈在递归中的应用●函数在递归调用过程中的特点:最后被调用的函数最先执行结束●队列在层次遍历中的应用●二叉树的层次遍历●1跟结点入队●2若队空,则结束遍历,否则重复3操作●3队列中的第一个结点出队并访问,若有左孩子,则左孩子入队;若有右孩子,则右孩子入队●重点为栈的(出入栈过程、出栈序列的合法性)和队列的操作及其特征●小知识点(选择题)●n个不同元素进栈,出栈元素不同排列的个数为{2n\choose n }/(n+1)●共享栈是指让两个顺序栈共享一个存储空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸,可以更有效的利用存储空间,同时对存储效率没有什么影响●双端队列是指允许两端都可以进行入队和出队操作的队列●输出受限的双端队列:允许两端插入,只允许一端删除●输入受限的双端队列:允许两端删除,只允许一端插入三、第四章串●考纲内容●字符串模式匹配●暴力算法●注意指针回退时的操作是i=i-j+2;j=j+1;●kmp算法●手工求next数组时,next[j]=s的最长相等前后缀长度+1,其中s为1到j-1个字符组成的串●在实际kmp算法中,为了使公式更简洁、计算简单,如果串的位序是从1开始的,则next数组需要整体加一;如果串的位序是从0开始的,则next数组不需要加一●根据next数组求解nextval数组:如果p[j]==p[next[j]],则nextval[j]=nextval[next[j]],否则nextval[j]=next[j];●小知识点●串和线性表的区别:1线性表的数据元素可以不同,但串的数据元素一般是字符;2串的操作对象通常是子串而不是某一个字符四、第五章树与二叉树●考纲内容●一、树的基本概念●定义●树是一种递归的数据结构,是一种逻辑结构●树的性质●结点数为n,则边的数量为n-1●树中的结点数等于所有结点的度数之和加1(一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度,每一条边表示一个结点,对应一个度,只有根结点上面无边,故结点树=度数之和+1)●度为m的树中第i层至多有m^{i-1}个结点(i\geq1)(m叉树的第i层最多有m^{i-1}个结点)●高度为h的m叉树至多有(m^h-1)/(m-1)个结点(假设每一个结点都有m个孩子,则由等比数列的求和公式可以推导出该式子)●具有n个结点的m叉树的最小高度是\lceil log_m(n(m-1)+1)\rceil(由高度为h的m叉树的最大结点树公式有,n满足式子(m^{h-1}-1)/(m-1) \leq n\leq (m^h-1)/(m-1))●高度为h的m叉树至少有h个结点;高为h,度为m的树至少有h+m-1个结点(m叉树并不等于度为m的树,m叉树可以为空树,要求所有结点的度小于等于m,而度为m的树一定有一个结点的度数为m)●二、二叉树●二叉树的定义及其主要特征●定义●特点●每个结点至多只有两颗子树●二叉树是有序树,其子树有左右之分,次序不能颠倒,否则将成为另一颗二叉树,即使树中结点只有一颗子树,也要区分他是左子树还是右子树●特殊的二叉树●满二叉树:高度为h,结点数为2^h-1,所有叶子结点都集中在二叉树的最下面一层,除叶子结点外的所有结点度数都为2,从根结点为1开始编号,对于编号为i的结点,其父结点为\lfloor i/2 \rfloor,左孩子(若有)编号为2i,右孩子(若有)编号为2i+1,所以编号为偶数的结点只可能是左孩子,编号为奇数的结点只可能是右孩子●完全二叉树:删除了满二叉树中编号更大的结点,高为h,结点数为n的完全二叉树的每个结点的编号都与高度为h的满二叉树中编号为1到n的结点相同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 例2告诉我们:
解决问题方法的效率与空间的利用效率有关
• 例3告诉我们:
解决问题方法的效率与算法的巧妙程度有关
复杂问题实例
• Ex: Network Connectivity (网络连通性)
1. 如何存储和表示 网络的结构?
2. 如何确认两个节
点的连通性,最 短路径是什么? 3. ……
A
B
1.2 什么是数据结构
int i ; double p = a[0]; for ( i = 1; i <= n; i++) p += a[i] * pow(x, i); return p;
}
f(x) = a0 + a1x + … + an-1xn-1 + anxn
f(x) = a0 + x*(a1 + x*(… ( an-1 + x*(an))…))
新进一本《三体》……
需要移动大量图书 ,才能腾出空的位 置!
操作2:如何查找指定的图书?
二分查找!
可行!
例1:图书摆放问题 方法3:在书架中划分区域,各分区指定摆放 某类图书;并且,在每个分区内,按照书名的 首字母拼音顺序摆放。
操作1:新书如何插入?
可行!
先定类别,二分查找位置,再移出空位,插入新书
void main() { int N; cin>> N; PrintN(N); } 递归实现
循环实现
N = 100
N = 100000
启示
• 例1告诉我们:
解决问题方法的效率与数据的组织方式有关
• 例2告诉我们:
解决问题方法的效率与空间的利用效率有关
例3:多项式求值
方法1:double f1 ( int n, double a[], double x) {
平时成绩:出勤、课堂表现、作业情况、实
验情况及实验报告等
上机实验
实验一
线性表的基本运算及多项式的算术运算
实验二
二叉树的基本操作及哈夫曼编码和译码系统的实现
实验三
图的基本运算及飞机换乘次数最少问题
实验四
基本内排序算法的验证和性能比较、改进快速排序算法
教材及主要参考书 1、教材 《数据结构——使用C++语言描述》(第2版),陈慧 南,人民邮电出版社,2008年
操作2:如何查找指定的图书?
先确定类别,再二分查找!
可行!
• 问题:分区空间大小如何分配?分区粒度多细?
启示
• 例1告诉我们:
解决问题方法的效率与数据的组织方式有关
例2:顺序打印1到N之间的全部正整数
• 循环实现
void PrintN ( int N )d PrintN ( int N )
(4) 更新操作——修改数据结构中某个指定元素的值; (5) 搜索操作——在数据结构中搜索满足一定条件的元素; (6) 遍历操作——按照某种次序,系统的访问数据结构的各 个元素,使得每个元素恰好被访问一次。
……
1.3 抽象数据类型 (Abstract Data Type)
•
1.2.4 数据结构的运算 数据类型
2、主要 参考书
(1)《数据结构(用面向对象方法及C++描述)》,殷 人昆等,清华大学出版社 (2)Data Structures,Algorithms andApplications in C++, Sartaj Sahni, 机械工业出版社 (3)Data Structures with C++, Wlliam Ford, 清华大 学出版社
• 数据对象在计算机中的组织方式
逻辑结构
物理存储结构
• 数据对象必定与一系列加在其上的操作相关联
• 完成这些操作所用的方法即为算法
1.2 什么是数据结构
四种基本逻辑结构
(a) 集合结构
(b) 线性结构
(c) 树形结构
(d) 图状结构
1.2 什么是数据结构
数据的存储结构
Ex:四个连续的元素( a0, a1, a2, a3 )的数据结构
优效率的算法。
-------- 中文维基百科
1.1 算法和数据结构
数据结构和算法是计算机学科的基础之一,更是 软件技术的基础。
“Algorithms + Data Structures = Programs ” ─ Niklaus Wirth • 1984 Turning Award • Pascal 之父
数据结构A
南京邮电大学计算机学院
计算机科学与技术系 戴华 daihua@ 2016/7/24
课程的主要内容、考核方式
主要内容:讨论线性表、栈和队列、数组和字符串、
二叉树和树、搜索树、散列表、图和文件等常见的数 据结构.
考核方式:
闭卷考试 期末占70%+平时占30%
逻辑结构:
a0 → a1 →a2 →a3
存储结构
顺序表: 链接表:
a0
a1
a2
a3
1.2 什么是数据结构
数据结构的操作
逻辑结构描述了数据的静态性,操作给出了数据被使用的 方式,即数据的动态性。常见的操作有: (1) 创建操作——创建一个数据结构; (2) 插入操作——在数据结构中插入一个新元素;
(3) 删除操作——将数据结构中的某个指定元素的删除;
MAXN
i 0
i ( x)
i
f (1.1) i (1.1)i
i 0
10
clock_tbegin, end; doubleduration; #defineMAXN 120000 //多项式最大项数 int main() { int i; doublea[MAXN]; //存储多项式的系数 for (i = 0; i < MAXN; i++) a[i] = (double) i; begin = clock(); f1(MAXN - 1, a, 1.1); end = clock(); printf("ticks1 = %f\n", (double) (end - begin));
例1:图书摆放问题
图书摆放问题中的2个常用操作:
操作1:新书如何插入?
操作2:如何找到指定的图书?
例1:图书摆放问题 方法1:随意摆放
操作1:新书如何插入?
Easy!
哪里有空位就放哪里,一步到位。
操作2:如何找到制指定的图书?
例1:图书摆放问题 方法2:按书名的拼音首字母顺序摆放
操作1:新书如何插入?
{ if ( N ) { PrintN ( N – 1 ); cout<< N<<endl; } return ; }
for ( i = 1; i < N; i ++) {
cout<< i<<endl; } return ; }
N = 100, 1000, 10000, 100000, …
例2:顺序打印1到N之间的全部正整数
Matrix Create(int M, int N): 返回一个M*N的空矩阵; int GetMaxRow(Matrix A):返回矩阵A的总行数; int GetMaxCol(Matrix A):返回矩阵A的总列数;
ElementType GetEntry(Matrix A, int i, int j):返回矩阵A第i行、第j列元素;
1.5 算法分析的基本方法
算法的时间复杂度:程序运行从开始到结束所需的时间
手柄转动
的次数!
1.5 算法分析的基本方法
1.5.2 算法的时间复杂度 如何度量算法的时间复杂度? 程序步:
一个程序步是指在语法上或语义上有意义
的程序段,该程序段的执行时间与具体执行环 境无关。
1.5 算法分析的基本方法
1.5.2 算法的时间复杂度
Ex: 程序1.3 求一个数组元素的累加之和 float sum(float list[],const int n) { float tempsum=0.0; for(int i=0;i<n;i++) tempsum+=list[i]; return tempsum; } 程序语句
一次执行所需 执行频度 程序步数 程序步数 float tempsum=0.0; 1 1 1 for(int i=0;i<n;i++) 1 n+1 n+1 tempsum+=list[i]; 1 n n return tempsum; 1 1 1 2n+3 总程序步数
1.1 算法和数据结构
数据结构(Data Structures)是一门研究非数值计算的 程序设计问题中的操作对象,以及它们之间的关系和操作等 相关问题的学科。 算法(Algorithms)是解决特定问题求解步骤的描述,在 计算机中表现为指令的有限序列,并且每条指令表示一个或
多个操作。
例1:图书摆放问题
1.5.1 算法及其性能标准
算法(Algorithm):是解决特定问题求解步骤的描述,在计算机中 表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的五个特征:
(1)输入 (2)输出 有零个或多个输入 至少产生一个输出
(3)确定性 每一条指令都有确切的定义,没有二义性 (4)可行性 可以通过已经实现的基本运算执行有限次来实现 (5)有穷性 算法必须总能在执行有限步之后终止
准备:复习C++的相关内容,如指针、模板等。