Adding algorithms and datastructures
This commit is contained in:
138
examples/selection_demo.py
Normal file
138
examples/selection_demo.py
Normal file
@@ -0,0 +1,138 @@
|
||||
"""
|
||||
Demonstration of selection algorithms.
|
||||
|
||||
This script demonstrates the usage of deterministic and randomized selection
|
||||
algorithms for finding the k-th smallest element in an array.
|
||||
|
||||
Author: Carlos Gutierrez
|
||||
Course: MSCS532 - Data Structures and Algorithms
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
# Add parent directory to path
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from src.deterministic_algorithm import deterministic_select, find_median
|
||||
from src.randomized_algorithm import randomized_select, find_median as rand_find_median
|
||||
|
||||
|
||||
def demo_basic_selection():
|
||||
"""Demonstrate basic selection operations."""
|
||||
print("=" * 60)
|
||||
print("Basic Selection Demo")
|
||||
print("=" * 60)
|
||||
|
||||
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
|
||||
print(f"Array: {arr}")
|
||||
print()
|
||||
|
||||
# Find various order statistics
|
||||
for k in [1, 3, 5, len(arr)]:
|
||||
det_result = deterministic_select(arr, k)
|
||||
rand_result = randomized_select(arr, k, seed=42)
|
||||
print(f" {k}-th smallest element:")
|
||||
print(f" Deterministic: {det_result}")
|
||||
print(f" Randomized: {rand_result}")
|
||||
print()
|
||||
|
||||
# Find median
|
||||
print("Median:")
|
||||
print(f" Deterministic: {find_median(arr)}")
|
||||
print(f" Randomized: {rand_find_median(arr, seed=42)}")
|
||||
print()
|
||||
|
||||
|
||||
def demo_different_distributions():
|
||||
"""Demonstrate selection on different input distributions."""
|
||||
print("=" * 60)
|
||||
print("Selection on Different Distributions")
|
||||
print("=" * 60)
|
||||
|
||||
distributions = {
|
||||
"Sorted": list(range(1, 21)),
|
||||
"Reverse Sorted": list(range(20, 0, -1)),
|
||||
"Random": [3, 15, 7, 1, 19, 12, 8, 5, 14, 2, 10, 18, 6, 11, 4, 9, 16, 13, 17, 20],
|
||||
"With Duplicates": [5, 3, 5, 1, 3, 2, 5, 4, 3, 1, 2, 5, 4, 3, 2, 1, 5, 4, 3, 2]
|
||||
}
|
||||
|
||||
k = 10 # Find 10th smallest
|
||||
|
||||
for name, arr in distributions.items():
|
||||
print(f"\n{name} Array: {arr[:10]}..." if len(arr) > 10 else f"{name} Array: {arr}")
|
||||
det_result = deterministic_select(arr, k)
|
||||
rand_result = randomized_select(arr, k, seed=42)
|
||||
print(f" {k}-th smallest:")
|
||||
print(f" Deterministic: {det_result}")
|
||||
print(f" Randomized: {rand_result}")
|
||||
print()
|
||||
|
||||
|
||||
def demo_median_finding():
|
||||
"""Demonstrate median finding."""
|
||||
print("=" * 60)
|
||||
print("Median Finding Demo")
|
||||
print("=" * 60)
|
||||
|
||||
test_arrays = [
|
||||
([1, 2, 3, 4, 5], "Odd length"),
|
||||
([1, 2, 3, 4, 5, 6], "Even length"),
|
||||
([5, 2, 8, 1, 9, 3, 7, 4, 6], "Random order"),
|
||||
([1, 1, 2, 2, 3, 3, 4, 4], "With duplicates")
|
||||
]
|
||||
|
||||
for arr, description in test_arrays:
|
||||
print(f"\n{description}: {arr}")
|
||||
det_median = find_median(arr)
|
||||
rand_median = rand_find_median(arr, seed=42)
|
||||
print(f" Deterministic median: {det_median}")
|
||||
print(f" Randomized median: {rand_median}")
|
||||
print()
|
||||
|
||||
|
||||
def demo_custom_key():
|
||||
"""Demonstrate selection with custom key function."""
|
||||
print("=" * 60)
|
||||
print("Selection with Custom Key Function")
|
||||
print("=" * 60)
|
||||
|
||||
# Array of dictionaries
|
||||
students = [
|
||||
{'name': 'Alice', 'score': 85},
|
||||
{'name': 'Bob', 'score': 92},
|
||||
{'name': 'Charlie', 'score': 78},
|
||||
{'name': 'Diana', 'score': 95},
|
||||
{'name': 'Eve', 'score': 88}
|
||||
]
|
||||
|
||||
print("Students:")
|
||||
for student in students:
|
||||
print(f" {student['name']}: {student['score']}")
|
||||
print()
|
||||
|
||||
# Find student with median score
|
||||
median_student = randomized_select(
|
||||
students,
|
||||
(len(students) + 1) // 2,
|
||||
key=lambda x: x['score'],
|
||||
seed=42
|
||||
)
|
||||
print(f"Student with median score: {median_student['name']} ({median_student['score']})")
|
||||
print()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("\n" + "=" * 60)
|
||||
print("Selection Algorithms Demonstration")
|
||||
print("=" * 60 + "\n")
|
||||
|
||||
demo_basic_selection()
|
||||
demo_different_distributions()
|
||||
demo_median_finding()
|
||||
demo_custom_key()
|
||||
|
||||
print("=" * 60)
|
||||
print("Demo Complete!")
|
||||
print("=" * 60)
|
||||
|
||||
Reference in New Issue
Block a user