Torna ai corsi
AI028 Laurea

Analisi delle strutture dati e degli algoritmi con Python (edizione 2)

Questo libro è un classico testo che illustra strutture dati e algoritmi utilizzando Python. Copre il ripasso delle basi di Python, l'analisi degli algoritmi (notazione O grande), le strutture dati fondamentali (pila, coda, lista), la ricorsione, la ricerca e il ordinamento, gli algoritmi sui alberi e sui grafi. Attraverso liste di codice pratiche, aiuta gli utenti a comprendere come implementare in modo efficiente vari tipi astratti di dati tramite Python.

4.7
24.0h
1028 studenti
8 lessons
0 mi piace
Intelligenza Artificiale
Inizia ad imparare

Panoramica del corso

📚 Riepilogo del contenuto

Questo libro è un classico testo sull'implementazione di strutture dati e algoritmi in Python. Copre il ripasso delle basi di Python, l'analisi degli algoritmi (notazione O grande), le strutture dati fondamentali (stack, code, liste), la ricorsione, la ricerca e il ordinamento, gli algoritmi sugli alberi e sui grafi. Attraverso elenchi di codice pratici, aiuta i lettori a comprendere come implementare in modo efficiente diverse astrazioni di tipi di dati tramite Python.

Solo chi padroneggia profondamente strutture dati ed algoritmi può veramente dominare Python.

Autore: Bradley Miller (Professore Emerito di Scienze dell'Informazione all'Università di Luther, USA), David Ranum (Ingegnere di software cognitivo presso IBM Watson)

Ringraziamenti: Grazie ai colleghi Steve Hubbard per i numerosi feedback forniti per la prima edizione e per i nuovi materiali aggiunti nella nuova versione, nonché a tutti coloro che hanno segnalato errori e offerto suggerimenti via email. Ringraziamo anche Mary, Bob e altri dipendenti del caffè Java John's a Decora City, che ci hanno permesso di diventare "autori residenti" durante le nostre vacanze. Inoltre, grazie a tutti i membri di Franklin, Beedle & Associates (in particolare Jim Leisy e Tom Sumner) per la piacevole collaborazione. Infine, ringraziamo specialmente le nostre mogli, Jane Miller e Brenda Ranum, per il loro amore e sostegno che hanno reso possibile la realizzazione di questo libro.

🎯 Obiettivi di apprendimento

  1. Comprendere il rapporto tra scienza dell'informazione, algoritmi e programmazione, e padroneggiare i concetti di tipo di dato astratto (ADT) e nascosta informazione.
  2. Utilizzare con sicurezza i tipi di dati integrati di Python (liste, tuple, insiemi, dizionari) e le strutture di controllo (cicli, condizioni, gestione eccezioni).
  3. Padronanza dei concetti fondamentali della programmazione orientata agli oggetti in Python: definizione di classi, metodi costruttori, sovraccarico di operatori (ad esempio addizione di frazioni), applicazione dell'algoritmo euclideo e distinzione tra uguaglianza profonda e superficiale.
  4. Confronto tra diverse soluzioni algoritmiche: essere in grado di spiegare quattro approcci per rilevare parole anagrammatiche (conteggio, ordinamento, forza bruta, conteggio caratteri) e i rispettivi tempi di complessità.
  5. Misurazione della performance dei container in Python: conoscere l'efficienza asintotica (O grande) delle operazioni principali su liste e dizionari in Python, e distinguere le differenze prestazionali tra pop() e pop(i).
  6. Capacità di validare le prestazioni: saper utilizzare il modulo timeit per progettare esperimenti che verifichino la coerenza tra complessità teorica e tempo di esecuzione reale.
  7. Comprendere e distinguere le caratteristiche logiche delle strutture dati lineari (stack, code, deque, liste).
  8. Essere in grado di implementare stack, code e deque personalizzati usando i tipi di dati basilari di Python (come le liste).
  9. Padronanza delle applicazioni dello stack nel trattamento di espressioni (conversione da notazione infix a postfix, valutazione di espressioni postfix) e delle code nella simulazione di sistemi (simulazione di stampante).
  10. Padronanza dei tre principi fondamentali della ricorsione: identificare correttamente e scrivere funzioni ricorsive che includano un caso base, una progressione verso lo stato base e una chiamata ricorsiva.

Lezioni

Lesson

This lesson introduces the core principles of computer science, focusing on problem-solving through algorithms, procedural abstraction, and Python’s object-oriented nature. Students will learn to manage complexity by leveraging Python’s dynamic variable references, efficient built-in data structures, and robust error-handling techniques to build reliable, scalable software.

本课程深入探讨了算法分析的核心工具——大O记法,通过异序词检测案例展示了从暴力法到计数法的性能优化过程。学习重点在于理解不同操作(如列表索引与pop操作)的复杂度差异,并掌握如何通过空间换时间及选择合适的数据结构来提升程序效率。

This lesson introduces linear data structures and the concept of Abstract Data Types (ADTs), focusing on the stack as a fundamental LIFO (Last-In, First-Out) structure. Students will learn to implement stacks in Python and apply them to complex tasks, including converting infix expressions to postfix notation and evaluating those expressions efficiently.

本课程深入探讨了递归算法的核心原理,重点讲解了递归三原则(基准情况、状态改变、自我调用)以及递归与系统调用栈之间的内在联系。通过进制转换、汉诺塔及动态规划等案例,学生将学习如何将复杂问题拆解为自相似的子问题,并掌握从递归思维向高效动态规划算法的进阶转换。

This lesson explores fundamental search and retrieval algorithms, progressing from $O(n)$ sequential search to the $O(\log n)$ efficiency of binary search and the $O(1)$ potential of hash tables. Students learn to optimize data access through divide-and-conquer strategies, sophisticated hash function design, and collision-handling techniques to build efficient, dictionary-like data structures.

This lesson explores the hierarchical and recursive nature of tree data structures, covering fundamental terminology, implementation methods like nested lists and object-oriented references, and the construction of expression trees. It also introduces essential tree traversal algorithms—preorder, inorder, and postorder—and explains how these recursive patterns are applied to tasks like file system analysis and AVL tree balancing.

This lesson introduces graph theory as a powerful tool for modeling real-world problems by abstracting entities as vertices and relationships as edges. Students will learn to implement graphs using adjacency lists, compare storage efficiency, and master the Breadth-First Search (BFS) algorithm to solve pathfinding and state-space challenges.

This lesson explores the memory efficiency of Python's ArrayList, explaining how amortized analysis ensures $O(1)$ performance for append operations through strategic over-allocation. It also covers the mathematical foundations of RSA encryption, demonstrating how modular exponentiation and divide-and-conquer algorithms optimize complex calculations for secure data processing.