Mas o que são dados?
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
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)
No python, as listas, conjuntos, os dicionários e as tuplas não exigem sequer um import, portanto são comumente usadas.
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)
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
Fila
Pilha
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
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
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.
Eis o terror de muitos estudantes e entusiastas de programação
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
Simples
Completo
Acíclico
Ponderado
Nulo
Trivial
Árvore
Floresta
Bipartido
A
E
C
D
B
12
5
2
3
1
Geralmente são usados estruturas de lista ou matriz de adjacências para representar um grafo
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
Buscas em largura e profundidade
Algoritmos de caminho mínimo