Сделал сравнение через списки за O(n)
This commit is contained in:
@@ -495,3 +495,44 @@ pub fn structure_equal(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Лексикографическое сравнение двух деревьев по inorder обходу через списки
|
||||
// Время выполнения: O(n + m) где n, m - размеры деревьев
|
||||
// Грубо говоря O(n)
|
||||
pub fn compare(
|
||||
tree1: RBTree(k, v),
|
||||
tree2: RBTree(k, v),
|
||||
key_compare: fn(k, k) -> Order,
|
||||
value_compare: fn(v, v) -> Order,
|
||||
) -> Order {
|
||||
let list1 = to_list(tree1)
|
||||
let list2 = to_list(tree2)
|
||||
compare_lists(list1, list2, key_compare, value_compare)
|
||||
}
|
||||
|
||||
// Вспомогательная функция для лексикографического сравнения списков пар
|
||||
fn compare_lists(
|
||||
list1: List(#(k, v)),
|
||||
list2: List(#(k, v)),
|
||||
key_compare: fn(k, k) -> Order,
|
||||
value_compare: fn(v, v) -> Order,
|
||||
) -> Order {
|
||||
case list1, list2 {
|
||||
[], [] -> order.Eq
|
||||
[], _ -> order.Lt
|
||||
_, [] -> order.Gt
|
||||
[head1, ..tail1], [head2, ..tail2] -> {
|
||||
let #(k1, v1) = head1
|
||||
let #(k2, v2) = head2
|
||||
case key_compare(k1, k2) {
|
||||
order.Eq -> {
|
||||
case value_compare(v1, v2) {
|
||||
order.Eq -> compare_lists(tail1, tail2, key_compare, value_compare)
|
||||
ord -> ord
|
||||
}
|
||||
}
|
||||
ord -> ord
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user