第一章 绪论
1、时间复杂度:之最坏情况下,估算算法执行时间的一个上界。(算法的时间复杂度取决于:问题规模、待处理数据的初态、计算机的配置)。
空间复杂度:算法所需存储空间的度量
算法原地工作是指算法执行时所需要的辅助空间,其相对于输入常量而言是个常数
2、数据结构:相互之间存在一中或多种特定关系的数据元素的集合(数据元素的组织形式)。、3、逻辑结构:数据元素之间,抽象化的相互关系,与数据的存储无关,独立于计算机,是从具体问题中抽象出来的数学模型。(集合、线性结构、树、图)
4、存储结构:数据元素及其关系在计算机存储器中的存储方式。
5、线性结构:有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前驱和一个后继。 (线性表、栈、队列、串)
6、非线性结构:一个结点可能有多个直接前驱和直接后继。 (树、图)
7、顺序存储结构:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。
8:链式存储结构:借助指示元素存储地址的指针来表示数据元素之间的的逻辑关系。
9:数据的运算:插入、删除、修改、查找、排序。
10、 数据类型:一种程序设计语言中,变量所具有的数据种类 (数据结构,是类模板)
11、基本数据类型:int char double float void (计算机中已实现的数据结构)
12、构造数据类型:数组、结构体、共用体、文件
13、算法:是指令的有限序列集,对特定问题求解步骤的一中描述。描述算法:自然语言、流程图、程序设计语言、伪码。
对一个算法的评价:正确性、可读性、健壮性、高效性
正确性:正确实现预定的功能
可读性:易于阅读和理解,以便调试、修改、扩充
健壮性:当环境发生变化时,算法可以适当做出反应或进行处理、不会产生不需要的运行结果
高效性:包括时间和空间两个方面。
第二章:线性表
关于顺序表和链表各种运算的时间复杂度(语句频度)
一、顺序表
1、取值 :O(1)
2、查找:O(n) (n+1)/2
3、插入:O(n) n/2
4、删除:O(n) (n-1)/2
二、链表
1、取值:O(n) (n-1)/2
2、查找:O(n) (n-1)/2
3、插入:O(n) (n-1)/2
4、删除:O(n) (n-1)/2
前插、尾插:O(n)
链表的一些基本操作:
1、在双向链表存储结构中,删除p所指的结点时须修改指针()
p->prior->next=p->next;
p->next->prior=p->prior;
2、带头结点的循环双链表L为空表的条件是()。
L->next==L;
3、设rear是指向非空的带头结点的循环单链表的尾元结点的指针。若想删除链表的首元结点,则应执行()操作。
s=rear->next->next;
rear->next->next=s->next;
delete s;
4、已知L是带头结点单链表的表头指针,则从链上摘下首元结点的语句是()。
q=L->next;
L-next=q->next;
5、设一个非空的带头结点的循环单链表的头指针为L,当L->next->next->next==L时,链表的长度可能是(2)。
6、不带头结点的单链表head为空的判定条件是()。
head==NULL;
7、已知指针h指向一个带头结点的非空单循环链表,结点结构为:(data,next),其中next是指向直接后继结点的指针,p是尾指针,q为临时指针。现要删除该链表的第一个元素,正确的语句序列是( )。
q=h->next;
h->next=q->next;
if(p==q) p=h;
free(q);
8、单链表中,将s所指结点插到p所指结点之后语句:
s->next=p->next;
p->next=s;
9、双向循环链表中,在P指针所指的结点后插入q所指向的新节点操作:
q.prior=p;
q.next=p.next;
p.next.prior=q;
p.next=q;
、设顺序线性表中有n个数据元素,则删除表中第i个元素需要移动(n-i)个元素。
已知两个长度分别为m和n的升序链表,若将它们合并为一个长度为m+n的降序链表,则最坏情况下的时间复杂度是O(max(m,n))
将两个长度为n的递增有序表归并成一个长度为2n的递增有序表,最少需要进行关键字比较(n)次。
将两个各有n个元素的有序线性表合并成一个有序线性表,元素比较次数最多为()。
第三章 栈和队列
1、链栈相比于顺序栈的优点:不会出现栈满的情况。
关于栈的一些基本操作:
1、顺序栈存放在数组a[n]中,top指向栈顶,top= -1表示栈空。在栈不满的情况下,
元素x进栈的操作为()。
a[++top]=x;
2、链栈的结点表示为(data, next),top指向栈顶。则插入结点x的操作为()。
x->next=top;top=x;
3、链栈的结点表示为(data, link),top指向栈顶,若想删除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。
x=top;top=top->link;
4、若一个栈以向量V[1,…,n]存储,初始栈顶指针top设为n+1,则元素x进栈的正确操作是( )。
top--;V[top]=x;
2、队列的基本操作
1、数组a[0…n]用来存放循环队列,则入队时的操作是()。
rear=(rear+1) mod n
2、循环队列存放在数组Q[n]中。h指向头元素,t指向队尾元素的后一个位置。设队列中元素个数小于n,则队列中一共有()个元素。
(n+h-t)% n
3、循环队列存放在数组a[15]中,front指向队头元素的前一个位置,rear指向队尾元素。当front=8, rear=3时,队列的长度为()。
10
4、链队中队头指针为front,队尾指针为rear,则将x结点插入队列需要执行的操作是()。
x->next=null; rear->next=x; rear=rear->next;
5、循环队列存放在数组a[0…m]中。end1指向队头元素,end2指向队尾元素的后一个位置。设队列两端都可以进行入队出队操作,且初始时为空。则判断队空和队满的条件是()。
队空:end1==end2;
队满:end1==(end2+1)mod(m+1)
第四章 数组字符串广义表
串:零个或多个字符组成的优先序列
串的长度:串中字符数目。
空串:零个字符的串(并不是由空格组成的串)。
子串:任意个连续字符组成的子序列。
主串:包含子串的串。
串、栈、队列都是特殊的线性表,栈和队列是操作受到限制,字符串是内容受限,字符串中的每个数据元素只能是一个字符,而不能是其他类型的数据。
串和线性表的区别:线性表更关注的是单个元素的操作,比如说查找一个元素,插入或者删除一个元素,但串中更多的是查找子串位置,得到指定子串,替换子串等操作。
数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素。
数组的定义:数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受 n(n>=1) 个线性关系的约束,每个元素在 n 个线性关系中的序号i1, i2, …,in 称为该元素的下标,可以通过下标访问该数据元素。
设主串的长度为n,子串的长度为m,那么对于KMP算法,平均时间复杂度为O(m+n)
BF算法时间复杂度:O(m+n)
模式匹配:字符串S1中寻找子串S2首次出现的位置 (子串的定位运算)
字符串的模式匹配不一定要从主串的第一个位置开始,可以指定主串中查找的起始位置 。
压缩存储:若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间。
2. 什么样的矩阵能够压缩?
一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等。
3. 什么叫稀疏矩阵?
矩阵中非零元素的个数较少(一般小于5%)
稀疏矩阵压缩存储后, 必会失去随机存取功能。
在稀疏矩阵中,非零元素的分布是没有规律的,为了进行压缩存储,需要将每一个非零元素的值和其所在的行号、列号作为一个结点存放在一起,这样的结点组成的线性表称作三元组表。因为该结点已不是简单的向量,是无法根据下标进行存取的,所以说稀疏矩阵压缩存储后,必会失去随机存取功能。
广义表与线性表的区别:
线性表的成分都是结构上不可分的单元素
广义表的成分可以是单元素,也可以是有结构的表
线性表是一种特殊的广义表
广义表不一定是线性表,也不一定是线性结构
广义表的长度和宽度:广义表的长度是指广义表中所含元素的个数,深度是指广义表中括号的层数。
L=(a,b,L)是一个递归的表,长度为3,L相当于一个无限的广义表L=(a,b,(a,b(a,b,…))),深度是正无穷。
(1)求表头GetHead(L):非空广义表的第一个元素,可以是一个单元素,也可以是一个子表 (2)求表尾GetTail(L):非空广义表除去表头元素以外其它元素所构成的表。表尾一定是一个表
1、广义表可以为其他广义表所共享。
广义表具有共享性,如广义表 B 就共享表 A。在表 B 中不必 列出表 A 的内容,只要通过子表的名称就可以引用该表。
2、广义表又称列表,一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。
3、若由于广义表(a1,a2,a3,…an)中的数据元素可以具有不同的结构,(或是原子,或是广义表),因此,难以用顺序存储结构表示,通常采用链式存储结构,每个数据元素可用一个结点表示。
数组的存储结构:若频繁地对线性表进行插入和删除操作,该线性表采用链式存储结构比较合适。