数据结构与算法基础知识点(数据结构和算法基础)

http://www.itjxue.com  2023-02-19 15:15  来源:未知  点击次数: 

数据结构知识点总结

线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。是随机存取的顺序存储结构。顺序存储指内存地址是一块的,随机存取指访问时可以按下标随机访问,存储和存取是不一样的。

用一组任意的存储单元来依次存放线性表的结点,这组存储单元即可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。链表中结点的逻辑次序和物理次序不一定相同。

队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。先进先出。

串(String)是零个或多个字符组成的有限序列。长度为零的串称为空串(Empty String),它不包含任何字符。通常将仅由一个或多个空格组成的串称为空白串(Blank String) 注意:空串和空白串的不同,例如“ ”和“”分别表示长度为1的空白串和长度为0的空串。

串的表示和实现

数组和广义表可看成是一种特殊的线性表,其特殊在于: 表中的元素本身也是一种线性表。内存连续。根据下标在O(1)时间读/写任何元素。

二维数组,多维数组,广义表,树,图都属于非线性结构

数组

数组的顺序存储:行优先顺序;列优先顺序。数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。

关联数组(Associative Array),又称映射(Map)、字典( Dictionary)是一个抽象的数据结构,它包含着类似于(键,值)的有序对。 不是线性表。

广义表

广义表(Lists,又称列表)是线性表的推广。广义表是n(n≥0)个元素a1,a2,a3,…,an的有限序列,其中ai或者是原子项,或者是一个广义表。若广义表LS(n=1)非空,则a1是LS的表头,其余元素组成的表(a2,…an)称为LS的表尾。广义表的元素可以是广义表,也可以是原子,广义表的元素也可以为空。表尾是指除去表头后剩下的元素组成的表,表头可以为表或单元素值。所以表尾不可以是单个元素值。

三个结论

考点

一种非线性结构。树是递归结构,在树的定义中又用到了树的概念。

基本术语

1.树结点:包含一个数据元素及若干指向子树的分支;

2.孩子结点:结点的子树的根称为该结点的孩子;

3.双亲结点:B结点是A结点的孩子,则A结点是B结点的双亲;

4.兄弟结点:同一双亲的孩子结点;

5.堂兄结点:同一层上结点;

6.结点层次:根结点的层定义为1;根的孩子为第二层结点,依此类推;

7.树的高(深)度:树中最大的结点层

8.结点的度:结点子树的个数,就是有几个孩子

9.树的度: 树中最大的结点度。

10.叶子结点:也叫终端结点,是度为0的结点;

11.分枝结点:度不为0的结点(非终端结点);

12.森林:互不相交的树集合;

13.有序树:子树有序的树,如:家族树;

14.无序树:不考虑子树的顺序;

二叉树

二叉树可以为空。二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。这是二叉树与树的最主要的差别。

注意区分: 二叉树、二叉查找树/二叉排序树/二叉搜索树、二叉平衡(查找)树

二叉树遍历

先序遍历:根左右

中序遍历:左根右

后序遍历:左右根

层次遍历:一维数组存储二叉树,总是以层次遍历的顺序存储结点。层次遍历应该借助队列。

二叉树性质

1.在二叉树的第 i 层上至多有2的i次幂-1个结点

2.深度为 k 的二叉树上至多含 2的k次幂-1 个结点(k≥1)

3.树与转换后的二叉树的关系:转换后的二叉树的先序对应树的先序遍历;转换后的二叉树的中序对应树的后序遍历

一些概念

1.路径:从一个祖先结点到子孙结点之间的分支构成这两个结点间的路径;

2.路径长度:路径上的分支数目称为路径长度;

3.树的路径长度:从根到每个结点的路径长度之和。

4.结点的权:根据应用的需要可以给树的结点赋权值;

5.结点的带权路径长度:从根到该结点的路径长度与该结点权的乘积;

6.树的带权路径长度=树中所有叶子结点的带权路径之和;通常记作 WPL=∑wi×li

7.哈夫曼树:假设有n个权值(w1, w2, … , wn),构造有n个叶子结点的二叉树,每个叶子结点有一个 wi作为它的权值。则带权路径长度最小的二叉树称为哈夫曼树。最优二叉树。

图搜索-形成搜索树

1.穷举法

2.贪心法。多步决策,每步选择使得构成一个问题的可能解,同时满足目标函数

3.回溯法,根据题意,选取度量标准,然后将可能的选择方法按度量标准所要求顺序排好,每次处理一个量,得到该意义下的最优解的分解处理

无向图

1.回路或环:第一个顶点和最后一个顶点相同的路径。

2.简单回路或简单环:除第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路

3.连通:顶点v至v’ 之间有路径存在

4.连通图:无向图图 G 的任意两点之间都是连通的,则称G是连通图。

5.连通分量:极大连通子图,子图中包含的顶点个数极大

6.所有顶点度的和必须为偶数

有向图

1.回路或环:第一个顶点和最后一个顶点相同的路径。

2.简单回路或简单环:除第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路。

3.连通:顶点v至v’之间有路径存在

4.强连通图:有向图G的任意两点之间都是连通的,则称G是强连通图。各个顶点间均可达。

5.强连通分量:极大连通子图

6.有向图顶点的度是顶点的入度与出度之和。邻接矩阵中第V行中的1的个数是V的出度

7.生成树:极小连通子图。包含图的所有n个结点,但只含图的n-1条边。在生成树中添加一条边之后,必定会形成回路或环。

8.完全图:有 n(n-1)/2 条边的无向图。其中n是结点个数。必定是连通图。

9.有向完全图:有n(n-1)条边的有向图。其中n是结点个数。每两个顶点之间都有两条方向相反的边连接的图。

10.一个无向图 G=(V,E) 是连通的,那么边的数目大于等于顶点的数目减一:|E|=|V|-1,而反之不成立。如果 G=(V,E) 是有向图,那么它是强连通图的必要条件是边的数目大于等于顶点的数目:|E|=|V|,而反之不成立。没有回路的无向图是连通的当且仅当它是树,即等价于:|E|=|V|-1。

图的邻接矩阵和邻接表

1.邻接矩阵和加权邻接矩阵

深度优先搜索利用栈

深度优先遍历类似于树的先序遍历,是树的先序遍历的推广

广度优先遍历

图的广度优先遍历就类似于树的层序遍历

每次遍历一个连通图将图的边分成遍历所经过的边和没有经过的边两部分,将遍历经过的边同图的顶点构成一个子图,该子图称为生成树。因此有DFS生成树和BFS生成树。

生成树是连通图的极小子图,有n个顶点的连通图的生成树必定有n-1条边,在生成树中任意增加一条边,必定产生回路。若砍去它的一条边,就会把生成树变成非连通子图

最小生成树:生成树中边的权值(代价)之和最小的树。最小生成树问题是构造连通网的最小代价生成树。

Kruskal算法 :令最小生成树集合T初始状态为空,在有n个顶点的图中选取权值最小的边并从图中删去,若该边加到T中有回路则丢弃,否则留在T中;依次类推,知道T中有n-1条边为止

Prim算法: 它的基本思想是以顶点为主导地位,从起始顶点出发,通过选择当前可用的最小权值边把顶点加入到生成树当中来:

1.从连通网络N={V,E}中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,V),将其顶点加入到生成树的顶点集合U中。

2.以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(U,V),把它的顶点加入到集合U中。如此继续下去,直到网络中的所有顶点都加入到生成树顶点集合U中为止。

Prim算法,Kruskal算法和Dijkstra算法都属于贪心算法

Dijkstra算法适用于边权值为正的情况,如果边权值为负数就才用另一种最短路算法Bellman-Ford算法。该算法是指从单个源点到各个结点的最短路,该算法适用于有向图和无向图。复杂度O(n^2)

Dijkstra算法图文详解

若从一个连通图中删去任何一个顶点及其相关联的边,它仍为一个连通图的话,则该连通图被称为 重(双)连通图。

若连通图中的某个顶点和其相关联的边被删去之后,该连通图被分割成两个或两个以上的连通分量,则称此顶点为 关节点。

没有关节点的连通图称为双连通图

1.生成树的根结点,有两个或两个以上的分支,则此顶点(生成树的根)必为关节点;

2.对生成树上的任意一个非叶“顶点”,若其某棵子树中的所有“顶点”没有和其祖先相通的回边,则该“顶点”必为关节点

拓扑排序。在用邻接表表示图时,对有n个顶点和e条弧的有向图而言时间复杂度为O(n+e)。一个有向图能被拓扑排序的充要条件就是它是一个有向无环图。

AOV网(Activity On Vertex):用顶点表示活动,边表示活动的优先关系的有向图称为AOV网。AOV网中不允许有回路,这意味着某项活动以自己为先决条件。

拓扑有序序列:把AOV网络中各顶点按照它们相互之间的优先关系排列一个线性序列的过程。若vi是vj前驱,则vi一定在vj之前;对于没有优先关系的点,顺序任意。

拓扑排序:对AOV网络中顶点构造拓扑有序序列的过程。方法:

采用 深度优先搜索 或者 拓扑排序 算法可以判断出一个有向图中是否有环(回路)。

深度优先搜索只要在其中记录下搜索的节点数n,当n大于图中节点数时退出,并可以得出有回路。若有回路,则拓扑排序访问不到图中所有的节点,所以也可以得出回路。广度优先搜索过程中如果访问到一个已经访问过的节点,可能是多个节点指向这个节点,不一定是存在环。

拓扑算法描述 :

AOE网:带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间。在工程上常用来表示工程进度计划。

常用哈希函数

1.直接定址法。

2.数字分析法。

3.平方取中法。

4.折叠法。

5.除留余数法。

6.随机数法。

冲突解决

1.开放定址法:当发生冲突时,形成一个探查序列,沿此序列逐个地址探查,知道找到一个空位置,将发生冲突的记录放到该地址中。即Hi=(H(key)+di) % m,i=1,2,……k(k=m-1),H(key)哈希函数,m哈希表长,di增量序列。

2.链地址法:将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针。

3.设有n个关键字具有相同的Hash函数值,则用线性探测法把这n个关键字映射到Hash表中需要做n (n-1)/2次线性探测。如果使用二次探测再散列法将这n个关键字存入哈希表,至少要进行n (n+1)/2次探测

4.Hash查找效率:装填因子=表中记录数/表容量

5.开哈希表——链地址法;闭哈希表——开放地址法

B树的查找

时间复杂度O(logn)

B树的插入

例:用1,2,6,7,11,4,8,13,10,5,17,9,16,20,3,12,14,18,19,15构建5阶B树

因为构建5阶的B树,所以每个节点的关键字个数范围为[2,4]

插入11时,该节点的关键字个数超出范围,进行分裂

之后直接插入4,8,13

当插入10时,节点关键字个数再次超出范围

将子节点分裂

直接插入5,17,9,16,插入20

关键字个数超出范围,进行分裂

继续插入3

关键字个数超出范围,进行分裂

继续插入15

关键个数超出范围,进行分裂

这时候根节点关键字个数也超出范围,继续分裂

B+的优点

1.单一节点存储更多的元素,使得查询的IO次数更少。

2.所有查询都要查询叶到叶子节点,查询更加稳定

3.所有叶子节点形成有序链表,便于范围查询。

北大青鸟设计培训:数据结构与算法知识?

对于大多数的程序员来说,在学习数据分析等技术的时候需要先了解关于数据结构以及算法等知识点,下面我们就给大家简单介绍一下什么是数据结构?什么是算法?大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。

但是,这些定义都很抽象,对理解这两个概念并没有实质性的帮助,反倒会让你陷入死抠定义的误区。

毕竟,我们现在学习,并不是为了考试,所以,概念背得再牢,不会用也就没什么用。

虽然我们说没必要深挖严格的定义,但是这并不等于不需要理解概念。

下面我就从广义和狭义两个层面,来帮你理解数据结构与算法这两个概念。

从广义上讲,数据结构就是指一组数据的存储结构。

算法就是操作数据的一组方法。

图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行“存储”。

按照一定规律编号,就是书籍这种“数据”的存储结构。

那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学、计算机,来定位书架,然后再依次查找。

笼统地说,这些查找方法都是算法。

从狭义上讲,也就是我们专栏要讲的,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。

这些都是前人智慧的结晶,我们可以直接拿来用。

我们要讲的这些数据结构和算法,都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。

那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢?这是因为,数据结构和算法是相辅相成的。

数据结构是为算法服务的,算法要作用在特定的数据结构之上。

因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。

比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。

但如果IT培训选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。

数据结构是静态的,它只是组织数据的一种方式。

如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。

数据结构算法的相关知识有哪些?

输入:一个算法具有零个或者多个输出。以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件。后面一句话翻译过来就是,如果一个算法本身给出了初始条件,那么可以没有输出。比如,打印一句话:NSLog。输出:算法至少有一个输出。也就是说,算法一定要有输出。输出的形式可以是打印,也可以使返回一个值或者多个值等。也可以是显示某些提示。有穷性:算法的执行步骤是有限的,算法的执行时间也是有限的。确定性:算法的每个步骤都有确定的含义,不会出现二义性。可行性:算法是可用的,也就是能够解决当前问题。算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的存储结构实质上是它的逻辑结构在计算机存储器中的实现,为了全面的反映一个数据的逻辑结构,它在存储器中的映象包括两方面内容,即数据元素之间的信息和数据元素之间的关系。不同数据结构有其相应的若干运算。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新和排序等。数据的运算是数据结构的一个重要方面,讨论任一种数据结构时都离不开对该结构上的数据运算及其实现算法的讨论。数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。数据类型可分为两类:原子类型、结构类型。在程序设计语言中,每一个数据都属于某种数据类型。类型明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。可以认为,数据类型是在程序设计中已经实现了的数据结构。在程序设计过程中,当需要引入某种新的数据结构时,总是借助编程语言所提供的数据类型来描述数据的存储结构。基带信号:指的是没有经过调制(进行频谱搬移和变换)的原始电信号。基带通信(又称基带传输):指传输基带信号。进行基带传输的系统称为基带传输系统。传输介质的整个信道被一个基带信号占用.基带传输不需要调制解调器,设备化费小,具有速率高和误码率低等优点,.适合短距离的数据传输,传输距离在100米内,在音频市话、计算机网络通信中被广泛采用。

(责任编辑:IT教学网)

更多

推荐ASP教程文章