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

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

我对吗 ?
如果是,我是否仍要保持线性?

最佳答案
让我们看看您的操作(我更喜欢以更易读的方式重写它;-)):

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 |)创建并填充数组

它看起来像是线性的方式.当您必须查找是否连接了两个顶点时,就会出现问题. 😉

转载注明原文:OCaml:将元素添加到数组内的列表中 - 代码日志