从Ocaml中的排序列表创建一个平衡树

时间:2018-03-10 04:02:34

标签: ocaml

我想知道如何在Ocaml中给出一个排序列表来创建一个平衡树。我已经在O(n log n)时间内实现了这一点,但很好奇如何更有效地完成它,因为我知道它可以在O(n)时间内完成。

我看过这个帖子Create Balanced Binary Search Tree from Sorted linked list,并考虑了答案,但我不太清楚确切的方法是什么。代码也是我不熟悉的语言,结构似乎与Ocaml不同,所以我觉得很难遵循。

以下是我对O(n log n)时间的实现: - )

tag.name = "blockquote" 
tag
# <blockquote class="boldest">Extremely bold</blockquote>

再次感谢您的帮助!!

P.S。这不是作业,我只是想知道如何提高我的解决方案的时间复杂度!

1 个答案:

答案 0 :(得分:0)

从链接线程转换算法非常简单:

type 'a tree = Empty | Branch of 'a * 'a tree * 'a tree

let tree_of_list list =
  let rec recur low high input =
    if low = high then Empty, input
    else
      let mid = low + (high - low) / 2 in
      let left, input = recur low mid input in
      match input with
      | [] -> Empty, []
      | x::xs ->
        let right, input = recur (mid + 1) high xs in
        Branch (x, left, right), input in
  fst (recur 0 (List.length list) list)

我做了一些小改动:突变已经被状态传递所取代,而我的间隔是半封闭的(例如,开始和一个接一个结束)。

一个有趣的变体可能是传递所需树的 size 而不是间隔:

let tree_of_list list =
  let rec recur size input =
    if size = 0 then Empty, input
    else
      let half_size = size / 2 in
      let left, input = recur half_size input in
      match input with
      | [] -> Empty, []
      | x::xs ->
        let extra = (lnot size) land 1 in
        let right, input = recur (half_size - extra) xs in
        Branch (x, left, right), input in
  fst (recur (List.length list) list)