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

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

Відкрита

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()

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

2
Задача
Модуль 1: Python Core,  20 рівень,  3 лекція
Недоступна
Профілювання
Профілювання
2
Задача
Модуль 1: Python Core,  20 рівень,  3 лекція
Недоступна
Випадковий мільйон
Випадковий мільйон
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.