0.数据结构学习笔记大纲
推荐学习参考书籍:
实体课本: 1.严蔚敏、吴伟民编著的教材(都是伪算法)
实现代码: 高一凡
数据结构概述
定义:
我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)以及为此在基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的操作,这个相应的操作叫做算法。
数据结构=个体+个体的关系
算法=对存储数据的操作
算法
解题的方法和标准
衡量算法的标准
1.时间复杂度:大概程序要执行的次数,而非执行的时间。
2.空间复杂度:算法执行过程中大概所占用的最大的内存。
3.难易程度:是否易于阅读理解
4.健壮性:
数据结构的地位:
数据结构是软件中最核心的课程
程序=数据的存储+数据的操作+可以被计算机执行的语言
预备知识
指针
指针的重要性:
指针是C语言的灵魂
定义:
地址:
地址就是内存单元的编号
从0开始的非负整数
范围: 0--FFFFFFFF (0--4G-1)
指针:
指针就是地址,地址就是指针。
指针变量时存放内存单元地址的变量
指针的本质是一个操作受限的非负整数。
分类:
1.基本类型的指针
2.指针和数组的关系
结构体
为什么会出现结构体?
为了表示一些复杂的数据,而普通的基本类型变量无法表示
什么叫结构体?
结构体是用户根据实际需要自己定义的复合数据类型。
如何使用结构体?
两种方式:
struct Student st={1000,"zhangsan",20};
struct Student *pst=&st;
方法一:
st.sid
方法二:
pst->sid
表示pst所指向的结构体变量中的sid这个成员
注意事项
1.结构体变量不能加减乘除,但可以相互赋值。
2.普通结构体变量和结构体指针变量作为函数传参的问题
动态内存的分配和释放
模块一: 线性结构(把所有的结点用一根直线穿起来。)
连续存储[数组]
1.什么叫数组
元素类型相同,大小相等
2.数组的优缺点
离散存储[链表]
线性结构的两种常见应用之一 栈
线性结构的两种常见应用之二 队列
专题:递归
1.1+2+3+4+.....100的和
2.求阶乘
3.汉诺塔
4.走迷宫
模块二:非线性结构
树
树定义
专业定义:
1.有且只有一个称为根的节点
2.有若干个互不相交的子树,这些子树本身也是一个树。
通俗的定义:
1.树是由节点和边组成。
2.每个节点只有一个父节点但可以有多个子节点。
3.但有一个节点例外,该节点没有父节点,此节点称为根节点。
专业术语
节点 父节点 子节点
子孙 堂兄弟
深度:
从根节点到最底层节点的层数称之为深度。
根节点是第一层
叶子节点:
没有子节点的节点。
非终端节点:
实际就是非叶子节点。
度:
子节点的个数称为度。
树分类
一般树:任意一个节点的个数都不受限制。
二叉树:任意一个节点的子节点个数最多两个,且子节点的位置不可更改.
分类:
一般二叉树 :
满二叉树:在不增加树的层数的前提下,
无法再多添加一个节点的二叉树就是满二叉树。
完全二叉树:如果只是删除了满二叉树最底层最右边的连续若干个节点,
这样形成的树就是完全二叉树。
森 林:n个互不相交的树的集合
树的存储:
二叉树的存储
连续存储[完全二叉树]
优点:查找某个节点的父节点和子节点
(也包括判断有没有子节点)速度很快。
缺点:耗用内存空间过大。
链式存储
一般树的存储
双亲表示法
求父节点方便
孩子表示法
求子节点方便
双亲孩子表示法
求父节点和子节点都很方便
二叉树表示法
把一个普通树转化成二叉树来存储。
具体转换方法:
设法保证任意一个节点的
左指针域指向它的第一个孩子
右指针域指向它的兄弟。
只要能满足此条件,就可以把一个普通树转化为二叉树
一个普通树转化成的二叉树一定没有右子树。
森林的存储:
树操作
树应用
图
模块三: 查找和排序
折半查找
排序:
冒泡
插入
选择
快速排序
递归排序
Java中容器和数据结构相关知识
Iterator 接口
Map
哈希表