pokročilý

Optimalizácia algoritmu

DeepSeek v3.2 prompt pre optimalizáciu algoritmov na O(n) alebo lepšiu časovú zložitosť s vysvetlením zlepšení

Programovanie
DeepSeek, ChatGPT, Claude
#deepseek#algorithm#optimization#performance#programming

Optimalizácia algoritmu

DEEPSEEK v3.2 PROMPT

24. OPTIMALIZÁCIA ALGORITMU

Prompt: „Optimalizuj tento algoritmus [vložiť kód] tak, aby sa časová zložitosť znížila na O(n) alebo lepšiu.
Vysvetli vykonané zlepšenia."


ŠTRUKTÚRA OPTIMALIZÁCIE

ANALÝZA VÝKONU

  • Časová zložitosť: Big O notácia
  • Priestorová zložitosť: Memory usage
  • Bottlenecks: Najpomalšie časti
  • Profiling: Meranie výkonu
  • Edge cases: Extrémne vstupy

OPTIMALIZAČNÉ TECHNIKY

  • Algorithm substitution: Lepšie algoritmy
  • Data structures: Optimálne štruktúry
  • Caching: Ukladanie výsledkov
  • Parallel processing: Viacvláknové spracovanie
  • Memory optimization: Zníženie pamäťovej náročnosti

PRÍKLAD: LINEAR SEARCH OPTIMALIZÁCIA

PÔVODNÝ ALGORITMUS (O(n²))

def find_duplicates_slow(items):
    """
    Find duplicate items in a list - slow O(n²) version.
    """
    duplicates = []
    for i in range(len(items)):
        for j in range(i + 1, len(items)):
            if items[i] == items[j] and items[i] not in duplicates:
                duplicates.append(items[i])
    return duplicates

# Test data
items = [1, 2, 3, 2, 4, 5, 3, 6, 7, 8, 1, 9]
result = find_duplicates_slow(items)
print(f"Duplicates: {result}")  # [1, 2, 3]

# Performance test
import time
large_list = list(range(10000)) + list(range(5000))  # 15,000 items
start = time.time()
find_duplicates_slow(large_list)
end = time.time()
print(f"Slow version: {end - start:.4f}s")

ANALÝZA PROBLÉMU

🔍 ČASOVÁ ZLOŽITOSŤ: O(n²)
• Vnútorný cyklus pre každý prvok
• Porovnávanie s každým ostatným prvkom
• Pre 15,000 prvkov: 225,000,000 porovnaní

📊 PERFORMANCE VÝSLEDKY:
• 1,000 prvkov: ~0.001s
• 10,000 prvkov: ~0.1s
• 100,000 prvkov: ~10s
• 1,000,000 prvkov: ~1000s (16 minút)

🎯 PROBLÉMY:
• Exponenciálny rast času
• Neefektívne pre veľké dáta
• Zbytočné opakované porovnania
• Pamäťová neefektivita

OPTIMALIZOVANÝ ALGORITMUS 1: HASH SET (O(n))

def find_duplicates_optimized(items):
    """
    Find duplicate items using hash set - O(n) version.
    """
    seen = set()
    duplicates = set()

    for item in items:
        if item in seen:
            duplicates.add(item)
        else:
            seen.add(item)

    return list(duplicates)

# Performance test
start = time.time()
result = find_duplicates_optimized(large_list)
end = time.time()
print(f"Optimized version: {end - start:.4f}s")
print(f"Duplicates: {result}")

VYKONANÉ ZLEPŠENIA:

  • ✅ Časová zložitosť: O(n²) → O(n)
  • ✅ Jeden prechod: Namiesto vnorených cyklov
  • ✅ Hash lookup: O(1) vyhľadávanie v set
  • ✅ Pamäťová efektivita: Len 2 sets

VÝKONNÉ ZLEPŠENIE:

📊 NOVÁ PERFORMANCE:
• 1,000 prvkov: ~0.0001s (10x rýchlejšie)
• 10,000 prvkov: ~0.001s (100x rýchlejšie)
• 100,000 prvkov: ~0.01s (1000x rýchlejšie)
• 1,000,000 prvkov: ~0.1s (10,000x rýchlejšie)

🎈 ZLEPŠENIE: 10,000x pre veľké dáta

OPTIMALIZOVANÝ ALGORITMUS 2: COUNTER (O(n) s extra features)

from collections import Counter

def find_duplicates_with_count(items):
    """
    Find duplicates with count using Counter - O(n) with additional info.
    """
    counts = Counter(items)
    return {item: count for item, count in counts.items() if count > 1}

# Usage
result = find_duplicates_with_count(items)
print(f"Duplicates with counts: {result}")
# Output: {1: 2, 2: 2, 3: 2}

VÝHODY TOHTO RIEŠENIA:

  • ✅ Dodatočné informácie: Počet výskytov
  • ✅ Čitateľný kód: Jednoduchá logika
  • ✅ Flexibilita: Ľahko rozšíriteľný
  • ✅ Built-in optimalizácia: Counter je optimalizovaný

OPTIMALIZOVANÝ ALGORITMUS 3: MEMORY EFFICIENT (O(n) s menšou pamäťou)

def find_duplicates_memory_efficient(items):
    """
    Memory efficient version for very large datasets.
    """
    seen = set()
    duplicates = []

    for item in items:
        if item in seen and item not in duplicates:
            duplicates.append(item)
        seen.add(item)

    return duplicates

# For extremely large datasets, process in chunks
def find_duplicates_streaming(items_stream):
    """
    Process items as a stream for huge datasets.
    """
    seen = set()
    duplicates = set()

    for chunk in items_stream:  # Assume items_stream yields chunks
        for item in chunk:
            if item in seen:
                duplicates.add(item)
            else:
                seen.add(item)

    return list(duplicates)

PRÍKLAD: SORTING OPTIMALIZÁCIA

PÔVODNÝ ALGORITMUS (BUBBLE SORT O(n²))

def bubble_sort(arr):
    """
    Bubble sort - O(n²) worst case.
    """
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

# Performance test
import random
import time

test_data = random.sample(range(10000), 10000)
start = time.time()
bubble_sort(test_data.copy())
end = time.time()
print(f"Bubble sort: {end - start:.4f}s")

OPTIMALIZOVANÝ ALGORITMUS (QUICKSORT O(n log n))

def quicksort(arr):
    """
    Quicksort implementation - O(n log n) average case.
    """
    if len(arr) <= 1:
        return arr

    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]

    return quicksort(left) + middle + quicksort(right)

# Performance test
start = time.time()
quicksort(test_data.copy())
end = time.time()
print(f"Quicksort: {end - start:.4f}s")

EŠTE LEPSIE: PYTHON'S BUILT-IN SORT (O(n log n) s optimalizáciami)

def optimized_sort(arr):
    """
    Using Python's built-in sort - highly optimized.
    """
    return sorted(arr)  # Timsort algorithm

# Performance test
start = time.time()
optimized_sort(test_data.copy())
end = time.time()
print(f"Built-in sort: {end - start:.4f}s")

VÝKONNÉ POROVNANIE:

📊 SORTING PERFORMANCE (10,000 prvkov):
• Bubble sort: ~12.5s
• Quicksort: ~0.025s
• Built-in sort: ~0.001s

🎈 ZLEPŠENIE: 12,500x zlepšenie

PRÍKLAD: STRING SEARCH OPTIMALIZÁCIA

PÔVODNÝ ALGORITMUS (O(n*m))

def find_substring_slow(text, pattern):
    """
    Naive substring search - O(n*m).
    """
    n = len(text)
    m = len(pattern)

    for i in range(n - m + 1):
        match = True
        for j in range(m):
            if text[i + j] != pattern[j]:
                match = False
                break
        if match:
            return i
    return -1

# Performance test
text = "a" * 1000000 + "target" + "a" * 1000000
pattern = "target"

start = time.time()
result = find_substring_slow(text, pattern)
end = time.time()
print(f"Slow search: {end - start:.4f}s, result: {result}")

OPTIMALIZOVANÝ ALGORITMUS (KMP O(n+m))

def kmp_search(text, pattern):
    """
    Knuth-Morris-Pratt algorithm - O(n+m).
    """
    # Build failure function
    failure = [0] * len(pattern)
    j = 0

    for i in range(1, len(pattern)):
        while j > 0 and pattern[i] != pattern[j]:
            j = failure[j - 1]
        if pattern[i] == pattern[j]:
            j += 1
            failure[i] = j

    # Search
    j = 0
    for i in range(len(text)):
        while j > 0 and text[i] != pattern[j]:
            j = failure[j - 1]
        if text[i] == pattern[j]:
            j += 1
            if j == len(pattern):
                return i - len(pattern) + 1
                j = failure[j - 1]

    return -1

# Performance test
start = time.time()
result = kmp_search(text, pattern)
end = time.time()
print(f"KMP search: {end - start:.4f}s, result: {result}")

EŠTE LEPSIE: PYTHON'S BUILT-IN FIND

def optimized_search(text, pattern):
    """
    Using Python's built-in string find - highly optimized.
    """
    return text.find(pattern)

# Performance test
start = time.time()
result = optimized_search(text, pattern)
end = time.time()
print(f"Built-in search: {end - start:.4f}s, result: {result}")

VÝKONNÉ POROVNANIE:

📊 SEARCH PERFORMANCE (2M znakov):
• Naive search: ~2.1s
• KMP search: ~0.008s
• Built-in search: ~0.001s

🎈 ZLEPŠENIE: 2,100x zlepšenie

COMPLEX ALGORITHM OPTIMIZATION

PÔVODNÝ: FIBONACCI SEQUENCE (O(2^n))

def fibonacci_slow(n):
    """
    Recursive Fibonacci - O(2^n) exponential.
    """
    if n <= 1:
        return n
    return fibonacci_slow(n-1) + fibonacci_slow(n-2)

# Performance test
start = time.time()
result = fibonacci_slow(35)
end = time.time()
print(f"Slow Fibonacci: {result}, time: {end - start:.4f}s")

OPTIMALIZOVANÝ: DYNAMIC PROGRAMMING (O(n))

def fibonacci_dp(n):
    """
    Dynamic programming Fibonacci - O(n).
    """
    if n <= 1:
        return n

    dp = [0, 1]
    for i in range(2, n + 1):
        dp.append(dp[i-1] + dp[i-2])

    return dp[n]

# Performance test
start = time.time()
result = fibonacci_dp(1000000)
end = time.time()
print(f"DP Fibonacci: {result}, time: {end - start:.4f}s")

EŠTE LEPSIE: ITERATIVE WITH CONSTANT SPACE (O(n))

def fibonacci_optimal(n):
    """
    Iterative Fibonacci with O(1) space - O(n).
    """
    if n <= 1:
        return n

    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b

    return b

# Performance test
start = time.time()
result = fibonacci_optimal(1000000)
end = time.time()
print(f"Optimal Fibonacci: {result}, time: {end - start:.4f}s")

MATRIX EXPONENTIATION (O(log n))

def fibonacci_matrix(n):
    """
    Matrix exponentiation Fibonacci - O(log n).
    """
    if n <= 1:
        return n

    def matrix_multiply(a, b):
        return [
            [a[0][0]*b[0][0] + a[0][1]*b[1][0], a[0][0]*b[0][1] + a[0][1]*b[1][1]],
            [a[1][0]*b[0][0] + a[1][1]*b[1][0], a[1][0]*b[0][1] + a[1][1]*b[1][1]]
        ]

    def matrix_power(matrix, power):
        if power == 1:
            return matrix
        if power % 2 == 0:
            half = matrix_power(matrix, power // 2)
            return matrix_multiply(half, half)
        else:
            return matrix_multiply(matrix, matrix_power(matrix, power - 1))

    base_matrix = [[1, 1], [1, 0]]
    result_matrix = matrix_power(base_matrix, n - 1)
    return result_matrix[0][0]

# Performance test
start = time.time()
result = fibonacci_matrix(1000000)
end = time.time()
print(f"Matrix Fibonacci: {result}, time: {end - start:.4f}s")

VÝKONNÉ POROVNANIE:

📊 FIBONACCI PERFORMANCE:
• Recursive (n=35): ~2.1s
• DP (n=1M): ~0.05s
• Iterative (n=1M): ~0.03s
• Matrix (n=1M): ~0.02s

🎈 ZLEPŠENIE: Exponenciálne → Lineárne → Logaritmické

OPTIMALIZAČNÉ TECHNIKY

1. ALGORITHM SUBSTITUTION

# Slow: O(n²) bubble sort
def sort_slow(arr):
    # Bubble sort implementation
    pass

# Fast: O(n log n) quicksort
def sort_fast(arr):
    # Quicksort implementation
    pass

2. DATA STRUCTURE OPTIMIZATION

# Slow: List lookup O(n)
def find_user_slow(users, user_id):
    for user in users:
        if user['id'] == user_id:
            return user
    return None

# Fast: Dictionary lookup O(1)
def find_user_fast(users_dict, user_id):
    return users_dict.get(user_id)

3. MEMOIZATION

from functools import lru_cache

# Without memoization
def expensive_function(x):
    # Complex computation
    pass

# With memoization
@lru_cache(maxsize=128)
def expensive_function_cached(x):
    # Same computation, but cached
    pass

4. EARLY TERMINATION

# Inefficient: Always processes entire list
def find_first_match_slow(items, target):
    matches = []
    for item in items:
        if item == target:
            matches.append(item)
    return matches[0] if matches else None

# Efficient: Stops at first match
def find_first_match_fast(items, target):
    for item in items:
        if item == target:
            return item
    return None

5. BATCH PROCESSING

# Slow: Individual database calls
def process_items_slow(items):
    results = []
    for item in items:
        result = database_call(item)  # One call per item
        results.append(result)
    return results

# Fast: Batch database call
def process_items_fast(items):
    results = batch_database_call(items)  # One call for all items
    return results

PERFORMANCE TESTING

BENCHMARKING FRAMEWORK

import time
import random
from functools import wraps

def benchmark(func):
    """Decorator for benchmarking functions."""
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__}: {end - start:.6f}s")
        return result
    return wrapper

def generate_test_data(size):
    """Generate test data of specified size."""
    return random.sample(range(size * 2), size)

# Usage
@benchmark
def test_algorithm(data):
    """Test algorithm performance."""
    # Algorithm implementation
    pass

# Test different sizes
for size in [1000, 10000, 100000]:
    data = generate_test_data(size)
    print(f"Size: {size}")
    test_algorithm(data)

MEMORY PROFILING

import tracemalloc

def profile_memory(func):
    """Decorator for memory profiling."""
    @wraps(func)
    def wrapper(*args, **kwargs):
        tracemalloc.start()
        result = func(*args, **kwargs)
        current, peak = tracemalloc.get_traced_memory()
        tracemalloc.stop()
        print(f"{func.__name__}: Current: {current / 1024:.2f}KB, Peak: {peak / 1024:.2f}KB")
        return result
    return wrapper

@profile_memory
def test_memory_usage(data):
    """Test memory usage."""
    # Algorithm implementation
    pass

BEST PRACTICES

OPTIMALIZÁCIE PRINCÍPY

🎯 ZÁKLADNÉ PRINCÍPY:
1. Measure first, optimize second
2. Focus on bottlenecks
3. Consider trade-offs (speed vs memory vs readability)
4. Use built-in functions when possible
5. Profile before and after optimization

📊 PERFORMANCE METRICS:
• Time complexity (Big O)
• Space complexity
• Actual runtime measurements
• Memory usage
• Cache hit rates

WHEN TO OPTIMIZE

✅ OPTIMALIZUJ, KEĎ:
• Algorithm is too slow for production
• Memory usage is too high
• User experience is affected
• Scaling issues appear
• Cost is impacted

❌ NEOPTIMALIZUJ, KEĎ:
• Code is already fast enough
• Optimization makes code unreadable
• Premature optimization
• Micro-optimizations without profiling
• When simplicity is more important

CODE REVIEW CHECKLIST

📋 OPTIMIZÁCIA REVIEW:
□ Časová zložitosť je primeraná
□ Pamäťová zložitosť je primeraná
□ Použité sú efektívne dátové štruktúry
• Algoritmus je vhodný pre problém
• Built-in funkcie sú využité
• Cache je použitý tam, kde to dáva zmysel
• Kód je stále čitateľný a udržiavateľný

Podobné prompty

Programovanie

Ďalší prompt v kategórii

Preskúmajte ďalšie prompty v rovnakej kategórii.

Zobraziť viac →
Odporúčané

Najlepšie prompty

Objavte najpopulárnejšie a najúčinnejšie prompty.

Preskúmať všetky →