Topological Sort 这里讨论一下拓扑排序,以及怎么检查有向图有没有带环。 DAG介绍DAG叫有向无环图,他描述了整个连通图中的某个子图不能带有环的,只要有环,就不能称为有向无环图。 下图是错误的,带环的图。 拓扑排序介绍拓扑排序该算法在1972年设计编译器时被发明出来,当时的问题是,怎么解决代码编译的依赖问题。因为代码都是有顺序的,例如:C代码文件依赖B代码文件,B依赖A,B依赖D,那在编译时就不能先编译B,得将 2020-12-01 算法与数据结构 #图
Observer 1. 观察者模式简介观察者模式描述了一对多的关系,让多个观察者监测到主题,当主题发生改变的时候,能够通知到观察者,让其能更新自己。这么说挺抽象的,我举一些实际应用的例子,如果你有一些开发经验的话,这些应用你肯定也用过。比如redis的发布-订阅功能、Java Swing编程里的源-监听器。 观察者模式中有两个概念比较重要,主题(Subject)又叫被观察者,观察者(Observer)。下图截选自百 2020-11-29 设计模式
BFS 前文了解了如何用深度优先遍历算法去遍历图,本文换一种方式遍历图,广度优先遍历算法(Breath-First Search),下面用Java实现以下它。 一. BFS介绍BFS它遍历的策略是:对于当前访问的顶点V,依次访问其所有的兄弟节点,直到遍历完为止,再以兄弟节点重复此操作,直到整个图遍历完为止。下面画个图来看看。 BFS是这样的一个遍历思路,先找到顶点1并输出,找到1的第一个邻接点8并输出, 2020-11-28 算法与数据结构 #图
SkipList 本文我们用Java实现跳表的创建 一. 跳表介绍我们知道单链表的查询时间复杂度为O(n),那么有没有优化的办法呢?这里介绍一种数据结构,叫跳表,跳表应用十分广泛,比如最熟悉不过的redis,Redis中的有序集合(Sorted Set)就是⽤跳表来实现的。另外Java JUC中也有它的影子,想要了解的可以看下ConcurrentSkipListMap和ConcurrentSkipListSet , 2020-11-26 算法与数据结构 #图
ListDG 本文我们用Java实现邻接表有向图的创建。 一. 邻接表有向图介绍邻接表底层使用了一个数组+链表来存储图,数组用于存储图的顶点,链表存储两个顶点之间的关系。如下图所示 二.代码说明1. 基本定义这里定义还是和之前一样 1234567891011121314151617181920public class ListDG { private VNode[] vNodes; // 2020-11-24 算法与数据结构 #图
MatrixDG 前文我们介绍了邻接矩阵创建无向图,本文我们用Java实现邻接矩阵有向图的创建。 一. 邻接矩阵有向图介绍有向图的应用方向也很广,比如微信中好友A可以添加B但是,B可以不添加A,再比如微博中的关注数,下图体现出了无向图和有向图的差异,同时还拓展了,第三种图,加权图。 二.代码说明1. 基本定义这里定义还是和之前一样 12345678public class MatrixDG<T> &# 2020-11-22 算法与数据结构 #图
DFS 前文我们知道了如何创建无向图,分为邻接表和邻接矩阵两种方式,本文通过Java实现经典图的遍历算法-深度优先遍历算法(Depth First Search) 一. DFS介绍深度优先遍历算法是一种算法,是一种遍历图的方法,在里面可以体会一下递归和回溯的思想。 讲一个寻找路径的小例子,方便理解比如“⾛迷宫”。 假设你站在迷宫的某个岔路⼝,然后想找到出⼝。你随意选择⼀个岔路⼝来⾛,⾛着⾛着发现⾛不 2020-11-21 算法与数据结构 #图
ListUDF 前文我们通过邻接矩阵创建了无向图,本文通过Java实现邻接表创建无向图。 一. 邻接表无向图的介绍邻接表无向图是一种数据结构,与之前邻接矩阵无向图不同的是,它使用链表来存储顶点的关系,也就是用链表存储边。如下面所示 Tips: 之前用矩阵存储会造成空间上的额外开销,用链表就可以很好地改善,但代价是要花费更多的时间依次遍历链表每个节点。在实际工程中优化的话,可以考虑将链表换成哈希表、跳表或者 2020-11-21 算法与数据结构 #图
MatrixUDG 本文通过Java实现邻接矩阵无向图。 一. 邻接矩阵无向图的介绍邻接矩阵无向图是一种数据结构,其利用数组存储顶点,二维数组存储顶点之间的关系来存储数据。如下面所示 Tips: 不难发现它是用空间换时间的策略,这么存边会造成很大的空间浪费,对于顶点关系的检索速度会很快。优化的话可以考虑使用稀疏数组来替换二维数组。同样的策略也适用于邻接矩阵有向图 二. 邻接矩阵无向图的代码说明1. 基本定义1 2020-11-21 算法与数据结构 #图
高效VIM编辑器 学习一些vim快捷键和自定义vim快捷键可以提高我们的开发效率 Vim 中自定义快捷键map系列命令这个命令的声明如下: :map {lhs} {rhs}。这个命令就是将{lhs}代表的按键映射成{rhs}所代表的按键。例如map L $就是将$键映射成L。此外需要注意的是map命令定义的快捷键是可以嵌套的,例如下面这样的命令: map L $map Y yL 就是将Y按键映射成了y$按键。 更多 2020-11-15 其他 #Linux