我一直在学习大学图表(作为Discreet Math和Data structure class的一部分)。两种图形表示方式的优点和缺点如下:
O(1)
时间检查两个节点是否连接,O(n)
时间检索连接到某个节点的随机节点。O(1)
以检索连接到某个节点(如果有)的随机节点,O(n)
以检查节点i
和j
是否已连接。 这是我被告知图表表示的方式。如果它 请不要纠正我。现在,如果真的如此,我想给我的 意见。
Matrix仅包含0和1.因此,让我们将行编码为二进制字符串和十进制。现在,我们将使用array[i]
表示节点i
的数组整数。检索连接到节点i
的随机节点非常简单,并且具有O(1)
。现在,检查节点i
是否连接到节点j
是值得怀疑的。现在,我们需要array[i]
(在基数10中为int
)转换为二进制并检查i
中是否有1位于二进制字符串中。这是由O(log n)
完成的。
我的问题是:是否有更有效的方法来获得这个结果?你对我的想法有什么看法?
答案 0 :(得分:3)
您在开头引用的矩阵与列表方法的运行时复杂性是正确的。但是:
我认为你的符号array[i]
是一种奇特的方式,可以说“矩阵的i
行,除了它是一个位域”,它不会改变任何算法的运行时复杂性。为什么检索连接到与array[i]
“微不足道”相对应的节点的随机节点?它仍然是O(n)
。另请注意,如果图表的数量超过32,64,无论顶点数是多少,都需要一个由大于int
s的数组组成的数组。
检查1
的{{1}}位置i
是否为int
。你是对的,如果你有O(1)
的任意精度数据成员(正如你可能需要的那样),找到array[i]
的随机邻居的复杂性会上升,但它会上升到{{ 1}},而不是array
。
编辑:我弄错了;使用O(n)
表示(尽管注意它没有真正精确定义),检查两个节点是否是邻居是O(log n)
。您不需要“转换为二进制”,因为计算机本身以二进制形式存储数据:您只是使用位域进行描述,并且检查位域的array
位是O(1)
。