exponenciális algoritmus
Kiejtés
- IPA: [ ˈɛksponɛnt͡sijaːliʃɒlɡoritmuʃ]
Főnév
Az exponenciális algoritmusok olyan algoritmusok, amelyek idő- vagy tárigénye ( O(2^n) ), ( O(3^n) ), vagy általánosan ( O(k^n) ) nagyságrendű, ahol ( n ) a bemeneti méret, és ( k > 1 ). Ezek az algoritmusok általában csak kisebb méretű bemenetekre alkalmazhatók, mivel a futási idő exponenciálisan nő a bemenet méretével.
Példa 1: Hatványhalmaz generálása (( O(2^n) ))
A hatványhalmaz egy halmaz összes részhalmazának halmaza. Egy ( n ) elemű halmaz ( 2^n ) részhalmazzal rendelkezik.
Python-implementáció:
def generate_power_set(s):
"""
Hatványhalmaz generálása rekurzívan.
:param s: Eredeti halmaz (lista formában)
:return: Részhalmazok listája
"""
if len(s) == 0:
return [[]]
subsets = generate_power_set(s[:-1]) # Részhalmazok a n-1 elemre
return subsets + [subset + [s[-1]] for subset in subsets]
# Példa használat
original_set = [1, 2, 3]
power_set = generate_power_set(original_set)
print("Hatványhalmaz:", power_set)
Kimenet:
Hatványhalmaz: [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
Példa 2: Közönséges hátterezés (Backtracking) - Királynők problémája (( O(n!) ))
A királynők problémája egy klasszikus példa, amelyben ( n ) sakktábla méret esetén ( n ) királynőt kell úgy elhelyezni, hogy azok ne üthessék egymást.
Python-implementáció:
def solve_n_queens(n):
"""
Királynők problémájának megoldása hátterezéssel.
:param n: Tábla mérete (n x n)
:return: Az összes lehetséges megoldás listája
"""
def is_safe(board, row, col):
for i in range(row):
if board[i] == col or abs(board[i] - col) == abs(i - row):
return False
return True
def backtrack(board, row, solutions):
if row == n:
solutions.append(board[:])
return
for col in range(n):
if is_safe(board, row, col):
board[row] = col
backtrack(board, row + 1, solutions)
solutions = []
backtrack([-1] * n, 0, solutions)
return solutions
# Példa használat
n = 4
solutions = solve_n_queens(n)
print(f"{n} királynők megoldásai ({len(solutions)} megoldás):", solutions)
Kimenet:
4 királynők megoldásai (2 megoldás): [[1, 3, 0, 2], [2, 0, 3, 1]]
Példa 3: Utazó ügynök problémája (TSP) - Brute Force (( O(n!) ))
Az utazó ügynök problémában az összes város lehetséges sorrendjét végignézzük, hogy megtaláljuk a legrövidebb utat.
Python-implementáció:
from itertools import permutations
def tsp_brute_force(distance_matrix):
"""
Brute force megoldás az utazó ügynök problémára.
:param distance_matrix: Távolságokat tartalmazó mátrix
:return: A legrövidebb út és annak hossza
"""
n = len(distance_matrix)
cities = range(n)
shortest_path = None
min_distance = float('inf')
for perm in permutations(cities):
current_distance = sum(distance_matrix[perm[i]][perm[i+1]] for i in range(n-1))
current_distance += distance_matrix[perm[-1]][perm[0]] # Visszatérés az első városba
if current_distance < min_distance:
min_distance = current_distance
shortest_path = perm
return shortest_path, min_distance
# Példa használat
distance_matrix = [
[0, 10, 15, 20],
[10, 0, 35, 25],
[15, 35, 0, 30],
[20, 25, 30, 0]
]
path, distance = tsp_brute_force(distance_matrix)
print(f"Legrövidebb út: {path}, Hossz: {distance}")
Kimenet:
Legrövidebb út: (0, 1, 3, 2), Hossz: 80
Összefoglalás
Az exponenciális algoritmusok erősek, de nem skálázódnak jól nagy bemenetekkel. Ezek az algoritmusok kis bemeneti méretű problémákra használhatók, vagy heurisztikákkal kell őket kombinálni, hogy csökkentsük a keresési tér nagyságát.
Fordítások
- exponenciális algoritmus - Értelmező szótár (MEK)
- exponenciális algoritmus - Etimológiai szótár (UMIL)
- exponenciális algoritmus - Szótár.net (hu-hu)
- exponenciális algoritmus - DeepL (hu-de)
- exponenciális algoritmus - Яндекс (hu-ru)
- exponenciális algoritmus - Google (hu-en)
- exponenciális algoritmus - Helyesírási szótár (MTA)
- exponenciális algoritmus - Wikidata
- exponenciális algoritmus - Wikipédia (magyar)