我想知道如何在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。这不是作业,我只是想知道如何提高我的解决方案的时间复杂度!
答案 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)