数据结构-ashjfdlyuiasvd

基本概念和术语

术语

数据:数据是信息的载体
数据元素:数据元素是数据的基本单位,一个数据元素由若干个数据项组成,数据项是构成数据元素不可分割的最小单位。
数据类型:(1)原子型:其值不可再分的数据类型
		(2)结构类型:其值可以在分解为若干成分的数据类型
		(3)抽象数据类型:抽象数据组织和与之相关的操作
抽象数据类型:通常由数据对象、数据关系、基本操作集这样三元素来表示

数据结构

解析:包括三个方面:逻辑结构、存储结构和数据的运算。逻辑结构与存储结构是密不可分的两个方面。
	物理结构(存储结构):顺序存储、链式存储、索引存储和散列存储
		顺序存储:物理位置相邻
		链式存储:物理位置未必相邻
		索引存储:类似于目录
	逻辑结构:逻辑结构分为线性结构和非线性结构
		线性结构:一对一: 线性表 栈 队列
		非线性结构:
			(1)一对多:树形结构
			(2)多对多:图状结构或网状结构
	 		(3) 集合
	 数据的运算:包括运算的定义和实现

算法的五种特性

解析:一个算法应该具有以下五个重要的特征: 
	1、有穷性: 一个算法必须保证执行有限步之后结束; 
	2、确切性: 算法的每一步骤必须有确切的定义; 
	3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件; 
	4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果.没有输出的算法是毫无意义的; 
	5、可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成.

复杂度

解析:空间复杂度S(n):算法执行过程中所占辅助存储空间的大小
	时间复杂度:主要分析T(n)的数量级
		频度之和T(n):算法所执行的基本运算的次数和。
		时间复杂度大小判断:O(1)<O(logn)<O(n)<O(n^c)<O(c^n)<O(n!)	时间复杂度:常<对<幂<指<阶

复杂度计算

解析:时间复杂度:
		单个循环体:直接关注循环体的执行次数
			For(int i=0;i<=n;i++){sum=sum+i};循环体执行次数k=n+1;
			时间复杂度:O(n);
			For(int i=1;i<=n;i=2*i){sum=sum+i};满足条件:2^k<=n;循环体执行次数:[log2n]
			时间复杂度:O(logn);
		多个循环体:加法规则,乘法规则
			加法规则:O(f(n)) + O(g(n))=O(max(f(n),g(n)))
			乘法规则:O(f(n)) * O(g(n))=O(f(n) * g(n))	
	 空间复杂度:
		指算法运行过程中所使用的辅助空间的大小
		辅助空间:除了存储算法本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。

二.线形表

线性表

解析:线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了哨位结点)。

线性表的分类

解析:
1. 顺序存储:顺序表(数组):线性表的顺序存储是指用一组连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理存储位置上也相邻。这种存储方式无需占用额外的存储空间来存储。
   优点:可以随机读取 表中的元素。按照序号检索元素比较快。
   缺点:插入、删除元素都需要移动元素

2. 链式存储:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
   (1).  单链表:(data)数据域  + next(指针指向后继节点)  最后一个节点指针域为null
   (2). 循环链表:(data)数据域  + next(指针指向后继节点) 最后一个指针域为指向第一个节点。因此循环链表可以从任意节点开始遍历整个链表。
   (3). 双向链表:prior(指针指向前驱节点) + (data)数据域  + next(指针指向后继节点) 每个节点包含两个指针,分别指明当前元素的直接前驱和直接后继的存储信息。可以从两个方向遍历链表中的元素。
   (4). 静态链表(借助数组实现):数组下标 + (data)数据域  + next(指针指向后继节点的数组下标) 头结点数据域没有内容,尾结点指针为-1

三.栈和队列

解析:'栈'是只允许在一端进行插入或删除操作的线性表。栈的修改要遵循'先进后出'的原则,在栈中进行插入和删除操作的一端称为栈顶(Top)。另一端被称为栈底(bottom)。不包含任何元素的栈称为空栈。
	1. 顺序栈:栈的顺序存储是指用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素,同时附设置指针top指示栈顶元素的位置。顺序存储的栈也被称为顺序栈。这种存储方式,需要预先定义或申请栈的存储空间,所以顺序栈的空间容量是有限的。在入栈的时候要判断是否栈满的情况。否则会出现上溢的异常。
	2. 共享栈:利用栈底位置相对不变,让两个顺序栈共享一个一维数组,将两个栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
	3. 链栈:链式存储的栈也被称为链栈。元素的插入、删除操作仅能在栈顶一端进行。因此可以不必设置头节点。

栈的用途

解析:栈的典型应用包括表达式求值、括号匹配等。在编程领域实现将递归过程转变为非递归过程的处理中,栈可以起到重要作用。还可以实现数据的逆向输出。

队列

解析:'队列'是一种特殊的线性表,特殊之处在于它只允d许在线性表的前端(front)进行删除操作,而在线性表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
	1. 顺序队列:利用一组地址连续的存储单元存放队列中的元素。由于队列中的元素插入和删除限定在两端进行,因此设置队头指针(front)和队尾指针(rear)需要分别指示当前的队头元素和队尾元素。顺序队列的存储空间是提前设定好的,因此队尾指针会有一个上限值,达到上限就不能够再入队操作了。需要等队头有元素被移除。判断顺序队列位空队列的方法是队头和队尾的值相同。注意:针对空队列要能区分队头队尾元素,可以通过标识位来区分队头和队尾元素的不同。
	2. 链式队列:队列的链式存储称为链队列。链队列判断是否为空队列的条件是值相同并且均指向头节点。

队列的用途

解析:队列常用于需要排队的场合,比如打印机打印文件、离散事件的计算机模拟、消息队列、定时任务等方面。

四.串

'串'是限定了元素为字符的线性表。串是由零个或多个字符组成的有限序列,某个字符在串中的序号称为这个字符的位置。串中字符的个数称为串的长度,含有零个元素的串叫空串。

五.树和二叉树

树和森林

'树'是n(n>=0)个节点的有限集合。当n=0时称为空数,当n>0 为非空树,任何非空树中,有且仅有一个根节点;其余节点可分为m(m>=0)个互不相交的有限集合T1、T2 等,     其中每一个集合都可以称为一棵树,称为根节点的子树。
术语:
	双亲孩子、兄弟:节点的字数的根称为该节点的孩子,该节点称为其子节点的双亲。具有相同双亲的节点互为兄弟节点。
	节点的度:一个节点下的子节点个数称为节点的度。
	叶子节点:是指度为0的节点,也被称为终端节点。		
	内部节点:度不为零的节点称为分支节点或非终端节点。去掉根节点,分支节点称为内部节点。
	节点层次:层次从根开始定义起,根为第一层,根的孩子为第二层,依次累计。
	树的高度:一棵树的最大层次数称为树的高度或者树的深度。
	有序(无序)树:树中的节点的各个子树看成是从左到右有次序的,即不能交换,则称为有序树,否则为无序树。
	森林:m(m>=0)棵互不相交的树的集合。

二叉树

'二叉树'是n(n>=0)个节点的有限集合,它或者是空树(n=0),或者是由一个根节点及两棵不相交的、分别称为左子树、右子树的二叉树所组成。
	1. 二叉树的顺序存储结构: 用一组地址连续的存储单元存储二叉树的节点,必须把节点排成一个适当的线性序列,并且节点在这个序列中的相互位置可以反映出节点之间						的逻辑关系顺序存储适合对完全二叉树的存储方式,既简单又节省空间。对于一般二叉树而言,因为在顺序存储结构中,以节点在存储单元中的						   位置来表示节点之间的关系,所以存储方式也必须按照完全二叉树的方式存储,这样会造成空间上的浪费。最坏的情况,一个深度为h且只有h个						   节点的二叉树(也是单枝树)需要(2^h)-1存储单元
	2. 二叉树的链式存储结构: 由于二叉树中节点包含数据、左子树根、右子树根、双亲信息,因此可以用三叉链表或二叉链表来 存储二叉树,链表的头指针指向二叉树的根						 节点。
二叉树的遍历: 遍历是按某种策略访问树中的每个节点,仅访问一次。对于含有n个节点的二叉树遍历算法的时间复杂度O(n)
	先序遍历(PreOrder):如果二叉树为空,什么也不做否则:(1)访问根结点	(2)先序遍历左子树 (3)先序遍历右子树
	中序遍历(InOrder): 如果二叉树为空,什么也不做否则:(1)中序遍历左子树 (2)访问根结点 (3)中序遍历右子树
	后序遍历(PostOrder):如果二叉树为空,什么也不做否则:(1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点

哈夫曼树(最优二叉树): 节点的路径:从树的一个节点到另一个节点之前的通路。该通路的分支数据称为路径长度。	
	节点的带权路径:节点到树根之间的路径长度*该节点的权重值。树的带权路径长度为树种所有叶子节点的带权路径长度之和。数值最小的就是哈夫曼树。

六.图

'图'是比树更加复杂的数据结构,在图的结构当中,任意两个节点之间都有可能有直接关系,所以图中一个节点的前驱和后继的数目是没有限制的。
	1. 有向图:若图中的每条边都是有方向的,则称为有向图。
	2. 无向图:若图中的每条边都是无方向的,则称为无向图。
	3. 完全图:若一个无向图具有n个顶点,,而每一个顶点与其他n-1个顶点之间都有边,则称为无向完全图。
图的存储结构:(1)邻接矩阵法 (2)邻接链表法
图的遍历:(1)广度优先搜索(2)深度优先搜索
最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。

七.查找

线性结构:(1)顺序查找: 用逐一比较的办法顺序查找关键字
			性能分析:顺序查找平均查找长度为:(n+1)/2,时间效率为O(n)
			特点:算法简单、适应面广,对查找表的结构没有要求,无论记录是否按关键字有序排列均可使用。在n值较大时,平均查找长度较大,查找效率较低
		(2)折半查找:先给数据排序,形成有序表,把待查数据值与查找范围的中间元素值进行比较,会有四种情况出现
		          1. 待查找值与中间元素值相等,返回中间元素值的索引
		          2. 带查找数值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1,直到找到相等的值
		          3. 待查找数值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1,直到找到相等的值
		          4. 如果最后找不到相等的值,则返回错误提示信息
		  	平均查找长度:(n+1)/n * log2(n+1) - 1 = log2(n+1) - 1
		  	特点: 折半查找比顺序查找效率要高,但它要求查找表进行顺序存储并且按关键字有序排列,因此对表进行元素的插入和删除时,需要移动大量的元素,所以折半查找适用于表不易变动,且又经常进行查找的情况
		(3)分块查找:索引顺序查找,首先把表分成若干块,每一块中的关键字不一定有序,但块之间是有序的,即后一块中所有记录的关键字均大于前一块中最大的关键字,还建立了一个索引表,索引表按关键字有序
			查找步骤分两步:(1)对索引表使用折半查找法.(2)确定了待查关键字所在的子表后,在子表内采用顺序查找法
树形结构:
	(1)二叉排序树:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
	(2)二叉平衡树
	(3)B树,B+树
哈希结构(散列结构):
	哈希表:根据关键码值(key value)而直接进行访问的数据结构,由关键码的值决定数据的存储地址,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表
		优点:查找速度极快(O(1)),查找效率与元素个数n无关!
		哈希冲突:2个关键字处理函数的结果映射在了同一位置上
		避免哈希冲突的方法:1. 构造好的哈希函数
							(1)所选函数尽可能简单,以便提高转换速度
							(2)所选函数对关键码计算出的地址,应在哈希地址内集中并大致均匀分布,以减少空间浪费
						2. 制定一个好的解决冲突的方案
							(1)查找时,如果从哈希函数计算出的地址中查不到关键码,则应当依据解决冲突的规则,有规律的查询其他相关单元

八.内部排序

排序

解析:排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。
	内部排序:
		插入排序:
			直接插入排序
			折半插入排序
			希尔排序
		交换排序:
			冒泡排序
			快速排序
		选择排序
			简单选择排序
			堆排序
		归并排序
		基数排序
	外部排序:
		多路并归排序

解析:'堆'是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
	(1)堆中某个节点的值总是不大于或不小于其父节点的值;
	(2)堆总是一棵完全二叉树。

递归与分治

递归:

调用自身(p11阶乘函数,p14 Hanoi塔问题)

阶乘:

int factorial(int n){
    if (n==0) return1;
	return n*factorial(n-1);
}

Fibonacci数列

前两个数相加等于第三个数

Int fibonacci(n)

{if(n<=1)return 1;

return fibonacci(n-1)+Fibonacci(n-2);

}

Hanoi(P15)

Hanoi(a,b,n)  //n个盘子从a到b

If n=1 then move(a,b) //一个盘子从a到b

else Hanoi(a,c,n-1)

move(a,b)

Hanoi(c,b,n-1)

11

分治法:

定义:将一个大问题分割成规模较小的子问题,子问题相互独立且与原问题相同。

Divide-and-Conquer(P)

If |P|≤c then S(P)

Divide P into P1,P2,P3,……..,Pk //划分子问题

for i←1 to k  //递归的求解第一个子问题到第k个子问题

yi←Divide-and-Conquer(Pi)   //把子问题的结果放在yi作为输出

return merge(y1,y2,y3,..,yk)   //把y1到yk的解综合

二分搜索算法:将a[n]个已经排好序的元素分为个数大致相同的两半,取a[n/2]与x作比较,直到找到则中止算法。

合并排序:

快速排序:

Quicksort(A,p,r)//快速排序

If p<r

then q←Partition(A,p,r)

A[p] ⇆ A[q]

Quicksort(A,p,q-1)

Quicksort(A,q+1,r)

 

Partition(A,p,r)//划分函数

x←A[p]

i←p

j←r+1

while true do

repeat i←i1

until A[i]>x   //比首元素大的

if i<j

then A[j] ⇆ A[j]

else return j

贪心算法和动态规划的不同:

贪心算法对每个子问题的解决方案都做出选择,不能回退。

动态规划则会保存以前的运算结果,并依据以前的结果对当前进行选择,有回退功能。

贪心算法:

以逐步的局部最优,达到最终的全局最优。(选择性质的对错决定了算法的成败,贪心法必须使用归纳法进行正确性证明)//局部的最优解不一定能达到全局的最优解

最优装载:

二元前缀码:二叉树向左为0,向右为1。 ·

平均传输位数:码的深度乘频率再求和。(最优前缀码 (哈夫曼):平均传输位数最小)

最小生成树:具有最小权值

生成树:没有回路。 权值:平均传输深度值

二分搜索

思想:在排好序的n个元素中找到一个特定元素x。

1将n个元素分为个数大致相同的两半,取中间值n/2与要查找的元素x比较。

2若n/2=x,则找到x,算法终止;若n/2>x则在n的左半部继续使用二分搜索。若n/2<x则在n的右半部继续使用二分搜索。

最小生成树

Prim算法:

初始一个节点S,把剩余节点与S集合最小的权值依次加进来

Kruskal算法:

按长度排序,依次考察当前最短边。如果不构成回路则加入

动态规划

**动态规划:**把求解的问题分成许多阶段或多个子问题然后按顺序求解各个子问题。前一个子问题的解为后一个子问题的求解提供了有用的信息。在求解任何一子问题时列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解,依次解决子问题,最后一个子问题就是问题的解。(全局问题和子问题优化函数之间没有依赖关系则不能使用动态规划算法)

1.递归+记忆化→递推

2.状态的定义

3.状态转移方程

4.最优子结构

基本步骤:(1)找出最优解的性质,并刻划其结构特征。(2)递归的定义最优值。(3)以自底向上的方式计算出最优值。(4)依据计算最优值时得到的信息,构造最优解。

最优二叉检索树:< 进入左子树,>进入右子树。空隙:(x1,x2)

最大字段和:

回溯法

**回溯法:**按照深度优先策略从根结点出发搜索解空间。法搜索至解空间的任一结点时总是先判断该结点是否问题约束条件。如果满足进入该子树继续按深度优先的策略搜索。否则不去搜索以该结点为根的子树而是逐层向其祖先结点回溯。其实回溯法就是对隐式图的深度优先搜索算法。

装载问题:

批处理作业调度:

0-1背包问题:

分支限界法

分支限界法:

迭代法:不断用变量的旧值递推出新值(递推方程的右部替代左

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值