Packages
interval_tree
0.1.0
Implements an interval tree using an augmented self-balancing AVL tree with an interval as the data field and a max value tracking the interval high value in the subtree rooted at that node
Current section
Files
Jump to
Current section
Files
lib/interval/driver.ex
defmodule Driver do
alias Interval.Tree
@doc "Main driver run function"
def run do
clr_run()
end
@doc "Driver run function using user specified interval params. Run against clr tree"
def run({start, finish} = key)
when is_integer(start) and is_integer(finish) and start <= finish do
clr_run(key)
end
@doc "Run function which creates interval tree found in clrs algorithms book"
def clr_run(key \\ {19, 20}) when is_tuple(key) do
## Create interval tree closely resembling clrs algorithms interval tree page figure
intervals = [
{16, 21},
{8, 9},
{15, 23},
{25, 30},
{17, 19},
{5, 8},
{6, 10},
{0, 3},
{26, 27},
{19, 20}
]
tree = create_tree(intervals)
print_tree(tree)
search_tree(tree, Interval.new(key))
end
@doc "Run function which creates interval tree found in geeksforgeeks book"
def geeks_run(key \\ {16, 25}) when is_tuple(key) do
## Create interval tree shown in geeksforgeeks interval tree page figure
intervals = [{15, 20}, {10, 30}, {17, 19}, {5, 20}, {12, 15}, {30, 40}]
tree = create_tree(intervals)
print_tree(tree)
search_tree(tree, Interval.new(key))
end
##############################################################################
# Public Helpers
# Helper to create an interval tree given a tuple list of intervals
def create_tree(intervals)
when is_list(intervals) and is_tuple(hd(intervals)) do
Enum.reduce(intervals, Tree.new(), fn {start, finish}, tree_acc ->
Tree.insert(tree_acc, Interval.new({start, finish}))
end)
end
# Helper to print an interval tree both as a dump and via the inorder traversal
def print_tree(%Tree{} = tree) do
IO.puts("Interval tree dump and inorder traversal:\n")
IO.puts("#{inspect(tree)}\n")
list = Tree.traverse(tree)
Enum.map(list, fn i -> IO.puts("#{i}") end)
IO.puts("")
:ok
end
# Helper to search the tree for all overlapping intervals given an interval key
def search_tree(%Tree{} = tree, %Interval{} = key) do
IO.puts("Searching for interval #{inspect(key)}")
results = Tree.search(tree, key)
IO.puts("Overlap search returns #{inspect(results)}")
:ok
end
end