数据结构 – 图 – 如果我使用哈希表替换邻接列表中的每个链接列表有什么缺点?

在CLRS消费22.1-8(我是自学,不在任何大学)

Suppose that instead of a linked list, each array entry Adj[u] is a
hash table containing the vertices v for which (u,v) ∈ E. If all
edge lookups are equally likely, what is the expected time to
determine whether an edge is in the graph? What disadvantages does
this scheme have? Suggest an alternate data structure for each edge
list that solves these problems. Does your alternative have
disadvantages compared to the hash table?

所以,如果我用哈希表替换每个链表,有以下问题:

>确定边缘是否在图中的预期时间是多少?
有什么缺点?
>为每个边缘列表建议一个替代数据结构,以解决这些问题
>与哈希表相比,您的替代品有缺点吗?

我有以下部分答案:

>我认为预期的时间是O(1),因为我只是去Hashtable t = Adj [u],然后返回t.get(v);
>我认为缺点是Hashtable将占用更多的空间,然后链表.

对于其他两个问题,我无法得到一个线索.

任何人都可以给我一个线索?

最佳答案
这取决于散列表以及它如何处理冲突,例如假设在我们的散列表中,每个条目都指向具有相同键的元素列表.

如果元素的分布足够均匀,则查找的平均成本仅取决于每个列表的平均元素数(负载因子).因此每个列表的平均元素数量是n / m,其中m是我们的哈希表的大小.

>确定边缘是否在图中的预期时间是O(n / m)
>比链表更多的空间和查询时间比邻接矩阵多.如果我们的哈希表支持动态调整大小,那么我们需要额外的时间来移动旧的和新的哈希表之间的元素,如果不是,我们将需要每个哈希表的O(n)空间,以便有O(1)个查询时间导致O(n ^ 2)空间.我们也刚刚检查了预期的查询时间,在最坏的情况下,我们可能会像链表(O(度(u)))有查询时间,所以使用邻接矩阵似乎更好,以便确定性的O(1)查询时间和O(n ^ 2)空间.
>上面阅读
>是的,例如,如果我们知道我们的图的每个顶点最多有d个相邻的顶点,d小于n,那么使用哈希表将需要O(nd)空间而不是O(n ^ 2),并且会预期O (1)查询时间.

转载注明原文:数据结构 – 图 – 如果我使用哈希表替换邻接列表中的每个链接列表有什么缺点? - 代码日志