欢迎 mon amie ,
在我的一些作业中,我觉得需要使用Graph ADT。但是,我想拥有它,我怎么说,泛型。也就是说,无论我喜欢什么,我都想存储它。
我面临的问题与复杂性有关。 我应该用什么数据结构来表示节点集?我忘了说我已经决定使用邻接列表技术。
通常,教科书会提到链接列表,但据我所知,只要链接列表有用并且我们需要执行搜索,树就更好。
但话又说回来,我们需要的是将一个节点与其相邻节点列表相关联,那么哈希表呢?
您能否帮我确定应该在哪个数据结构(链表,树,哈希表)中存储节点?
答案 0 :(得分:4)
...图表ADT。但是,我想拥有它,我怎么说,通用。也就是说,无论我喜欢什么,我都想存储它。
这基本上是ADT(抽象数据类型)的要点。
关于要使用的数据结构,您可以使用其中任何一种。
对于节点集,Hash table
将是一个不错的选择(如果你有一个很好的C实现)。您将对任何节点分摊O(1)访问权限。
LinkedList
将花费最短的O(n)时间来查找节点,Balanced Tree
将是O(logn)并且除了出于某种原因你将不会给哈希表带来任何优势将节点集排序为LOT(在这种情况下,使用树的inorder遍历进行排序并在O(n)时间内进行排序)
关于每个节点的邻接列表,它取决于您想要对图表做什么。
如果你只实现DFS和BFS,你需要迭代特定节点的所有邻居,所以LinkedList
是最简单的方法,这就足够了。
但是,如果你需要检查是否存在特定的边缘,那么最糟糕的情况是O(n)时间,因为你需要迭代整个列表(一个邻接矩阵实现会使这个操作O(1))
相邻节点LinkedList
就足够了,这取决于你要做什么。
答案 1 :(得分:0)
如果您需要知道哪些节点彼此相邻,则可以使用adjacency matrix。换句话说,对于n
个节点的图表,如果n x n
和(i,j)
,则1
矩阵的i
条目为j
在图中彼此相邻。