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!!!

Made with Slides.com