这个问题有很多变种,在printBits
时间内提出解决方案。
但是,如果我想计算图中是否有通用接收器并且我在邻接列表中表示图形,那么最坏的情况是什么?这很重要,因为所有其他算法似乎对邻接列表更好,所以如果找到通用接收器不是我需要的频繁操作,我肯定会继续使用列表而不是矩阵。
在我看来,时间复杂度将是图表的大小,即O(|V|)
。用于查找图的通用接收器的算法如下。假设邻居列表,从图的索引1开始。检查索引O(|V| + |E|)
处的邻接列表的长度,如果它是1
,则遍历列表以检查是否存在自循环。如果list没有自循环|V| - 1
,则所有其他顶点都是列表的一部分,请存储列表索引。然后,我们必须通过其他列表来检查此顶点是否是其列表的一部分。如果是,则存储的顶点不能是通用接收器。继续从下一个索引搜索。即使列表是邻居列表,我们也必须搜索具有and
列表的顶点,然后搜索所有其他列表以检查该顶点是否存在于它们各自的列表中。
从上面的解释可以得出结论,无论考虑什么形式的邻接列表,在最坏的情况下,找到通用接收器必须遍历所有顶点和边缘一次,因此复杂度是图的大小,即O(| V | + | E |)
但我最近加入大学助理教授的朋友提到它必须是length = 0
。我在春季开始教授课程之前正在复习他的笔记,但在纠正之前我想百分百肯定。
答案 0 :(得分:1)
你说得对。我们可以构建跟踪所有中间结果所需的结构,但基本的复杂性仍然很简单:我们遍历所有边缘,标记和计数引用。我们甚至可以在 O(E)时间内构建完整的转换矩阵。
根据数据结构,我们可能会发现所有边缘的第二次通过都有所改善,但2 * O(E)仍然 O(E)。
然后我们遍历每个节点一次,寻找输入/输出计数和自循环。