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 →