随着复习的不断深入,发现数据结构的基础并不牢固,找到了一本相对经典的数据结构书籍——大话数据结构,网上的资源很多,很容易找到PDF版,下面对这本书的知识点做整体性的梳理,主要为之后再回头看找到方向。
第一章 数据结构绪论
1. 什么是程序?
程序 = 数据结构 + 算法
2. 什么是数据结构?
是相互之间存在的一种或多种特定关系的数据元素的集合。
3. 数据结构可分为哪两种结构?
逻辑结构:数据对象中数据元素之间的相互关系
1.集合结构
2.线性结构:一对一
3.树形结构:一对多
4.图形结构:多对多
物理结构:数据的逻辑结构在计算机中的存储形式,也是 存储结构
1.顺序存储结构:地址连续
2.链式存储结构:地址可以连续也可以不连续
第二章 算法
1. 什么是算法?
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作
2. 算法的五大特性是什么?
算法的五个基本特性:
1. 输入
2. 输出(算法至少有一个输出)
3. 有穷性
4. 确定性
5. 可行性
3. 算法设计有什么要求?
1. 正确性
2. 可读性
3. 健壮性
4. 时间效率高和存储量低
4. 算法效率的度量方法有哪些?
1. 事后统计方法
2. 事前分析估计方法
5. 算法时间复杂度:大O阶方法如何推导?
1. 用常数1取代运行时间中的所有加减法常数;
2. 在修改后的运行次数函数中,只保留最高阶项;
3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数;
4. 得到的结果就是大O阶
6. 时间复杂度耗时排序?
O(1) < O(logN) < O(N) < O(NlogN) < O(N^2) < O(N^3) < O(2^N) < O(N!) < O(N^N)
7. 什么是算法的空间复杂度?
算法的空间复杂度是通过计算算法所需的存储空间实现
第三章 线性表
1. 什么是线性表?
List:零个或多个数据元素的有限序列(序列:说明元素之间有顺序、有限:说明线性表是有限的)
2. 什么是线性表的顺序存储结构?
是指用一段地址连续的存储单元依次存储线性表的数据元素
3. 顺序存储结构的线性表 地址计算方法?
存储器中的每个存储单元都有自己的编号,这个编号称为地址。
LOC(ai)= LOC(a1)+ (i - 1)* c
4. 线性表的顺序存储结构更适合执行哪些操作?
1. 适合 存取操作,其时间复杂度为O(1)
2. 不适合 插入和删除操作,其时间复杂度为O(n)
5. 什么是线性表的链式存储结构?
一个或多个结点(Node)组合而成的数据结构称为:链表
结点由两部分内容构成:数据域(存储真实数据元素)、指针域(存储下一个结点的地址)
链表的第一个结点的存储位置叫做:头指针
链表的最后一个结点指针为“空”:NULL
头结点:为了方便对链表进行操作,在链表的第一个结点前附设一个节点,就是头结点:Head
6. 单链表如何完成插入和删除操作?
1. 插入
p -> next = s -> next; p -> next = s; (先调整地址,在插入值,顺序不可颠倒)
2. 删除
q = p -> next; p ->next = q ->next;
7. 线性表的链式存储结构更适合执行哪些操作?
1. 不适合 存取操作,其时间复杂度为O(n)
2. 适合 插入和删除操作,其时间复杂度为O(1)
对于插入或删除数据越频繁的操作,单链表的效率就越明显。
8. 什么是静态链表?(不是重点)
用数组代替指针,将指针地址转化为数组地址,用数组描述的链表叫做静态链表(游标实现法)。
9. 什么是循环链表?
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相连的单链表称为单循环链表,简称循环链表。
循环链表判定的条件为当前结点是否指向头结点:p -> next = head ,是则当前结点为尾结点rear
10. 什么是双向链表?
在单链表的每个结点中,再设置一个指向其前驱结点的指针域,在双向链表中的结点都有两个指针域,一个指向直接后继(next),一个指向直接前驱(prior)
p -> next -> prior = p = p -> prior -> next
11. 双向链表如何完成插入和删除操作?
1. 插入(顺序很重要)
s ->prior = p;
s -> next = p-> next;
p -> next ->prior = s;
p -> next = s;
2. 删除(顺序很重要)
p -> next = q -> next;
q -> next -> prior = p;
free(q);