OCaml:将元素添加到Array内的列表中

时间:2016-06-12 22:05:19

标签: ocaml complexity-theory mutability

我在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)

我是对的吗? 如果是的话,我还能保持这种线性吗?

1 个答案:

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

  • O(| V |)来创建数组
  • O(| E |)添加边
  • O(| V | + | E |)来创建和填充数组

它看起来像一种线性的做法。当您必须找到两个顶点是否连接时,问题就会出现。 ; - )