程序语言的奥妙 算法解读 日本人编著。
单项链表的一个元素由数据和指向下一个结点的指针构成;单项链表中要指出开头元素的头结点的指针
双向链表:从双向开始都可以遍历所有数据。
三要素:数据,指向前面一个结点的指针,指向后面一个结点的指针。
在查找第N个元素这种情况,数组比链表更高效。数组就是array[N]就可以,链表必须从第一个元素查找,一个个都翻看一遍才能找到想要的元素。
查找第N个元素时候,数组可以利用下标直接查到,但在链表中需要从第一个元素顺序遍历查找,花费太多时间。
数据,插入,删除操作,利用链表的指针效率很高,数组需要把插入位置后面的所有元素都向后移动。
唤醒缓冲区是数组的头尾相连的数据结构,尾元素的下一个元素即为头元素
二叉树:一个树结点和两个子结点组成的结构
单链表使用一个指向后继结点的指针,二叉树使用两个指向后记指针。
根节点位于顶端,没有爸爸,
叶结点位于底部,没有儿子
从根节点到叶节点的层数叫做深度
033
堆:父节点的值小于等于子节点值的二叉树叫做堆。
堆的根一般是最大值或者最小值。适合求极值
把堆改造成数组,从上到下,从左到右;
034:哈希表:数组和链表组合的一种数据结构
被称为跟数组并且元素数为N的数组。
跟数组的元素作为链表的头指针。
哈希函数:返回把输入数与哈希表元素数作商求余的值。
哈希值:
哈希函数用来计算哈希值,哈希值是数组里面的一个元素号码从0到N。
要点:将输入值通过哈希函数计算得到的值作为跟数组中的元素编号,进而找到对应的元素。
035
图是结点和边表示数据的连接关系的数据结构
图表现两个以上项目的连接。项目是结点,线是边。图连接被河流分开的城镇,河流是边,城镇是结点。
有向图,无向图。
例如单向行驶的桥。给图的边赋予权重叫做带权图,过桥收费,通行费可以做为边的权重。
图论:研究边的集合和点的集合构成的图的性质的学问。
第四章:基本的算法
036
循环求1~N的和
037使用数组保存数列的值
038
用变量求数组元素值的和。
039
用计数器求数组的有效元素数
040 根据数组的各元素和以及元素个数求数组的平均值。
041
求数组元素的最大值要使用保存最大值的变量。
数组元素大于MAX时候,MAX值就等于数组元素的值。
042使用变量保存最小值,求数组最小值。
043 使用其他数组存放数组元素的顺序。
044
以秒为单位的时间的大小
把时分秒转换为秒为单位,然后比较两个时间的大小
045
求时间差时候,先把时分秒转化为秒,做差,然后把结果转化为时分秒就行
046
利用临时变量交换两个变量的值
047
用欧几里得相除法求2个数的最大公约数
最大公约数:几个数的约数中最大值
欧几里得定理:整数X》Y,X除以Y的余数为R,X和Y的最大公约数与Y和R的最大公约数相等。X和0的最大公约数是0
X= Y
Y = R
X/Y =R
循环执行就行。
第五章
排序和搜索
048 排序是指按照一定规则对元素对象进行排列摆放
049
多种排序算法
桶排序,基数排序,简单选择法,简单交换法,简单插入法,希尔排序,归并排序,快速排序,堆排序,
050
把数据放在其他数组(桶)来进行排序
比如一组数最大值是100,总共有60个数据,准备101个桶,数字100放在a[100]里,数字78放在a[78]里,然后按照a[0]到a【101】的顺序输出数组。那就是从小到大排列一组数。
很简单的方法啦
也就是把数字放入对应号码的桶中
051.
基数排序
:从数值的低位开始依次重复桶排序。
052
选择最小值与排好序的末位简单交换的简单选择法。
从数据中找出最小值,放在最左边,然后从剩余数据找出最小值,放在有规律数据的右边,重复就导致有规律数据是从小到大。
要点:从未排序部分找到最小值移动到已经排序部分的末尾(右侧)
053
冒泡排序:相邻数据交换
一轮下来会从未排序的序列中提出最大值放到已经排序最右侧。一直重复就一次次提出最大值。结果就是从小到大排列
054
简单插入法:
在已经排序数据的正确位置插入数据
类似打麻将时候把新摸的牌插入本来已经从小到大的牌里,
055
希尔排序:把数据按照一定间隔分组进行排序
12个数据分两半分别排序,然后在分成的一半里再分两半排序,一直细分,细分同时把数据两侧元素比较大小,排序。
056
归并:把多个排序结果的数列合在一起的“合并”
要点:按照升序排好序的3个数列中,最小值存在于各个数列的首个元素中,一旦这个元素被选中是最小元素,后面的元素跟进,一次成为最小元素和其他两组最小元素进行比较。
057
利用归并算法进行排序的归并排序。
归并排序有二分和排序两个步骤。
058
快速排序
通过与基准数据比较大小把数列进行二分
把被分为两份的数据再次进行这种方法,直到最后一个数
优点,速度非常快,适合大量数据的情况
059
堆排序:利用堆的构造进行排序
堆的特性:根结点要么最大,要么最小,父节点要么全部都比子结点大或者小。
060
搜索:从多个数据中找出目标数据
包含:
线性查找:从头开始找,
二分查找:适合已经排序好的数据,
字符串查找:查找字符串中的字符样本,
通过KMP的字符串查找:从不一致字符位置和局部字符串的构成开始提高字符串查找效率,
通过BM的字符串查找:从局部字符串的末尾到开头进行字符比较
061
线性查找:从首位元素开始逐个进行比较处理
062
二分查找:能够从排好序的数列中快速找出数据
063
字符串查找:
在给定字符串中查找指定字符串位置的
064
通过KMP的字符串查找:从不一致字符位置和局部字符串的构成开始提高字符串查找效率
065
通过BM的字符串查找:从局部字符串的末尾到开头进行字符比较
066
牛顿法:活用微分来求高次方程式解
要点:通过导函数和X,Y的变化量表示切线的斜率来求解高次方程的算法。
067
联合方程组的求解方法是高斯消元法。
高斯消元法:是通过前进消去和后退代入两步来求解联合方程组的解,
068
梯形法:
根据梯形面积的计算求定积分值
069
基于图的迪杰斯特拉法:求最短时间,最短距离之类的最优路径。
用图来表示起始点,终点以及途中经过的节点和把他们连接在一起的路径,通过迪杰斯特拉算法求出最优路径。
070
埃拉托瑟尼筛法:判断自然数是否是素数
从自然数中删除不是素数的数,余下的就是素数了
071
利用递归调用求n的阶乘
递归调用是调用自己。求f(x)!=f(x-1) ! *n
类似蛇吞下自己的尾巴,函数调用自身函数
第七章
算法的复杂度
072
算法复杂度有时间和空间复杂度。
时间复杂度是运行花费的时间。
空间复杂度是指利用的空间资源的大小,包括,常亮空间,变量空间,数组空间,栈。
时间复杂度通过操作次数测量,空间复杂度通过使用内存大小测量
073
时间复杂度通过运算,条件比较,时代处理等操作次数来测量。
074
算法的复杂度是通过处理对象的数据量N为基准的O记法来表示的