程序 = 数据结构 + 算法
其中,数据结构是指如何把现实世界的问题信息化,将信息存进计算机,同时还要实现对数据结构的基本操作。算法指如何处理这些信息已解决实际问题。
基本概念
数据:数据是信息的载体,是计算机程序加工的原料。
数据元素:数据元素是数据的基本单位,一个数据元素可由若干个数据项组成。
数据项:数据项是构成数据元素的不可分割的最小单位。
数据结构
定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
三要素
指逻辑结构、物理结构和数据的运算。逻辑结构是抽象的对象关系,物理结构是在计算机存储中的表现形式。
逻辑结构
集合:各个元素同属一个集合,别无其他关系。
线性结构:数据元素之间是一对一的关系。除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。
树形结构:数据元素之间是一对多的关系
图结构:数据元素之间是多对多的关系
物理结构(存储结构)
顺序存储:逻辑上相邻的结构存储在物理位置上也相邻
链式存储:逻辑上相邻的元素在物理位置上可以不相邻
索引存储:在存储元素信息的同时,还建立附加的索引表
散列存储:根据元素的关键字直接计算出该元素存储地址,又叫做哈希(Hash)存储
数据的运算
算法
五个特性
有穷性:一个算法必须在执行有穷步后结束,且每一步都可在有穷时间内完成
确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出
可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现
输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合
输出:一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量
算法效率的度量
时间复杂度:时间开销与问题规模n之间的关系
空间复杂度:空间开销(内存开销)与问题规模n之间的关系
线性表
定义:是具有相同数据类型的n(n≥0)个数据元素的有限序列
逻辑结构
分为存储(物理)结构、顺序表(顺序存储)、链表(链式存储),其中链表又分为双向链表、循环链表、静态链表
插入删除操作
栈
定义:是只允许在一端进行插入或删除操作的线性表
队列
定义:是一种先进先出(FIFO)的线性表,它只允许在一端进行插入操作,再另一端进行删除操作
循环队列
队空条件:head = tail
队满条件:(tail + 1) % size = head
串
定义:串是仅有字符构成的有限序列,是取值范围受限的线性表
空串:长度为零的串,空串不包含任何字符
空格串:由一个或多个空格组成的串
子串:由串中任意长度的连续字符够长的序列。含有子串的串称为主串。空串是任意串的子串。
串相等:指两个串长度相等且位置上的字符也相同
串比较:两个串比较大小时以字符的ASCII码值作为依据
数组
一维数组:
a[i]的存储地址为:a + i * len
二维数组
a[m][n]
按行存储中a[i][j]的存储地址为:a + (i * n + j) * len
按列存储中a[i][j]的存储地址为:a + (j * m + i) * len
稀疏矩阵
上三角矩阵
下标计算公式:(2n-i+1)*i/2+j
下三角矩阵
下表计算公式:(i+1)*i/2+j
广义表
广义表是线性表的推广
长度:表中元素的个数,元素可以是数据元素(称作原子),也可以是表(称作子表)
深度:递归定义的重数就是广义表的深度。直观的说,就是定义中所含括号的重数。
树
基本概念
结点的度:节点有几个分支
树的度:树结构中最多度的节点的度,就是树的度
根节点
叶子节点:最末端无子节点的节点
分支节点:除了根和叶子节点的其他节点
内部节点
父节点
子节点
层次
二叉树
重要特性
1.在二叉树的第i层,最多有2^i-1个节点(i≥1)
2.深度为k的二叉树最多有2^k-1个节点(k≥1)
3.对任一棵二叉树,如果叶子节点数为n0,度为2的节点数为n2,则n0=n2+1
二叉树的遍历
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
树转二叉树
最左孩子节点 -> 左子节点
当前节点的兄弟节点 -> 当前节点的右子节点
查找二叉树(二叉排序树)
左孩子小于根,右孩子大于根
构造霍夫曼树(最优)
构造时给定的权值都在叶子节点上,两个叶子节点之和为中间节点,依次向上构造
线索二叉树
前序线索二叉树
中序线索二叉树
后序线索二叉树
平衡二叉树
任意节点的左右子树深度相差不超过1
图
分为有向图、无向图、完全图
基本概念有度、入度和出度
存储结构(邻接矩阵)
用一个n阶方阵R来存放图中各节点的关联关系
存储结构(邻接表)
用数组和链表的方式存储有向图各节点关系
图的遍历
深度优先:类似前序遍历
广度优先:类似层次遍历
拓扑排序
把有向边表示活动之间开始的先后关系。这种有向图称为用顶点表示活动网络,简称AOV网络。拓扑序列即各顶点按指向顺序排列的顶点序列
最小生成树
普利姆算法
克鲁斯卡尔算法
查找
基本概念
查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找。
查找表(结构):用于查找的数据集合称为查找表,它由同一类型的数据元素(或记录)组成。
关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的
查找长度:在查找运算中,需要对比关键字的次数
平均查找长度(ASL):所有查找过程中进行关键字的比较次数的平均值
顺序查找
又叫线性查找,通常用于线性表
算法思想:从头到尾挨个查找
平均查找长度:(n+1)/2
折半查找
又叫二分查找,仅适用于有序的顺序表
最多的查找长度为:log2n + 1次
折半查找的时间复杂度为O(log2n)
分块查找
特点:块内无序,块间有序
第一步在索引表中确定待查记录所在的块,第二部在块内顺序查找
哈希表(散列表)
特点:数据元素的关键字与其存储地址直接相关
排序
定义:就是重新排列表中的元素,使表中的元素满足按关键字有序的过程
分类
稳定与不稳定排序
稳定排序:两个相同的元素,排序后前一个元素依然在后一个元素之前
不稳定排序:两个相同的元素,排序后前一个元素可能在后一个元素之后
内部排序与外部排序
内部排序:在内存中排序
外部排序:借用外部存储排序
插入排序
直接插入排序
算法思想:每次将一个待排序的记录按其关键字大小插入到已排序的子序列中,直到全部记录插入完成。
时间复杂度:平均情况为O(n2),最坏情况为O(n2)
空间复杂度:辅助存储O(1)
稳定性:稳定排序
希尔排序
算法思想:先将待排序表按增量d分割成若干子表,对各个子表分别进行插入排序,缩小增量d,重复上诉过程,直至d=1为止。
时间复杂度:平均情况为O(n1.3),最坏情况为O(n2)
空间复杂度:辅助存储O(1)
稳定性:不稳定排序
交换排序
冒泡排序
算法思想:从前往后/从后往前两两比较相邻元素的值,若为逆序则交换,直到序列排序完成,这种过程为“一趟”冒泡
时间复杂度:平均情况为O(n2),最坏情况为O(n2)
空间复杂度:辅助存储O(1)
稳定性:稳定排序
快速排序
算法思想:在待排序表中任取一个元素作为枢轴(或基准,通常取首元素),通过一趟排序完成一次划分,划分后其左边的元素比他小,右边的元素比他大,然后分别递归地对两个子表重复上诉过程,直到每部分内只有一个元素或为空,即所有元素放在了其最终位置上
时间复杂度:平均情况为O(nlog2n),最坏情况为O(n^2)
空间复杂度:辅助存储O(log2n)
稳定性:不稳定排序
选择排序
简单选择排序
算法思想:每一趟在待排序列元素中选取关键字最小的元素加入有序子队列
时间复杂度:平均情况为O(n2),最坏情况为O(n2)
空间复杂度:辅助存储O(1)
稳定性:不稳定排序
堆排序
时间复杂度:平均情况为O(nlog2n),最坏情况为O(nlog2n)
空间复杂度:辅助存储O(1)
稳定性:不稳定排序
特殊排序
归并排序
算法思想:把两个或多个已经有序地序列合并成一个
时间复杂度:平均情况为O(nlog2n),最坏情况为O(nlog2n)
空间复杂度:辅助存储O(n)
稳定性:稳定排序
基数排序
按权值位对比排序,例如十进制,则依次按个位、十位等对比排序
时间复杂度:平均情况为O(d(r+n)),最坏情况为O(d(r+n))
空间复杂度:辅助存储O(r+n)
稳定性:稳定排序
Java数据结构与算法知识详解
35万+

被折叠的 条评论
为什么被折叠?



