Yuhang Peng

图:找关键点

图上的关键点(articulation points) 我们之前介绍过 图的基本概念,我们知道如果一个图是连通的,表明图上任意的一个节点都可以通过遍历来访问到图上的其他节点。 在此基础上,我们在做一下延伸,在一个连通图中,如果移除任意一个节点都不会破环其连通性,那么这个的图就被称为 双向连通的(biconnected)。比如下图就是一个双向连通图: 这和我们今天讲的东西有什么联系?...

从图到树:最小生成树

最小生成树是什么 在之前的 文章 中,我们介绍了图的基本概念,以及图跟树的关系。我们知道树其实是特殊的图,树与图相比,节点都是一样,区别无非是在边上做了些限制。 我们现在考虑一个问题,给定一个无向连通有权图 G = (V, E),需要选出一系列的边,形成一个新的图,这个图依旧连通着之前图上的所有节点,并使得所有边的权重和最小。 先不着急解答这个问题,首先思考一点,假设节点数量是 V,我...

图上的最短路径:Dijkstra

图的基本概念 在开始今天的内容之前,我们先来弄清楚两个问题,“图是什么?”,“图又有哪些表示形式?”。 同链表和树一样,图也是由两个东西组成————节点(vertices)和边(edges)。与图不同的是,链表和树都会对其边做一些限制,比如对普通单链表来说,每个节点一一首尾相连,一眼看过去,链表就是一个线性结构。树的话在链表的基础上放宽要求,比如二叉树的每个节点可以有两个子节点,但是一般...

堆的优化:二项堆

普通堆存在的问题 在前面一篇 文章 中,我们介绍了堆,准确地说是二叉堆,这是最简单也是最基础的堆结构。它可以在 O(1) 的时间获取最值,其它各项操作时间复杂度均为 O(logN)。 普通堆有什么问题?难道这些操作还可以更快?先不急着思考如何优化,让我们来看一个案例。在实际场景中,我们经常需要做的一件事是合并两个数据集,比如将两个数组进行合并,将两个集合进行合并等等。堆也不例外,想象一下...

堆的基本概念和操作

堆(在 Java 中被称为优先队列)能够在常数时间内获取一个数据集合中的最值,更重要的是,这个数据结构在排序、文件合并、以及一些筛选算法中都有广泛的应用。 基本概念与结构 这篇文章我们介绍的堆是 二叉堆(Binary Heap),这是最简单也是最基础的堆结构。一般来说,没有特指,堆指的就是二叉堆。在此结构基础上进行调整,我们可以得到其他更为复杂的堆结构,比如二项堆(Binomial He...

如何做到换位思考

换位思考也是这段时间频繁出现在我反思中的话题。我们具体该如何做到换位思考呢?《黑客与画家》中提到 “判断一个人是否具备 ‘换位思考’ 的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题”。这也是一个结果,问题是有哪些方式方法可以帮助我们形成换位思考的意识呢? 先从亲人或特别熟悉的人开始,尝试思考他们一天都在想什么 就类似我写 豆泡日记 一样,亲人在自己身边的时间最多...

评判大于发展?

之前在写反思的时候就在想一个问题,一家公司,每当工作中出现了问题或者状况,人们总是习惯先根据自己的想法来对这件事进行评判,并且往往还会去想尽办法找到相关人士进行问责。这就给人一种感觉,好像大家都是在逃避问题,而不是想办法解决问题。如果以发展的眼光来看问题,那么解决当下的问题并努力制定好流程体系才是重中之重。当然,这种现象不仅仅只是在工作中出现,生活中也随处可见,比如家庭成员总是会评价别人付出...

对世界永远保持质疑

《黑客与画家》中说到,我们需要去找到那些 “不能说的话”,这样可以让我们保持好奇心,看到别人看不到的东西,找到经得住时间考验的思想。当然这也可以锻炼我们的自主思考能力,不被别人牵着鼻子走。 世界上很多东西都是经不起时间考验的,比如今年流行的东西明年就不流行了,现在用的技术过一段时间就被淘汰了,甚至是一些传统的观念也会随着时间推移而被取代。当然了,我们也不能否认,有些东西确确实实能给我们带来...

三个月带娃经验分享

距离豆泡诞生(5/16)已经 3 个月了。3 个月,说长也不长,说短也不短。在这 3 个月的相处过程中,我也学习了一些带娃的 理念 和 技巧。借着这个机会分享出来,说是分享,其实也是自己的反思与总结。 上面我提到了理念和技巧,在我看来,理念是道,而技巧是术,理念的重要程度要远远大于技巧。理念决定着你对事情本质的看法,它也决定着你努力的方向,而技巧只是帮你更快速地、更省力地把事情做好。如果理...

Linux 自带的日志轮询功能

很多时候,系统上的程序在运行的过程中会往某个本地文件写日志,久而久之这个文件会变得非常巨大,很难查看不说,而且占据了大量的磁盘空间。 通常来说,我们会以时间为单位来对日志进行划分,比如每天的日志都放在不同的文件中,然后时间比较久的日志(比如 3 个月以前的日志)我们会选择自动丢弃从而保证磁盘空间不被浪费。这些操作你可以自己写程序来实现,当然了,为了避免重复造轮子,你也可以下载第三方的应用程...