CodeGym /Kursy /Python SELF PL /Metody optymalizacji algorytmów

Metody optymalizacji algorytmów

Python SELF PL
Poziom 61 , Lekcja 3
Dostępny

4.1 Ogólne podejścia do optymalizacji algorytmów.

Optymalizacja algorytmów odgrywa kluczową rolę w tworzeniu efektywnego oprogramowania, pozwalając zmniejszyć czas wykonania i zużycie pamięci oraz poprawić skalowalność systemów. Istnieją różne metody i podejścia do optymalizacji algorytmów, które stosuje się w zależności od konkretnych zadań i warunków.

Podejścia do optymalizacji algorytmów.

Profilowanie:

Analiza wydajności kodu w celu identyfikacji "wąskich gardeł". Użycie profilerów, takich jak cProfile w Pythonie, pomaga zidentyfikować najbardziej czasochłonne i pamięciochłonne części kodu.


import cProfile

def example_function():

# twój kod
cProfile.run('example_function()')

Dzielenie i rządzenie:

Podział zadania na mniejsze podzadania, które łatwiej rozwiązać. Przykład: algorytmy szybkiego sortowania (QuickSort) i sortowania przez scalanie (MergeSort).


def quicksort(arr):
    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)

Programowanie dynamiczne:

Wykorzystanie wcześniej obliczonych rozwiązań dla podzadań, aby uniknąć powtórnych obliczeń. Przykład: obliczanie liczb Fibonacciego.


def fibonacci(n, memo={}):
    if n in memo:
        return memo[n]
    if n <= 2:
        return 1
    memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo)
    return memo[n]

Użycie odpowiednich struktur danych:

Wybór struktur danych, które zapewniają bardziej efektywne wykonanie operacji. Przykład: użycie hash tables (słowników w Pythonie) do szybkiego wyszukiwania.


data = {'key1': 'value1', 'key2': 'value2'}
value = data.get('key1')

4.2 Optymalizacja złożoności czasowej i przestrzennej.

Optymalizacja złożoności czasowej pozwala nam zmniejszyć czas wykonania algorytmu poprzez zmniejszenie liczby operacji.

Przykład 1:

Udoskonalenie algorytmu liniowego wyszukiwania do wyszukiwania binarnego dla posortowanych tablic.


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

Optymalizacja złożoności przestrzennej pozwala nam zmniejszyć zużycie pamięci poprzez użycie bardziej kompaktowych struktur danych lub redystrybucję zasobów.

Przykład:

Użycie generatorów w Pythonie do oszczędzania pamięci przy pracy z dużymi sekwencjami.


def large_sequence():
    for i in range(1000000):
        yield i

for number in large_sequence():
    print(number)

4.3 Przykłady optymalizacji algorytmów wyszukiwania i sortowania.

1 Optymalizacja algorytmów wyszukiwania:

Wyszukiwanie liniowe:

Zamień wyszukiwanie liniowe na binarne dla posortowanych danych.


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

Wyszukiwanie w hash table:

Użycie hash table do wyszukiwania, co pozwala wykonywać operacje w stałym czasie O(1).


data = {'key1': 'value1', 'key2': 'value2'}
value = data.get('key1')

2 Optymalizacja algorytmów sortowania:

Sortowanie bąbelkowe:

Zamień sortowanie bąbelkowe na bardziej efektywne algorytmy, takie jak szybkie sortowanie (QuickSort) lub sortowanie przez scalanie (MergeSort).


def quicksort(arr):
    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)

Użycie wbudowanych funkcji sortowania:

W większości języków programowania wbudowane funkcje sortowania są zoptymalizowane i często działają szybciej niż ręcznie zaimplementowane algorytmy.


arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
arr.sort()

Optymalizacja algorytmów jest ważną częścią tworzenia efektywnego oprogramowania. Rozumienie różnych metod optymalizacji, takich jak profilowanie, użycie odpowiednich struktur danych i zastosowanie programowania dynamicznego, pozwala ci tworzyć szybkie i skalowalne rozwiązania.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION