表示图形的有效方式

时间:2014-01-03 22:29:45

标签: graph

我一直在学习大学图表(作为Discreet Math和Data structure class的一部分)。两种图形表示方式的优点和缺点如下:

  1. 使用矩阵表示图形:O(1)时间检查两个节点是否连接,O(n)时间检索连接到某个节点的随机节点。
  2. 使用list表示图形:O(1)以检索连接到某个节点(如果有)的随机节点,O(n)以检查节点ij是否已连接。
  3. 这是我被告知图表表示的方式。如果它 请不要纠正我。现在,如果真的如此,我想给我的 意见。

    Matrix仅包含0和1.因此,让我们将行编码为二进制字符串和十进制。现在,我们将使用array[i]表示节点i的数组整数。检索连接到节点i的随机节点非常简单,并且具有O(1)。现在,检查节点i是否连接到节点j是值得怀疑的。现在,我们需要array[i](在基数10中为int)转换为二进制并检查i中是否有1位于二进制字符串中。这是由O(log n)完成的。

    我的问题是:是否有更有效的方法来获得这个结果?你对我的想法有什么看法?

1 个答案:

答案 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)