1.0 数据结构概述:
我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器中,
以及在此基础上为实现某个功能(eg:查找/删除某个元素,对所有元素排序)而执行的相应操作(即算法)
eg: 存储100000个元素 (用链表结构保存)
eg: 公司人事架构 (用树表示)
eg: 车站交通站点之间最短行车路线 (用图表示)
数据结构 = 复杂问题的数据和数据之间关系以何种方式保存到计算机内存中
算法 = 对存储数据的操作,依附于数据,数据结构不一样,算法就不一样
程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言
1.1 衡量算法的标准
a) 时间复杂度:程序大概要执行的次数,注意并非执行的时间,不要望文生义,
1 因为不同的机器配置不一样,而且机器硬件更新很快,无法用运行时间来决定此算法效率
2 判断程序效率也仅仅是看程序核心算法的循环次数
b) 空间复杂度:算法执行中大概所占用的最大内存
c) 难易程度: 即此写法是否容易被别人看得懂
d) 健壮性:
1.2 数据结构特点:
a) 是软件的基础,eg: 数据库的表,记录,字段其实也是数据结构的一种表现形式,涉及到了以何种格式和各种属性之间用何种关系存储到物理介质
b) 学了之后什么也做不了, eg: 学了html立马能做网页,有点所见所得的感觉, 但数据结构是一种内功课,需要时间的发酵才有看到效果。
1.3 预备知识:
1.3.0 cpu和内存之间的关系
内存几个知识点:
a) 用来存储数据的设备,存储速度介于寄存器和硬盘之间
b) 是CPU唯一可以访问的大容量存储设备,所有硬盘中的程序和数据必须调入内存后才可以被CPU执行
c) 内存的问题是软件开发中最核心的问题 eg:内存分配,释放,何时分配,何时释放,by who,访问权限
d) 是多字节组成的线性一维存储空间
e) 基本单位是字节
f) 每个字节占8位,
g) 内存中每个字节对应一个唯一编号(地址)
软件运行和内存的关系:
a) 软件运行前,向操作系统申请内存空间,当内存空间充足时,操作系统会分配一段内存空间,并将软件在外存中的软件拷贝一份存入该内存空间中,然后启动该软件。
b) 软件运行期间,占用的内存空间不会被分配给别的软件(独占)
c) 软件运行完,操作系统回收该软件占用的内存空间(1仅是收回了访问控制权限,2不会清空该内存空间遗留的数据)
2 线性结构
2.0 概念: 把所有节点用一条线穿起来
2.1表现方式:
a) 连续存储(数组)
b) 离散存储(链表)
2.2线性结构的常见应用:
a) 栈
b) 队列
2.3专题: 递归
1: 1+2+3+4+...+100 递归和循环的转换
2: 阶乘
3: 汉诺塔
4: 走迷宫
3非线性结构:
3.1表现方式:
a) 树
b) 图
4查找和排序:
折半查找
排序:
冒泡
插入
选择
快速
归并
5java中的容器和数据结构相关知识
Iterator接口
Map
哈希表
6 知识拾遗:
堆: 分配内存的方式,不是存储数据的结构,因此在数据结构中,是不存在堆的概念的。