diff --git a/vorlesung/L05_binaere_baeume/analyze_avl_tree.py b/vorlesung/L05_binaere_baeume/analyze_avl_tree.py index 68b75d7..2dd72ce 100644 --- a/vorlesung/L05_binaere_baeume/analyze_avl_tree.py +++ b/vorlesung/L05_binaere_baeume/analyze_avl_tree.py @@ -4,19 +4,23 @@ from vorlesung.L05_binaere_baeume.avl_tree import AVLTree def analyze_complexity(sizes): + import random + sizes = list(sizes) + elements = random.sample(range(max(sizes) * 10), max(sizes)) ctx = AlgoContext() + tree = AVLTree(ctx) + prev = 0 for size in sizes: - z = Array.random(size, -100, 100, ctx) - tree = AVLTree(ctx) - for i in range(size - 1): - tree.insert(z[i].value) + for i in range(prev, size - 1): + tree.insert(elements[i]) ctx.reset() - tree.insert(z[size - 1].value) + tree.insert(elements[size - 1]) ctx.save_stats(size) + prev = size ctx.plot_stats(["comparisons"]) if __name__ == "__main__": - sizes = range(1, 1001, 2) + sizes = range(10, 501, 10) analyze_complexity(sizes) diff --git a/vorlesung/L05_binaere_baeume/analyze_binary_tree.py b/vorlesung/L05_binaere_baeume/analyze_binary_tree.py index 3089c8a..f66bb53 100644 --- a/vorlesung/L05_binaere_baeume/analyze_binary_tree.py +++ b/vorlesung/L05_binaere_baeume/analyze_binary_tree.py @@ -4,19 +4,25 @@ from vorlesung.L05_binaere_baeume.bin_tree import BinaryTree def analyze_complexity(sizes): + import random + sizes = list(sizes) + # Alle Elemente vorab erzeugen – Baum wird inkrementell aufgebaut statt + # für jede Größe neu, dadurch O(n log n) statt O(n²) Gesamtaufwand. + elements = random.sample(range(max(sizes) * 10), max(sizes)) ctx = AlgoContext() + tree = BinaryTree(ctx) + prev = 0 for size in sizes: - z = Array.random(size, -100, 100, ctx) - tree = BinaryTree(ctx) - for i in range(size - 1): - tree.insert(z[i].value) + for i in range(prev, size - 1): # Warm-up: ohne Messung einfügen + tree.insert(elements[i]) ctx.reset() - tree.insert(z[size - 1].value) + tree.insert(elements[size - 1]) # gemessener Insert ctx.save_stats(size) + prev = size ctx.plot_stats(["comparisons"]) if __name__ == "__main__": - sizes = range(1, 1001, 2) + sizes = range(10, 501, 10) analyze_complexity(sizes) diff --git a/vorlesung/L05_binaere_baeume/bin_tree.py b/vorlesung/L05_binaere_baeume/bin_tree.py index fad9520..11f4a01 100644 --- a/vorlesung/L05_binaere_baeume/bin_tree.py +++ b/vorlesung/L05_binaere_baeume/bin_tree.py @@ -42,7 +42,7 @@ class BinaryTree: def search(self, value): current = self.root value = self.new_node(value) - while current: + while current is not None: if value < current: current = current.left elif value > current: diff --git a/vorlesung/L05_binaere_baeume/bin_tree_node.py b/vorlesung/L05_binaere_baeume/bin_tree_node.py index 8768dff..945900b 100644 --- a/vorlesung/L05_binaere_baeume/bin_tree_node.py +++ b/vorlesung/L05_binaere_baeume/bin_tree_node.py @@ -16,8 +16,8 @@ class BinaryTreeNode(Int): self.right = None def height(self): - left_height = self.left.height() if self.left else 0 - right_height = self.right.height() if self.right else 0 + left_height = self.left.height() if self.left is not None else 0 + right_height = self.right.height() if self.right is not None else 0 return 1 + max(left_height, right_height) def __repr__(self):