图数据结构简介
数据结构只是我们组织数据的方式。
我敢肯定你对列表(或数组)很熟悉,它是一个线性有序的值序列。它可以用于你的购物清单、待办事项、阅读材料等等。
让我们探索非线性图的更令人兴奋的领域!
但首先,需要了解一些基础知识:
图形由通过线连接的对象组成。
在 JavaScript(以及整个计算机科学)中,我们将这些对象和线称为顶点和边。
图形结构的好处在于,您不仅可以表示数据节点,还可以通过分配给其边的属性来表示它们之间的关系。
边的两个常见属性是权重和方向。
如果图有权重,则认为是带权的;如果图有方向,则认为是有向的。方向可以是单向的,也可以是双向的。
苏珊可能迷恋莎莉,但这并不意味着莎莉也迷恋苏珊。
现在,想象一下你自己,孤身一人漂浮在太空中。你拥有很多知识,却无人分享。
另一位太空旅行者出现了:“嘿,朋友!我们保持联系吧。” 你给了他们你的号码,突然间,你拥有了意义,不再是宇宙中一粒渺小的尘埃。你变成了一个节点,创造了一条连接的边缘。
但这需要付出代价。
每次你打电话给你的太空朋友,你的电话公司都会向你收取 12393900.00 美元的费用。这是你的连接边缘的权重。
让我们从太空回来,看看 IRL 图形数据结构
相交的街道是顶点,街道本身是边。
它们根据长度和时间距离加权。街道还具有方向性……有些街道是单行道。
遍历图是指寻找两个节点之间的路径、寻找从一个节点到另一个节点的最短路径以及寻找访问所有节点的最短路径[1]。
遍历图的众多方法之一是使用Dijkstra 算法(或 Dijkstra 最短路径优先算法,SPF 算法)。Google 在其地图应用中就使用了该算法(或其变体)。该算法最初由 Dijkstra 于 1958 年在巴黎的一家咖啡馆里用 20 分钟构思出来 [2]。
在 Javascript 中它看起来是这样的:
关于树形图的注释...
你在幼儿园时必须制作的家谱?没错,就是树状图。
事实是这样的,树形图是一种高度专业化的图形式,它有一个根节点,所有其他节点都是其后代。
区分树形图和图形非常重要,因为它们具有一些重叠的特性,但它们构建数据的规则完全不同。
因此在 JavaScript 中,它们被视为完全不同的数据结构。
想深入了解树,并享受其中的乐趣,请查看DEV 社区成员 Jill 的这篇文章。
图表是数据关联的非层次结构,连接着我们的整个世界!
标题图片:社交网络分析可视化 [Grandjean, M. (2016)]
[1] https://www.jenniferbland.com/the-difference-between-a-tree-and-a-graph-data-structure/
[2] https://www.vice.com/en_us/article/4x3pp9/the-simple-elegant-algorithm-that-makes-google-maps-possible