前言-为什么要写这个东西?
作为一个独立学院的普通本科生,大学期间过的平平淡淡,到现在大四出来实习(学的J2EE,但找了个测试,整体环境比较慵懒,但以后还是想回去写代码),并没有把精力全身心投入学习,最近对自己现状很不满意,决定改变一下,以便自己不要被磨平了棱角,借此来开始写一些自己的作品。主要是为了警醒自己,如果有人看到了,希望自己没有写错,并对你有所帮助。内容来自于数据结构课程的笔记,如果有错误,希望帮忙指正。
一、基本知识点
在正式讲数据结构之前,需要先了解一些基本概念。
为什么要学习数据结构?
学习数据结构是为了能够写出好的程序。
关于程序:程序=数据结构+算法;
解决实际问题的步骤:从具体问题抽象出数学模型(数学建模)→设计解决该模型的算法→编写程序→调试、修改→最终结果;
然后是一些名词的解释:
1.数据:凡是能被计算机程序处理的符号总称。 如果把计算机看做工厂,那么数据就是加工原料,程序就是加工机器。
2.数据元素:数据的不可分割的最小基本单位。
3.数据结构:相互之间存在一种或多种特定关系的数据元素的集合。
4.数据对象:具有相同性质的数据元素的集合。 例:整数集合,素数集合。
二,正篇
1.数据结构的基本类型
(1)集合结构:无对应关系的散点(自己的理解);
(2)线性结构:具有一对一关系的点;
(3)树形结构:具有一对多关系的点;
(4)图形结构(网状结构);具有多对多关系的点;
这里的点是指数据元素。
2.数据结构的组成
数据结构=逻辑结构+物理结构+运算(操作);
(1)逻辑结构:描述集合中数据元素之间的某种逻辑关系(不依赖计算机)
表示为:B=(D,R)
D:数据元素的有限集;R:关系的有限集;
例:B=(D,R)
D={A,B,C,D,E,F,G,H};
R={(D,B),(D,G),(D,A),(B,C),(G,E),(G,H),(E,F)};
(2)物理结构:数据的逻辑结构在计算机存储器上的实现(依赖计算机)
存储方法:存储元素;体现关系;
常用的存储方法:
(1)顺序存储法:逻辑相邻的数据物理上也相邻,代表为数组,静态分配;
(2)链式存储法:逻辑相邻的数据物理上不要求相邻,代表为链表,动态分配;
(3)索引存储法:利用结点的索引号来确定结点地址;
(4)哈希法(散列法):利用结点的值来确定结点地址的方法,其关键是寻求一个恰当的哈希函数H(key)
H(key)=key and m;
key:结点的值;m:哈希表的长度;
3,运算(操作)
建立,查找,删除,插入,修改,遍历,排序
三,算法及其评价
1.算法
算法是解决某一类特定类型问题的有限运算序列;(方法和思路)
2.算法的基本特性
有穷性:算法必须能在有限步骤后终止;
确定性:算法的每一步都要有确定的含义;
可行性:算法的每一步都可行;
输入:算法有0个或多个输入;
输出:算法至少有1个或多个输出;
3.评估算法的标准
正确性;
可读性;
健壮性;
高效性(时间复杂度/空间复杂度);
四,时间复杂度的计算
(1)运行时间:一个算法在计算机上运行所需的时间。通常用时间复杂度来衡量。
(2)频度:一个算法中基本语句或操作重复执行的次数。通常用f(n)表示,n为问题的规模。
(3)时间复杂度:一个算法中基本语句或操作重复执行次数的数量级。记作T(n)=O(f(n))
常用的时间复杂度: 常量阶时间复杂度O(1),线性阶时间复杂度O(n),平方阶时间复杂度O(n²),对数阶时间复杂度O(logn),立方阶时间复杂度O(n³),线性对数阶时间复杂度O(nlogn)
时间复杂度确定原则:取时间复杂度最高的;
时间复杂度大小比较:O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³);
例: