AlgoDatSoSe26/praktika/05_b_baum/aufgabe2_eigenschaften.py
2026-05-18 14:48:56 +02:00

51 lines
2.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys
import os
_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
_l06 = os.path.join(_root, 'vorlesung', 'L06_b_baeume')
if _l06 not in sys.path: sys.path.insert(0, _l06)
if _root not in sys.path: sys.path.insert(0, _root)
from b_tree import BTree
from utils.algo_context import AlgoContext
from utils.algo_array import Array
ctx = AlgoContext()
values = Array.from_file('data/seq3.txt', ctx)
tree3 = BTree(3, ctx)
tree5 = BTree(5, ctx)
for cell in values:
tree3.insert(cell)
tree5.insert(cell)
# ── Welche Höhe ergibt sich für Ordnung 3 bzw. 5? ───────────────────────────
print("Höhe Ordnung 3:", tree3.height())
print("Höhe Ordnung 5:", tree5.height())
# Ordnung 3: Knoten fassen 25 Schlüssel → weniger Schlüssel pro Knoten,
# mehr Ebenen nötig. seq3.txt hat 10 000 Werte → Höhe ca. 57.
# Ordnung 5: Knoten fassen 49 Schlüssel → geringere Höhe, ca. 45.
# ── Traversierung und Sortierungsprüfung ─────────────────────────────────────
results3 = []
tree3.traversal(lambda v: results3.append(int(str(v))))
print("Sortiert (Ordnung 3):", results3 == sorted(results3))
results5 = []
tree5.traversal(lambda v: results5.append(int(str(v))))
print("Sortiert (Ordnung 5):", results5 == sorted(results5))
# In-Order-Traversal eines B-Baums liefert immer eine sortierte Folge:
# Die B-Baum-Eigenschaft (linker Teilbaum < Schlüssel < rechter Teilbaum)
# gilt rekursiv für jeden Knoten.
# ── Knoten mit Wert 0 suchen ─────────────────────────────────────────────────
node3 = tree3.search(0)
node5 = tree5.search(0)
print("Knoten mit 0 (Ordnung 3):", str(node3) if node3 else "nicht gefunden")
print("Knoten mit 0 (Ordnung 5):", str(node5) if node5 else "nicht gefunden")
# search() gibt den Knoten zurück, der den gesuchten Schlüssel enthält.
# __str__ gibt alle Schlüssel des Knotens aus, z.B.: ( -2 0 3 )
# Größere Ordnung → mehr Schlüssel pro Knoten → der Knoten mit 0
# enthält bei m=5 tendenziell mehr Nachbarn als bei m=3.