From 15afb6e2a9674febd427a9bf1448ce78fcdc16a0 Mon Sep 17 00:00:00 2001 From: vladislav Date: Sat, 6 Dec 2025 16:06:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=20O(n)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/src/lab2.gleam | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/lab2/src/lab2.gleam b/lab2/src/lab2.gleam index ae984f2..0bcd7ee 100644 --- a/lab2/src/lab2.gleam +++ b/lab2/src/lab2.gleam @@ -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 + } + } + } +}