Estruturas de dados (com python)
são (mais) legais

About me
- Tyrone Damasceno
- Potiguar
- Desenvolvedor e pythonista ❤
- Ex-maratonista de programação
- Apaixonado por comunidade
- Beer&Burger

Estruturas de Dados
Mas o que são dados?

Dados são informações
Dados são informações
Linguagens de programação nos dão formas de lidar com informações
Python, por exemplo, nos traz algumas uma forma básica para armazenar dados:
Os tipos primitivos
Mas nem só de int, float, str e bool vive um pythonista.
Por isso, nós construímos novos tipos de dados, e maneiras de organizá-los

As estruturas de dados
Muitos programadores tem medo da expressão "estruturas de dados", mas esquecem que até as mais simples e amigáveis também são
Por exemplo: as listas e os dicionários (hashtables)
Estruturas (sem import) do python
No python, as listas, conjuntos, os dicionários e as tuplas não exigem sequer um import, portanto são comumente usadas.

Estruturas (sem import) do python
Dicionários são coleções de pares chave-valor
Ex: {'Python': 'Top', 'java': '...'}
As listas são sequências de objetos
Ex: [1, 2, 3] ou ['Alpha', True, sum]
Conjuntos são coleções de objetos sem repetição
Ex: {'a', 4, False}
Tuplas são (não apenas) sequências imutáveis
Ex: (1, 2, 3)
Estruturas com import do python
Duas estruturas de dados muito importantes na ciência da computação são a fila e a pilha. Existe também o deque, que implementa ambos os comportamentos.
Filas tem um comportamento chamado FIFO
(First-In-First-Out) enquanto as Pilhas tem um comportamento LIFO (Last-In-First-Out)
Deques são double-ended-queues, ou seja, filas onde pode-se inserir e remover elementos em ambas as pontas
Pilhas e filas

Fila
Pilha

O módulo queue
Python possui um módulo built-in que implementa filas.
O módulo queue possui as seguintes classes:
Queue: a fila comum LifoQueue: uma fila Lifo, ou seja, uma pilha PriorityQueue: Um tipo de estrutura que busca ter sempre um elemento extremo em sua ponta
O módulo collections
Um outro módulo importante nesse assunto é o collections, ele implementa deque e defaultdict (além de OrderedDict, Counter e namedtuple)
deque: fila com duas pontas
defaultdict: dicionário com valores default
Vamo treinar?

Disclaimer
Vale deixar claro que os casos de teste apresentados são apenas uma pequeníssima parte dos casos para que o problema será submetido, bem como quase tudo que resolvemos na vida real.
Você vai chegar a casos que a solução está correta, porém não serve para o cenário que você vai lidar, para isso serve conhecer estruturas de dados diferentes para melhor abordar a situação.
Uma forma de conseguir "prever" casos assim é fazendo uma análise de complexidade, que pode ser papo pra outro dia.
Problemas
Estruturas de dados não lineares
GRAFO!
Eis o terror de muitos estudantes e entusiastas de programação
GRAFO!
Grafo é uma estrutura matemática, que serve para modelar diversos tipos de problemas e soluções.
Mas na realidade, um grafo pode ser pensado como um conjunto de bolinhas e tracinhos ligando elas e aí você abstrai como preferir =D. (eu faço assim geralmente)
As bolinhas são os NÓS
E os tracinhos são as ARESTAS
Variações de grafos
Simples
Completo
Acíclico
Ponderado
Nulo
Trivial
Árvore
Floresta
Bipartido
Eis um exemplo de grafo
Mais um...
Mais um...
Agora esse
Eles também podem ser direcionados
E suas arestas podem ter pesos (ou custos)
A
E
C
D
B
12
5
2
3
1
Representação computacional
Geralmente são usados estruturas de lista ou matriz de adjacências para representar um grafo


Tipos de problemas e algoritmos
Problemas de Busca
Caminho mínimo
Coloração de grafos
Roteamento
Fluxo
Caixeiro Viajante
Ordenação Topológica
Árvore Geradora
Algoritmo de Dijkstra
DFS / BFS
Floyd-Warshall
Ford-Fulkerson
Kruskal / Prim
BFS / DFS
Buscas em largura e profundidade


Dijkstra e Floyd-Warshall
Algoritmos de caminho mínimo


LIVE CODING!!!


Estruturas de Dados com Python
By Tyrone Damasceno
Estruturas de Dados com Python
- 140