0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

算法大神Tarjan

算法与数据结构 来源:算法与数据结构 作者:算法与数据结构 2021-01-04 14:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

有同学在学习图论算法的时候,发现这里有个 Tarjan 算法,那里有个 Tarjan 算法,而似乎 Tarjan 算法解决的问题并不一样,于是非常迷惑:Tarjan 算法到底是指什么?

这是一个很好的问题。Tarjan 是计算机领域的大牛,发明了很多现在大家耳熟能详的算法或者数据结构,所以有同学会觉得冠他名字的算法有些多。

但如果我们仔细梳理一下,其实并不复杂。

在这篇文章中,我会带领大家梳理一下 Tarjan 发明的算法都有哪些,整体脉络是怎样的。

注意:在这篇文章中,我不会具体讲解某个算法的原理。但是,我会给出很多具体的关键字,并且标红。如果大家对某个算法想深入了解,可以以此为引,在互联网上搜索学习。

我相信,互联网上关于某个具体算法的资料是非常多的,反而是这样按照某个脉络做总结的文章很少。

首先,Tarjan 是一名美国的计算机科学家和数学家,全名 Robert Endre Tarjan。

先来一个 Tarjan 大神的名言镇楼:

一般提起 Tarjan 算法,通常是指 Tarjan 发明的求解有向图的强联通分量算法,全称是Tarjan’s Strongly Connected Components Algorithm.

为什么这么叫?因为求解有向图的强联通分量还有一个著名算法:Kosaraju 算法。Kosaraju 算法也是以他的发明者的名字命名的。

我在算法比赛中,或者需要求解 SCC(强连通分量的缩写:Strongly Connected Components) 问题的时候,喜欢写 Kosaraju 算法。因为 Kosaraju 算法的实现非常简单,复杂度和 Tarjan 算法是一样的,都是 O(V + E) 的。

但实际上,Kosaraju 算法需要遍历两次图,而 Tarjan 算法只需要遍历一次图。所以,Tarjan 算法的性能更高,一般可以高 30% - 40% 左右。

而 Tarjan 算法之所以有名,关键在于使用 Tarjan 算法的思想,不仅仅可以求解 SCC 问题,还可以求无向图中的桥或者割点。

这就是为什么,很多同学看到 Tarjan 算法,做的事情不一样,但都叫 Tarjan 算法的原因。我们可以把 Tarjan 算法理解成是一种思想,基于这种思想,可以求解桥,割点,和 SCC 问题。

所谓的 Tarjan 算法思想,就是在遍历整个图的过程中,对每一个遍历的节点记录一个时间戳,通常被称为是 DFN;同时,记录通过这个节点,不经过父亲节点,最早能回到的时间戳,通常被称为是 LOW。通过这些信息,就能判断一个图的桥,割点,和强连通分量。

2ae9bf46-4423-11eb-8b86-12bb97331649.png

然而,Tarjan 的贡献远不止于此。以Tarjan命名的另外一个非常著名的算法,叫Tarjan‘s Off-line Least Common Ancestors Algorithm。

这个算法本质是借助并查集,求解 LCA(最近公共祖先的缩写:Least Common Ancestors)问题。

实际上,离线的 LCA 问题,是计算机科学领域非常著名的问题,深究下去,和Binary Lifting,RMQ等非常著名的算法思想都有联系。

2b0ed164-4423-11eb-8b86-12bb97331649.png

说到并查集,Tarjan 也和这种数据结构有不解之缘。并查集虽然不是 Tarjan 发明的,但是并查集的复杂度是 Tarjan 首先分析清楚的:也就是Ackerman 函数的反函数。

如果对此感兴趣的同学,可以翻看《算法导论》,《算法导论》对这部分内容介绍得很清楚。

实际上,这也是《算法导论》这本教材的意义:稍微深入一些的算法分析问题,一般的算法教材都不会涉及。而《算法导论》所覆盖的深度和广度,比大多数教材都高太多。

当然,这也是《算法导论》不适合入门的原因。

说到数据结构,Tarjan 确实发明过数据结构。最有名的两个,一个是斐波那契堆,一个是Splay 树。

Splay 树虽然不保证一定平衡,但各个操作的均摊复杂度是 O(logn) 级别的。

Splay 树最大的优势是实现简单,比红黑树简单不知道多少倍。所以,如果我们需要调用更加底层的树操作,需要自己实现一个自平衡的二分搜索树时,通常 Splay 树是首选。

也正因为如此,很多搞竞赛的同学,都是能手写 Splay 树的。

Tarjan 还是非常著名的算法:BFPRT的作者之一。其实 BFPRT 这个算法的名字,是其五个作者首字母的缩写。其中的 T,就是 Tarjan。

BFPRT 这个名字听起来非常拗口,同时也难记,但是它的另一个名字就很简单直接了,就是Median of Medians。

这个算法整体并不难理解,是快排思想的一种更稳定的优化,每次近乎可以保证选取所处理的数组的中位数作为标定点(pivot),使得快速排序的最差时间复杂度真真正正达到了 O(nlogn)。

值得一提的是,BFPRT 算法的这五位作者,都是计算机科学领域的大牛。他们分别是:

B是 Blum,全名 Manuel Blum,他因为复杂度理论方面的贡献,以及密码学的应用,获得了 1995 年的图灵奖;

F是 Floyd,全名 Robert W. Floyd,相信大家都很熟悉。大家在算法课本上一定会学到的所有点对的最短路径算法,就是他和 Warshall 一起提出的,即Floyd–Warshall 算法。同时,Floyed 还提出了非常著名的Floyed 环检测算法。他获得了 1978 年的图灵奖;

P是 Pratt,全名 Vaughan Pratt,是斯坦福的教授;

R是 Rivest,全名 Ron Rivest。他是 MIT 的教授,专攻密码学。我们现在所经常使用的MD5 算法,他就是作者之一;

最后的T,就是这篇文章的主角:Tarjan,全名 Robert Endre Tarjan。

在图论领域,Tarjan 还改进了一个非常著名的算法:最小树形图。最小树形图这个名字听起来很复杂,但其实这个概念很简单:就是有向图的最小生成树。

解决最小树形图问题,有一个非常朴素的算法,叫朱刘算法。听这个名字大家也知道,这是两位华人科学家首先提出来的算法,在论文记载中,分别是 Y.J. Chu 和 T.H. Liu 在 1965 年提出来的。朱刘算法的时间复杂度是 O(VE) 的。

后来,Tarjan 改进了这个算法,可以使用 O(ElogV) 的时间做预处理,之后使用 O(V) 的时间,求解图中以任意顶点为根的最小树形图

Tarjan 还发明了一种平面图的检测算法,首次在线性时间解决了平面图检测问题(Planarity-Testing)。因为平面图检测离大多数同学的工作比较远,所以可能很少有同学了解这个算法。

Tarjan 的平面图检测算法还有一个合作者:John Hopcroft。他们二人因为这个算法,以及在算法和数据结构等基础领域对计算机科学的贡献,获得了 1986 年的图灵奖。

Tarjan 的硕士和博士是在斯坦福大学读的。他的导师有两个。一个就是大名鼎鼎的 Floyd,上文介绍 BFPRT 算法的时候介绍了。在这里给一个年轻的时候,Floyd 风流倜傥的帅照:

Tarjan 的另一名导师,则是计算机科学领域的神级人物:Donald Knuth。他可以说是计算复杂领域的创始人。

Donald Knuth 的经历和贡献,可以写一本书了。有时间,我会再写一篇文章介绍他。现在,很多人了解他,都是因为他的神作:TAOCP,即The Art of Computer Programming,被中文翻译成《计算机程序设计艺术》。这套书被评为至今计算机科学史上最重要的神作,但其实还没有写完。

不过 Donald Knuth 对计算机科学领域的贡献,远不止一套书这么简单。要聊 Donald Knuth 的话,能聊的就太多。这篇文章我们收一收,说回 Tarjan。

Tarjan 现在还在世,今年已经 72 岁了。根据维基百科,现在 Tarjan 在普林斯顿任教。

实际上,在计算机科学领域,很多在教科书中出现的人物,都还在世;很多教科书级别的算法,概念,理论,其实距离提出,也不过是几十年的时间。

这足以可见:计算机是多么年轻的一个学科。

也正是因为这个原因,在计算机科学领域中,还有大量的没有被完全解决的问题。

计算机科学领域其实还大有可为。

责任编辑:xj

原文标题:Tarjan 这个算法大神

文章出处:【微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4760

    浏览量

    97137
  • 计算机
    +关注

    关注

    19

    文章

    7764

    浏览量

    92676

原文标题:Tarjan 这个算法大神

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机的算法

    平滑滤波算法 设置一个数据缓存区,每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。 #define
    发表于 11-28 08:19

    C语言的常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ### 冒泡排序 (Bubble Sort) ```c void bubbleSort(int arr
    发表于 11-24 08:29

    8种常用的CRC算法分享

    CRC 计算单元可按所选择的算法和参数配置来生成数据流的 CRC 码。有些应用中,可利用 CRC 技术来验证数据的传输和存储的完整性。 8 种常用的 CRC 算法,包括: CRC16_IBM
    发表于 11-13 07:25

    SM4算法实现分享(一)算法原理

    SM4分组加密算法采用的是非线性迭代结构,以字为单位进行加密、解密运算,每次迭代称为一轮变换,每轮变换包括S盒变换、非线性变换、线性变换、合成变换。加解密算法与密钥扩展都是采用32轮非线性迭代结构
    发表于 10-30 08:10

    SM4算法原理及分享1

    SM4算法是一种分组密码算法。其分组长度为128bit,密钥长度也为128bit。加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭代运算均
    发表于 10-30 06:54

    国密系列算法简介及SM4算法原理介绍

    一、 国密系列算法简介 国家商用密码算法(简称国密/商密算法),是由我国国家密码管理局制定并公布的密码算法标准。其分类1所示: 图1 国家商用密码
    发表于 10-24 08:25

    加密算法的应用

    加密是一种保护信息安全的重要手段,近年来随着信息技术的发展,加密技术的应用越来越广泛。本文将介绍加密算法的发展、含义、分类及应用场景。 1. 加密算法的发展 加密算法的历史可以追溯到古代。在
    发表于 10-24 08:03

    基于FPGA的CLAHE图像增强算法设计

    CLAHE图像增强算法又称为对比度有限的自适应直方图均衡算法,其算法原理是通过有限的调整图像局部对比度来增强有效信号和抑制噪声信号。
    的头像 发表于 10-15 10:14 392次阅读
    基于FPGA的CLAHE图像增强<b class='flag-5'>算法</b>设计

    DFT算法与FFT算法的优劣分析

    一概述 在谐波分析仪中,我们常常提到的两个词语,就是DFT算法与FFT算法,那么一款功率分析仪/谐波分析仪采用DFT算法或者FFT算法,用户往往关注的是能否达到所要分析谐波次数的目的,
    的头像 发表于 08-04 09:30 889次阅读

    FPGA 大神 Adam Taylor 使用 ALINX VD100(AMD Versal系列)开发平台实现图像处理

    本篇文章来自 FPGA 大神、Ardiuvo XVtc VtcInst;VideoMode video;XVtc_Config *vtc_config ;int main
    的头像 发表于 05-16 09:46 2186次阅读
    FPGA <b class='flag-5'>大神</b> Adam Taylor 使用 ALINX VD100(AMD Versal系列)开发平台实现图像处理

    AI算法托管平台是什么

    AI算法托管平台是一种提供AI模型运行、管理和优化等服务的云端或边缘计算平台。下面,AI部落小编带您详细了解AI算法托管平台。
    的头像 发表于 03-06 10:22 839次阅读

    PID控制算法的C语言实现:PID算法原理

    在工业应用中 PID 及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握 PID 算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而
    发表于 02-26 15:24

    DLPC7540EVM是否支持自定义的图像处理算法,以及如何进行算法的移植?

    是否支持自定义的图像处理算法,以及如何进行算法的移植?
    发表于 02-17 08:25

    什么是BP神经网络的反向传播算法

    BP神经网络的反向传播算法(Backpropagation Algorithm)是一种用于训练神经网络的有效方法。以下是关于BP神经网络的反向传播算法的介绍: 一、基本概念 反向传播算法是BP
    的头像 发表于 02-12 15:18 1274次阅读

    SM73201 DC-ARC-EVAL光伏电弧检测的具体算法是什么?

    SM73201 DC-ARC-EVAL光伏电弧检测的具体算法是什么?求大神指教!
    发表于 02-08 06:14