JavaRush /Курси /Модуль 1: Python Core /Методи оптимізації алгоритмів

Методи оптимізації алгоритмів

Модуль 1: Python Core
Рівень 20 , Лекція 3
Відкрита

4.1 Загальні підходи до оптимізації алгоритмів.

Оптимізація алгоритмів відіграє ключову роль у розробці ефективного програмного забезпечення, дозволяючи знизити час виконання та споживання пам'яті, а також покращити масштабованість систем. Існують різні методи і підходи до оптимізації алгоритмів, які застосовуються в залежності від конкретних завдань і умов.

Підходи до оптимізації алгоритмів.

Профілювання:

Аналіз продуктивності коду для виявлення "вузьких місць". Використання профілювальників, таких як cProfile в Python, допомагає визначити найбільш затратні по часу та пам'яті частини коду.


import cProfile

def example_function():


# ваш код
cProfile.run('example_function()')

Розділяй і володарюй:

Розбиття задачі на менші підзадачі, які легше розв'язувати. Приклад: алгоритми швидкого сортування (QuickSort) та сортування злиттям (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)

Динамічне програмування:

Використання раніше обчислених рішень для підзадач для уникнення повторних обчислень. Приклад: обчислення чисел Фібоначчі.


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]

Використання відповідних структур даних:

Вибір структур даних, які забезпечують більш ефективне виконання операцій. Приклад: використання хеш-таблиць (словники в Python) для швидкого пошуку.


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

4.2 Оптимізація часової і просторової складності.

Оптимізація часової складності дає нам зниження часу виконання алгоритму за рахунок зменшення кількості операцій.

Приклад 1:

Покращення алгоритму лінійного пошуку до бінарного пошуку для відсортованих масивів.


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

Оптимізація просторової складності дає нам зниження споживання пам'яті за рахунок використання більш компактних структур даних або перерозподілу ресурсів.

Приклад 2:

Використання генераторів в Python для економії пам'яті при роботі з великими послідовностями.


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

for number in large_sequence():
    print(number)

4.3 Приклади оптимізації алгоритмів пошуку та сортування.

1 Оптимізація алгоритмів пошуку:

Лінійний пошук:

Замініть лінійний пошук на бінарний для відсортованих даних.


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

Пошук у хеш-таблиці:

Використання хеш-таблиці для пошуку, що дозволяє виконувати операції за постійний час O(1).


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

2 Оптимізація алгоритмів сортування:

Сортування бульбашкою:

Замініть сортування бульбашкою на більш ефективні алгоритми, такі як швидке сортування (QuickSort) або сортування злиттям (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)

Використання вбудованих функцій сортування:

У більшості мов програмування вбудовані функції сортування оптимізовані і часто працюють швидше, ніж реалізовані вручну алгоритми.


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

Оптимізація алгоритмів є важливою частиною розробки ефективного програмного забезпечення. Розуміння різних методів оптимізації, таких як профілювання, використання відповідних структур даних та застосування динамічного програмування, дозволяє створювати швидкі та масштабовані рішення.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ