Data structures 质疑图表的教学方法

Data structures 质疑图表的教学方法,data-structures,graph,directed-graph,Data Structures,Graph,Directed Graph,我来自阿根廷,但我想每个上过数据结构课程的人都知道什么是图。如果您这样做,您可能知道什么样的实现是“通用”或“标准”的。它可以通过列表或数组来实现。甚至维基百科也这么说。还有马克·艾伦·韦斯、布鲁诺·普里斯和路易斯·乔亚内斯·阿吉拉尔 事情是这样的。从来没有人认为这不是一个好办法?最推荐的方法是通过列表。但是考虑到顶点之间只能有一条边,我不认为列表是这样做的好界面。我的意思是,如果顶点V1与顶点V2相连,那么只有一条边 你不认为这是一个集合而不是一个列表吗 Class Vertex{ p

我来自阿根廷,但我想每个上过数据结构课程的人都知道什么是图。如果您这样做,您可能知道什么样的实现是“通用”或“标准”的。它可以通过列表或数组来实现。甚至维基百科也这么说。还有马克·艾伦·韦斯、布鲁诺·普里斯和路易斯·乔亚内斯·阿吉拉尔

事情是这样的。从来没有人认为这不是一个好办法?最推荐的方法是通过列表。但是考虑到顶点之间只能有一条边,我不认为列表是这样做的好界面。我的意思是,如果顶点V1与顶点V2相连,那么只有一条边

你不认为这是一个集合而不是一个列表吗

Class Vertex{
    private Set edges;
    private Object data;

    /** Methods**/
}
我只是想知道一些意见,你觉得呢

谢谢

编辑:
此外,如果我们认为图不能有重复的元素,那么哈希集将是一个很好的选择,可以最大限度地减少插入中顶点的查找。

您正确地指出,顶点的邻接由一个集合(或者在多图的情况下,多集)最精确地建模。那么,为什么数据结构书籍会写数组和链表呢?我可以想到三个原因:

  • 编程语言应该将集合作为原始数据类型来包含的想法是相当新的。老作家不会考虑使用它,现代作家倾向于遵循这个领域的传统

  • 数据结构课程的目的之一是让您能够在低(具体)级别和高(抽象)级别上思考数据的表示。集合是一种抽象数据类型(与链表和数组不同),它没有明显的低级实现:一些集合最好表示为链表,一些集合表示为哈希表,一些集合表示为数组,等等。因此,数据结构课程自然会跳过集合的高级表示,转而使用它们的低级实现,为了分析使用它们的算法的行为,您必须了解这些实现

  • 对于如何表示数据类型,不要武断,这一点很重要,因为使用特定的表示可以最有效地表示算法。例1。要计算图中每对顶点之间长度为n的路径,请使用图的邻接矩阵表示图,并将矩阵提高到n的幂。如果您坚持将顶点的邻接表示为一组边,那么您将错过此算法(可以使用标准技术进行并行化)。例2。Knuth针对精确封面问题的“”算法表示使用双链接列表的列集,因此可以重用已删除项目的链接以实现高效回溯


  • 在最抽象的情况下,集合有一个谓词来测试元素是否在集合中。它还可以支持提供并集和交集的操作符。差异不一定是可计算的

    在最抽象的情况下,列表支持迭代、子列表和追加

    大多数图上的算法都需要在边上迭代,因此支持迭代的结构是首选。大多数算法不会尝试两次添加同一条边,因此不需要删除重复的边

    当然,库中的大多数集合都是有限的、扩展的集合,它们也支持迭代,因此您可以使用它们,尽管您仍然需要检查重复的集合

    一些基于图形的系统确实使用集合作为底层机制,但它们处理的是无限图形而不是有限图形,其中内涵集合非常有用。

    在相对较高的C/C++程序员级别上,图形/网络的实现方式在很大程度上取决于对其执行的操作。作为一个人或我自己,我在这里的回答/例子可能有偏见。可以在图/网络上实现的一些最有效的算法是多项式时间算法。我能想到的大多数多项式时间算法(Dijkstra最短路径问题、运输问题、最大流问题等)都是最小成本流(MCF)问题的特例。在计算上,解决MCF问题的最有效方法之一是通过网络单纯形算法(其本身是单纯形算法的一个特化,用于求解一般线性规划)

    在网络单纯形算法中,需要有效地表示(节点集上的)生成树。为了在图中表示生成树,可以使用多种数据结构。其中包括以下节点长度

    predecessor[], thread[] and depth[] arrays.
    
    在我遇到的最有效的网络单纯形算法实现中,这些算法不是以数组表示的,而是通过

    calloc(number_of_nodes, sizeof(struct vertex));
    
    我不确定(在相对较低的级别上)编译器内部的内存分配是如何实现的-它是否是一个列表/集合/映射

    因此,总而言之,实现图形的最佳方式在很大程度上取决于要对其执行的操作


    网络单纯形算法和有效实现该算法所需的数据结构可在中找到。

    您认为如何实现
    集合
    ?列表允许重复元素。然后顶点V1可以连接到顶点V2两次。@ruslik我知道一个集合可以用列表或数组实现。没关系。重要的是接口。你知道人们集合和列表有什么区别吗?谢谢,伙计,这是一个很好的答案。我可不这么想。集合确实是一种高级数据结构。是的,没错。这取决于您认为可能需要执行的操作。但是,在所有实现中都有一些共同的事实。例如,如果图形不能有重复的元素(例如,人