2016-06-12 14 views
3

Я делаю базовую программу в 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)

Я прав? Если да, то должен ли я сохранить эту линейность?

+0

Я не понимаю, что такое '' a'. Просто содержимое? Или добавить некоторые данные на графике? – Lhooq

+0

Да, я на самом деле решаю 2-CNF-QBF в линейном времени, мои вершины - литеральные, и есть край от не a до b, а от b до a, если у меня есть пункт (a или b) - где a и b также являются литерами - –

+0

Ок. Во всяком случае, я сохранил его ;-) – Lhooq

ответ

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 |) для создания и заполнения массива

Это выглядит как линейный способ делать. Проблема возникнет, когда вам нужно будет найти, связаны ли две вершины. ;-)

+0

Настройка содержимого массива на «x» постоянна? Он не принимает O (x)? –

+0

@Anatole Dahan: Стандартные структуры данных (т. Е. Списки, массивы и т. Д.) Оптимизированы, поэтому доступ к элементу равен O (1), и поэтому он устанавливает этот элемент. – RichouHunter

+0

@ RichouHunter Создание и доступ к произвольному элементу - это O (1) в массивах, но в списках доступ к i-му элементу будет выполняться в O (i). ;-) – Lhooq