OCaml: Древовидные функции

Heres сценарий, чтобы сделать это И подсказки для интеграции сценария из Проводника

http://www.ibm.com/developerworks/rational/library/4687.html

5
задан Pascal Cuoq 24 October 2013 в 13:52
поделиться

3 ответа

Прочтите реализацию модуля Set в исходных кодах стандартной библиотеки OCaml. Они реализованы с помощью двоичных деревьев, только немного более сложных, чем ваше.

(Я бы рекомендовал вам начать с двоичных деревьев, а не иметь список дочерних элементов, как вы, кажется, определили)

3
ответ дан 14 December 2019 в 13:41
поделиться

На самом деле это зависит от того, как вы хотите, чтобы ваше дерево работало, например, есть ли порядок между элементами и тому подобное.

В противном случае вы можете использовать известные алгоритмы для деревьев, если у вас есть идея, как это сделать на других языках C или Java, например, я могу помочь перевести его на OCAML.

0
ответ дан 14 December 2019 в 13:41
поделиться

Раньше я использовал окамлграф . Это нетривиальная библиотека для использования, но если вам нужно вставить узлы и изменить путь, это может помочь, я никогда не использовал это в контексте b-дерева ...

И извлечено из документации по языку :

Наиболее частое использование вариантных типов описывает рекурсивные данные конструкции. Рассмотрим, например, тип двоичных деревьев:

#type 'a btree = Empty | Node of 'a * 'a btree * 'a btree;;
type 'a btree = Empty | Node of 'a * 'a btree * 'a btree

Это определение читается следующим образом: a двоичное дерево, содержащее значения типа 'a (произвольный тип) либо пустой, или узел, содержащий один значение типа 'a и два поддерева содержащие также значения типа 'a, то есть два 'btree.

Операции с бинарными деревьями естественно выражается как рекурсивный функции, следующие той же структуре как само определение типа. За например, вот функции выполнение поиска и вставки в упорядоченные бинарные деревья (элементы увеличивайте слева направо):

#let rec member x btree =
   match btree with
     Empty -> false
   | Node(y, left, right) ->
       if x = y then true else
       if x < y then member x left else member x right;;
val member : 'a -> 'a btree -> bool = <fun>

#let rec insert x btree =
   match btree with
     Empty -> Node(x, Empty, Empty)
   | Node(y, left, right) ->
       if x <= y then Node(y, insert x left, right)
                 else Node(y, left, insert x right);;
val insert : 'a -> 'a btree -> 'a btree = <fun>

Надеюсь, это поможет

3
ответ дан 14 December 2019 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: