由于个人的数据结构与算法的知识比较欠缺,就找了门教程进行学习,这里记录下整个学习的过程的知识点。
程序的本质
程序是有一系列的机器指令构成。
程序=数据结构+算法
数据结构与算法是相辅相成的。
数据结构:
数据结构是计算机存储,组织数据的方式。数据结构是指的相互之间存在一种或多种特定关系的数据元素的集合。通常情况下精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
对处理的问题如何表示,即问题的数学模型是什么
简言之:是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。
“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。
基本术语:
数据(Data):
在计算机科学中,是指所有能输入到计算机中并被计算机程序处理的符号的总称(集合) 它是对客观事物的符号表示(描述),是计算机处理的信息的特定的符号表示形式(信息的载体)。
数据结构中所讨论数据的范畴很广泛,如:字符、声音、图形、图像等多媒体信息。随着计算机的发展,数据的范畴不断扩大
比如:
struct student{
long num;
char name[20];
char sex;
char addr[30];
}
struct student s1,s2[6];
数据元素(Data Element)
是数据 ( 集合 ) 中的一个 “ 个体 ” ,在计算机中通常作为一个整体进行考虑和处理。 是数据结构中讨论的 “ 基本单位 ” , 但不是 最小 单位,它常常有若干 数据项 ( 是对数据元素 不同 属性 的描述 , 具有 独立的意义 ) 组成 。
比如:在学生信息管理系统中, 一条学生纪录 就是 一个数据元素 (学号、姓名、性别等数据项组成)
学号 | 姓名 | 班级 | 地址 |
---|---|---|---|
s0001 | scd | class01 | addr |
数据元素有两类。
- 一类是不可分割的具有 “原子”型数据元素。如:整数 字符。
- 另一类:由多个款项构成的数据元素(结构型) 其中每个款项被称为一个 “数据项” 是对数据元素某种属性的描述具有独立意义。
关键字
指能识别一个或多个数据元素的数据项。若能起 唯一 识别作用,则称之为
“ 主 ” 关键字 ,否则称之为“ 次 ”关键字 比如学号为主关键字。其余为次关键字。
数据对象(Data Object):
是性质相同的数据元素的集合,是数据的一个子集。比如 整数,实数,都是数据的一个子集
数据的逻辑结构:
数据的逻辑结构反应的是数据元素之间的逻辑关系,是指数据元素之间的前后间的关系,而与元素所存储的位置无关。逻辑结构包含:
- 集合:数据结构中的元素之间除了“同一集合”的相互关系外,别无其他关系。
- 线性结构:数据结构中的元素存在一对一的相互关系。
- 树形结构:数据结构中的元素存在一对多党的相互关系。
- 图形结构:数据结构中的元素存在多对多的相互关系。
一般按照逻辑结构分类数据结构可分为:
线性结构:线性结构就是表中各个结点具有线性关系。如果从数据结构的语言来描述,线性结构应该包括如下几点:
-
线性结构是非空集合
-
线性结构有且仅有一个开始结点和一个终端结点。
-
线性结构所有的结点都最多有一个直接前趋结点和一个后继结点。
包含:线性表,栈,队列,串
非线性结构:线性结构就是表中各个结点具有线性关系。如果从数据结构的语言来描述,线性结构应该包括如下几点:
-
非线性结构是非空集。
-
非线性结构的一个结点可能有多个直接结点和多个后继结点。
包含:数组,广义表,树结构和图结构
逻辑结构的表示
数据结构的形式定义为一个二元组:
Data-Structure=( D , S)
其中: D 是数据元素的 有限 集,
S 是 D 上 关系的有限 集。
例 复数的数据结构定义如下 : ( 复数 x=C1 + C2 i )
Complex=( C , R )
其中:
C 是含两个实数的集合 ﹛ C1 , C2 ﹜ ,分别表示复数的 实部 和 虚部 。
R ={P} , P 是定义在集合上的一种序偶关系:
{<C1 , C2>} 。 有序对 <> , 区别 ()
有序对 < x,y > - y 是 x 的后继,
x 是 y 的前驱:“ 相邻 ”一个 < x,y > 的 有序对 是构成关系的 基本单位
数据的物理结构:
指数据的[逻辑结构]在计算机存储空间的存放形式。
数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。
数据元素的机内表示(映像方法): 用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据元素有若干个数据项组成时,位串中与各个数据项对应的子位串称为数据域(data field)。因此,节点是数据元素的机内表示(或机内映像)。
关系的机内表示(映像方法):数据元素之间的关系的机内表示可以分为顺序映像和非顺序映像,常用两种存储结构:顺序存储结构和链式存储结构。顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像借助指示元素存储位置的指针(pointer)来表示数据元素之间的逻辑关系。
数据的存储结构:
数据的逻辑结构在计算机存储空间中的存放形式称为数据的物理结构(也称为存储结构)。一般来说,一种数据结构的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序存储、链式存储、索引存储和哈希存储等
- 顺序存储结构的特点是:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;
- 非顺序存储的特点是:借助指示元素存储地址的指针表示数据元素之间的逻辑关系
算法:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰[指令],算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的[输入],在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用[空间复杂度]与[时间复杂度]来衡量。
算法中的指令描述的是一个[计算],当其[运行]时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。
特征:
- 有穷性(Finiteness:算法的有穷性是指算法必须能在执行有限个步骤之后终止;
- 确切性(Definiteness):算法的每一步骤必须有确切的定义;
- 输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
- 输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
- 可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)
算法的评定:
- 时间复杂度:算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。T(n)=Ο(f(n))
- 因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。
- 空间复杂度:算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
- 正确性:算法的正确性是评价一个算法优劣的最重要的标准。
- 可读性:算法的可读性是指一个算法可供人们阅读的容易程度。 [1]
- 健壮性:健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性
函数与递归
为何自己写不出递归呢?
需要 需要确定信念。确定递归的结束条件和递归条件
/**
* 递归函数求阶乘
*
* @param n
* @return
*/
private static int fact(int n) {
// 递归必须确定结束条件
if (n < 2) {
return 1;
}
return n * fact(n - 1);
}
/**
* 汉诺塔
*
* @param n 盘子数
* @param src 元盘子
* @param mid 中间盘子
* @param tar 目标盘子
*/
private static void hanoi(int n, int src, int mid, int tar) {
// 确定结束条件
if (n == 1) {
System.out.println(src + "-->" + tar);
} else {
hanoi(n - 1, src, tar, mid); // 把n-1个盘子从元盘子借助目标柱子放到中间柱子
hanoi(1, src, mid, tar); // 把一个盘子从原主借助中间住放到目标住
hanoi(n - 1, mid, src, tar); // 把n-1个盘子从中间住借助源住放到目标住
}
}