CodeGym /Corsi /Python SELF IT /Metodi di ottimizzazione degli algoritmi

Metodi di ottimizzazione degli algoritmi

Python SELF IT
Livello 61 , Lezione 3
Disponibile

4.1 Approcci generali all'ottimizzazione degli algoritmi.

L'ottimizzazione degli algoritmi gioca un ruolo chiave nello sviluppo di software efficiente, permettendo di ridurre il tempo di esecuzione e il consumo di memoria, oltre a migliorare la scalabilità dei sistemi. Esistono vari metodi e approcci per l'ottimizzazione degli algoritmi, che vengono applicati a seconda dei compiti e delle condizioni specifiche.

Approcci all'ottimizzazione degli algoritmi.

Profilazione:

Analisi delle prestazioni del codice per identificare i "colli di bottiglia". L'uso di profiler, come cProfile in Python, aiuta a determinare le parti del codice più costose in termini di tempo e memoria.


import cProfile

def example_function():


# il tuo codice
cProfile.run('example_function()')

Dividi et impera:

Suddivisione del compito in sottocompiti più piccoli e più facili da risolvere. Esempio: algoritmi di ordinamento veloce (QuickSort) e di fusione (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)

Programmazione dinamica:

Utilizzo di soluzioni già calcolate per i sottoproblemi per evitare calcoli ripetuti. Esempio: calcolo dei numeri di Fibonacci.


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]

Uso di strutture dati adatte:

Scelta di strutture dati che consentono un'esecuzione più efficiente delle operazioni. Esempio: uso di tabelle hash (dizionari in Python) per una rapida ricerca.


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

4.2 Ottimizzazione della complessità temporale e spaziale.

L'ottimizzazione della complessità temporale ci offre una riduzione del tempo di esecuzione dell'algoritmo riducendo il numero di operazioni.

Esempio 1:

Miglioramento dell'algoritmo di ricerca lineare a ricerca binaria per array ordinati.


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

L'ottimizzazione della complessità spaziale ci offre una riduzione del consumo di memoria utilizzando strutture dati più compatte o la ridistribuzione delle risorse.

Esempio:

Uso di generatori in Python per risparmiare memoria lavorando con grandi sequenze.


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

for number in large_sequence():
    print(number)

4.3 Esempi di ottimizzazione degli algoritmi di ricerca e ordinamento.

1 Ottimizzazione degli algoritmi di ricerca:

Ricerca lineare:

Sostituisci la ricerca lineare con quella binaria per dati ordinati.


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

Ricerca in una tabella hash:

Uso di una tabella hash per la ricerca, che consente operazioni a tempo costante O(1).


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

2 Ottimizzazione degli algoritmi di ordinamento:

Ordinamento a bolle:

Sostituisci l'ordinamento a bolle con algoritmi più efficienti, come l'ordinamento veloce (QuickSort) o l'ordinamento a fusione (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)

Uso delle funzioni di ordinamento integrate:

Nella maggior parte dei linguaggi di programmazione le funzioni di ordinamento integrate sono ottimizzate e spesso funzionano più velocemente degli algoritmi implementati manualmente.


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

L'ottimizzazione degli algoritmi è una parte importante dello sviluppo di software efficiente. Comprendere i vari metodi di ottimizzazione, come la profilazione, l'uso di strutture dati adeguate e l'applicazione della programmazione dinamica, ti consente di creare soluzioni veloci e scalabili.

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