Kiejtés

  • IPA: [ ˈkɛrɛʃøːɒlɡoritmuʃ]

Főnév

keresőalgoritmus

  1. (matematika, algoritmusok) A keresési algoritmusok célja, hogy megtalálják egy adott elem helyét (vagy igazolják, hogy az elem nem létezik) egy adatszerkezetben, például listában, gráfban vagy fában. Két fő típusuk van:
  • Lineáris keresési algoritmusok: Az elemeket sorban ellenőrzik.
  • Hierarchikus keresési algoritmusok: Az adatszerkezet szervezését kihasználva hatékonyabbak.

Fontos keresési algoritmusok

Lineáris keresés (Linear Search)

Leírás:

  • Az elemeket sorban, egyesével ellenőrzi.
  • Egyszerű és könnyen implementálható, de lassú nagy adathalmazok esetén.

Időbonyolultság:

  • Legrosszabb eset:  
  • Legjobb eset:  

Python példa:

def linear_search(arr, target):
    for i, value in enumerate(arr):
        if value == target:
            return i
    return -1

arr = [4, 2, 7, 1, 3]
target = 7
print(linear_search(arr, target))  # Output: 2

Bináris keresés (Binary Search)

Leírás:

  • Egy rendezett listában keres, a középső elemek felosztásával.
  • Ha az elem kisebb a középsőnél, a bal oldalra, különben a jobb oldalra lép.

Időbonyolultság:

  • Legrosszabb eset:  
  • Legjobb eset:  

Python példa:

def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

arr = [1, 2, 3, 4, 5, 6, 7]
target = 5
print(binary_search(arr, target))  # Output: 4

Ugrásos keresés (Jump Search)

Leírás:

  • Rendezett listákra alkalmazható.
  • Az elemeket „ugrásokkal” ellenőrzi, majd visszatér az előző blokkon belüli keresésre.

Időbonyolultság:

  • Legrosszabb eset:  

Python példa:

import math

def jump_search(arr, target):
    n = len(arr)
    step = int(math.sqrt(n))
    prev = 0

    while arr[min(step, n) - 1] < target:
        prev = step
        step += int(math.sqrt(n))
        if prev >= n:
            return -1

    for i in range(prev, min(step, n)):
        if arr[i] == target:
            return i
    return -1

arr = [1, 3, 5, 7, 9, 11, 13]
target = 9
print(jump_search(arr, target))  # Output: 4

Interpolációs keresés (Interpolation Search)

Leírás:

  • Rendezett listákra alkalmazható, ahol az elemek egyenletesen oszlanak el.
  • Az indexet interpolációval határozza meg:

 

Időbonyolultság:

  • Legrosszabb eset:  
  • Legjobb eset:  

Python példa:

def interpolation_search(arr, target):
    low, high = 0, len(arr) - 1

    while low <= high and target >= arr[low] and target <= arr[high]:
        pos = low + ((target - arr[low]) * (high - low)) // (arr[high] - arr[low])

        if arr[pos] == target:
            return pos
        elif arr[pos] < target:
            low = pos + 1
        else:
            high = pos - 1

    return -1

arr = [1, 3, 5, 7, 9, 11, 13]
target = 7
print(interpolation_search(arr, target))  # Output: 3

Mélységi keresés (DFS - Depth First Search)

Leírás:

  • Gráfokban vagy fákban keres, mélység szerint haladva.
  • Rekurzióval vagy veremmel implementálható.

Időbonyolultság:

  •  , ahol  : csúcsok,  : élek száma.

Python példa:

def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    print(start, end=" ")

    for neighbor in graph[start]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

graph = {
    0: [1, 2],
    1: [2],
    2: [0, 3],
    3: [3]
}
dfs(graph, 2)  # Output: 2 0 1 3

Szélességi keresés (BFS - Breadth First Search)

Leírás:

  • Gráfokban vagy fákban keres, szintenként haladva.

Időbonyolultság:

  •  , ahol  : csúcsok,  : élek száma.

Python példa:

from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    visited.add(start)

    while queue:
        node = queue.popleft()
        print(node, end=" ")

        for neighbor in graph[node]:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append(neighbor)

graph = {
    0: [1, 2],
    1: [2],
    2: [0, 3],
    3: [3]
}
bfs(graph, 2)  # Output: 2 0 3 1

Összegzés

Keresési algoritmusok összehasonlítása
Algoritmus Adatszerkezet Időbonyolultság (Legrosszabb) Megjegyzések
Lineáris keresés Lista   Egyszerű, de lassú.
Bináris keresés Rendezett lista   Gyors, de rendezett adatra van szükség.
Jump keresés Rendezett lista   Közepesen gyors.
Interpolációs keresés Rendezett lista   Egyenletes eloszlású adatokra hatékony.
DFS Gráf   Mélységi keresés gráfokban/fákban.
BFS Gráf   Szélességi keresés gráfokban/fákban.


Fordítások