野生前端的数据结构基础练习(8)——图

网上的相关教程非常多,基础知识自行搜索即可。

习题主要选自Orelly出版的《数据结构与算法javascript描述》一书。

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/graph

一.图的基本知识

基本概念

图是由边的集合和点的集合组成的。如果图的边有方向(或者说图中的顶点对是有序的)则成为有向图,如果边没有方向则称为无向图

基本建模

图可以用来对现实中许多事物进行建模。比如交通流量,计算机网络等。

二.基本练习

  1. 构建一个图的类Graph
  2. 图的深度优先搜索(DFS)

    深度优先搜索从起始顶点开始,直到到达最后一个顶点,然后回溯,直到遍历完随后顶点或查找到指定顶点。深度优先是应用非常广泛的基本搜索思想,往往借助结构来实现。demo中的dfs.js直接使用函数的调用栈来追踪搜索,如果数据量很大,则可以通过手动用一个数组来管理

  3. 图的广度优先搜索(BFS)

    广度优先搜索从第一个顶点开始,尝试访问尽可能靠近它的顶点,搜索范围基本是逐层移动的。它的实现依靠数据结构中的队列来实现。

  4. BFS查找最短路径

    图最常见的操作之一就是寻找从一个顶点到另一个顶点的最短路径。书中示例中通过this.edgeTo这个数组来存储顶点的访问路径,例如w节点是通过访问v节点的临近节点时访问的,那么就执行如下赋值this.edgeTo[w] = v,并将节点标记为已访问,由于广度优先搜索逐层扩展的特性,最终通过this.edgeTo迭代显示出的路径必然是搜索中最先实现标记的路径,也就是最短的路径,所以并不需要将每次访问都记录下来最终再比较步长。

  5. 拓扑排序

    拓扑排序用于输出一个有向无环图所有顶点的线性序列,使之满足:

    a 每个顶点只出现一次

    b 若存在一条从顶点A到B的路径,那么序列中A一定出现在B前面。

    书中给出的示例在输出时描述有误,导致输出结果与真实的排序是相反的,在拓扑排序时采用了结构,入栈顺序是反的,正确的输出顺序是按照出栈顺序来输出。

三.小结

图论是非常复杂的领域,对数学基础要求较高,感兴趣的读者可以自行继续研究。至此,基本数据结构的课就补完了,希望你也认真做了练习,完成了这个基本的扫盲过程。

原文地址:https://www.cnblogs.com/dashnowords/p/10030035.html

时间: 2024-10-07 22:46:42

野生前端的数据结构基础练习(8)——图的相关文章

野生前端的数据结构基础练习(7)——二叉树

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/btree 一.二叉树的基本知识 基本概念 一棵树最上面的点称为根节点,如果一个节点下面连接多个节点,那么该节点称为父节点,下面的节点称为子节点,二叉树的每一个节点最多有2个子节点,一个节点子节点的个数称为度,二叉树每个节点的度只能是0,1

野生前端的数据结构基础练习(3)——链表

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/List 链表的基本知识 特点: 链表由节点组成,每个节点增加一个对象的引用指向它的后继节点.链表也就是将一个线性表转换为一个存储空间上不连续,而在抽象层面可连续访问的表. 用途: 更快的插入和删除,因为只需要操作插入删除位置相邻元素即可,

野生前端的数据结构基础练习(2)——队列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Queue 队列的基本知识 特点: 先进先出. 用途: 模拟流程或其他带有抽象排队属性的事物或逻辑,例如时间循环队列,发布订阅模式的回调队列等等. 基本方法 enqueue()在队尾插入一个元素 dequeue()从队头删除一个元素 get

野生前端的数据结构基础练习(5)——散列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Hash 散列的基本知识 定义 哈希表是一种根据关键码去寻找值的数据映射结构,最直观的应用就是字典(现实的字典,不是数据结构的字典概念). 特点: 插入,删除,取用较快,查找较慢(例如查询最值,需要借助其他数据结构来提升效率). 散列函数应

野生前端的数据结构基础练习(6)——集合

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Set [TOC] 集合的基本知识 定义: 集合Set是一种不包含不同元素的数据结构,主要特性包括无序性和单一性,即集合中的成员是无序的,同时也是不重复的. 基本练习 实现一个自定义的cSet类(避免与原生的Set类冲突),包含以下方法:

野生前端的数据结构练习(1)——栈

习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Stack 基本练习 根据栈的特性实现一个Stack类,并在后续题目中需要用栈时使用它. 编写一个函数unitTrans(num, unit),num为一个10进制数字,unit要转换的进制数,求转换结果. 编写一个函数recursion(num),num为一个10进制数字,要求输出n

野生前端的数据结构练习(10)希尔排序,归并排序,快速排序

一.希尔排序 shell sort也称缩小增量排序,是对插入排序算法的改进,其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成.在较大的数据集上,希尔排序对于插排的优化效果是非常明显的. ./** * 希尔排序示例代码 */ function shellSort(gaps, arr) { for(let g = 0; g < gaps.length; g++){ let h

野生前端的数据结构练习(11)动态规划算法

一.动态规划算法 dynamic programming被认为是一种与递归相反的技术,递归是从顶部开始分解,通过解决掉所有分解出的问题来解决整个问题,而动态规划是从问题底部开始,解决了小问题后合并为整体的解决方案,从而解决掉整个问题. 动态规划在实现上基本遵循如下思路,根据边界条件得到规模较小时的解,小规模问题合并时依据递推关系式进行,也就是说较大规模的问题解可以由较小问题的解合并计算得到.最经典易懂的就是使用递归算法和动态规划算法两种不同的方式来计算斐波那契数列或求阶乘的对比,动态规划算法的特

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完