Data structures 质疑图表的教学方法
我来自阿根廷,但我想每个上过数据结构课程的人都知道什么是图。如果您这样做,您可能知道什么样的实现是“通用”或“标准”的。它可以通过列表或数组来实现。甚至维基百科也这么说。还有马克·艾伦·韦斯、布鲁诺·普里斯和路易斯·乔亚内斯·阿吉拉尔 事情是这样的。从来没有人认为这不是一个好办法?最推荐的方法是通过列表。但是考虑到顶点之间只能有一条边,我不认为列表是这样做的好界面。我的意思是,如果顶点V1与顶点V2相连,那么只有一条边 你不认为这是一个集合而不是一个列表吗Data structures 质疑图表的教学方法,data-structures,graph,directed-graph,Data Structures,Graph,Directed Graph,我来自阿根廷,但我想每个上过数据结构课程的人都知道什么是图。如果您这样做,您可能知道什么样的实现是“通用”或“标准”的。它可以通过列表或数组来实现。甚至维基百科也这么说。还有马克·艾伦·韦斯、布鲁诺·普里斯和路易斯·乔亚内斯·阿吉拉尔 事情是这样的。从来没有人认为这不是一个好办法?最推荐的方法是通过列表。但是考虑到顶点之间只能有一条边,我不认为列表是这样做的好界面。我的意思是,如果顶点V1与顶点V2相连,那么只有一条边 你不认为这是一个集合而不是一个列表吗 Class Vertex{ p
Class Vertex{
private Set edges;
private Object data;
/** Methods**/
}
我只是想知道一些意见,你觉得呢
谢谢
编辑:
此外,如果我们认为图不能有重复的元素,那么哈希集将是一个很好的选择,可以最大限度地减少插入中顶点的查找。您正确地指出,顶点的邻接由一个集合(或者在多图的情况下,多集)最精确地建模。那么,为什么数据结构书籍会写数组和链表呢?我可以想到三个原因:
在最抽象的情况下,集合有一个谓词来测试元素是否在集合中。它还可以支持提供并集和交集的操作符。差异不一定是可计算的 在最抽象的情况下,列表支持迭代、子列表和追加 大多数图上的算法都需要在边上迭代,因此支持迭代的结构是首选。大多数算法不会尝试两次添加同一条边,因此不需要删除重复的边 当然,库中的大多数集合都是有限的、扩展的集合,它们也支持迭代,因此您可以使用它们,尽管您仍然需要检查重复的集合 一些基于图形的系统确实使用集合作为底层机制,但它们处理的是无限图形而不是有限图形,其中内涵集合非常有用。在相对较高的C/C++程序员级别上,图形/网络的实现方式在很大程度上取决于对其执行的操作。作为一个人或我自己,我在这里的回答/例子可能有偏见。可以在图/网络上实现的一些最有效的算法是多项式时间算法。我能想到的大多数多项式时间算法(Dijkstra最短路径问题、运输问题、最大流问题等)都是最小成本流(MCF)问题的特例。在计算上,解决MCF问题的最有效方法之一是通过网络单纯形算法(其本身是单纯形算法的一个特化,用于求解一般线性规划) 在网络单纯形算法中,需要有效地表示(节点集上的)生成树。为了在图中表示生成树,可以使用多种数据结构。其中包括以下节点长度
predecessor[], thread[] and depth[] arrays.
在我遇到的最有效的网络单纯形算法实现中,这些算法不是以数组表示的,而是通过
calloc(number_of_nodes, sizeof(struct vertex));
我不确定(在相对较低的级别上)编译器内部的内存分配是如何实现的-它是否是一个列表/集合/映射
因此,总而言之,实现图形的最佳方式在很大程度上取决于要对其执行的操作
网络单纯形算法和有效实现该算法所需的数据结构可在中找到。您认为如何实现
集合
?列表允许重复元素。然后顶点V1可以连接到顶点V2两次。@ruslik我知道一个集合可以用列表或数组实现。没关系。重要的是接口。你知道人们集合和列表有什么区别吗?谢谢,伙计,这是一个很好的答案。我可不这么想。集合确实是一种高级数据结构。是的,没错。这取决于您认为可能需要执行的操作。但是,在所有实现中都有一些共同的事实。例如,如果图形不能有重复的元素(例如,人