我在OCaml制作基本程序,我在其中使用图表。 我将图表定义为:
type 'a graph = ('a * int list) array;;
其中数组中的元素是顶点,列表中的元素是顶点的边。我需要能够在O(| V | + | E |)中构建一个看似合法的图形。 所以我首先使用空列表构建顶点数组。现在,我想添加边缘。
我出来的唯一方法是:
let addEdge a b g = g.(a)<-(fst g.(a), b::snd g.(a));;
我对此并不十分确定,但在我看来,这与我做这个时的程度呈线性关系。这意味着如果我的一个顶点连接到每个其他顶点,它将需要我O(n ^ 2)
我是对的吗? 如果是的话,我还能保持这种线性吗?
答案 0 :(得分:3)
让我们看看你做了什么(我更喜欢以更易读的方式重写它; - )):
let addEdge a b g =
let (c, al) = g.(a) in
g.(a) <- (c, b :: al);;
对于每条边a -> b
,您可以通过将b
添加到与a
对应的列表中,将此边添加到数组中。获取数组的内容是O(1),如果我们恢复你所做的,那么在列表中添加一个元素也是O(1)
它看起来像一种线性的做法。当您必须找到两个顶点是否连接时,问题就会出现。 ; - )