Escolar Documentos
Profissional Documentos
Cultura Documentos
By using Medium, you agree to our Privacy Policy, Sign in Get started
including cookie policy.
Introdução à Complexidade de
Algoritmos
Wilder Pereira Follow
Mar 26, 2019 · 14 min read
Algoritmos
No mundo da ciência da computação, algoritmos são processos
computacionais bem definidos que podem receber uma entrada,
processá-la e produzir um ou mais valores como saída.
É possível que códigos mal escritos em Golang rodem muito mais rápido
(até certo ponto) do que o mesmo código escrito em C# ou Java.
Vamos analisar duas soluções para o famoso problema Two Sum, que
verifica se existem 2 números cuja soma resulte na entrada específica
(alvo) e retorna as posições dos números encontrados:
Algoritmo em Golang
Algoritmo em Kotlin
Contando Instruções
Para começar a entender a análise de complexidade de algoritmos,
precisamos conseguir identificar superficialmente o número de
instruções que um algoritmo possui.
1 maior := lista[0]
2
3 for indice := 0; indice < n; indice++ {
4 if lista[indice] > maior {
5 maior = lista[indice]
6 }
7 }
maior := lista[0]
Após isso, o loop será inicializado indice := 0 e seu bloco será executado
caso o array não seja vazio.
indice := 0
indice < n
Comportamento Assintótico
Seria uma tarefa muito maçante ficar contando o número de instruções
para cada trecho de código que escrevemos. Além de que o número de
instruções varia muito de linguagem para linguagem, compiladores e até
mesmo o processador que estamos utilizando.
Complexidade de espaço
Todas as análises feitas até agora foram em função do número de
operações que os algoritmos requerem, e isso é o equivalente à
complexidade de tempo.
Algoritmo em Kotlin
Para cada um dos itens do array, caso o item atual não esteja no mapa,
ele é adicionado, e caso a diferença do elemento atual com o target já
estiver no mapa, o elemento que faltava para a soma ser igual ao target
é encontrado.
O algoritmo requer, no pior dos casos, que todos os itens do array sejam
percorridos e adicionados no mapa. Como o acesso e adição no mapa
são constantes (O(1)), sua complexidade de tempo é O(n).
Algoritmo em Golang
Como essa solução não aloca nenhum espaço extra, podemos dizer que
sua complexidade de espaço é constante (O(1)).
Como o algoritmo só requer uma variável extra para rodar (mid) sua
complexidade de espaço é O(1). As variáveis arr, begin, end e x já
estavam alocadas, e por isso não influenciaram na complexidade de
tempo.
1 def mergesort(arr):
2
3 if len(arr) > 1:
4 mid = int(len(arr) / 2)
5
6 left_list = mergesort(arr[:mid])
7 right_list = mergesort(arr[mid:])
8
9 return merge(left_list, right_list)
10
11 return arr
12
13
14 def merge(left_list, right_list):
15
16 left_size = len(left_list)
17 right_size = len(right_list)
18
19 merged_list = [0] * (left_size + right_size)
20
21 merged_index = 0
22 left_index = 0
23 right_index = 0
24
25 while left_index < left_size and right_index < right_size:
26
27 if left_list[left_index] <= right_list[right_index]:
28 merged_list[merged_index] = left_list[left_index]
29 left_index += 1
30
31 else:
32 merged_list[merged_index] = right_list[right_index]
33 right_index += 1
34
35 merged_index += 1
36
37
38 while left_index < left_size:
39 merged_list[merged_index] = left_list[left_index]
40 left_index += 1
41 merged_index += 1
42
43 while right_index < right_size:
44 merged_list[merged_index] = right_list[right_index]
45 right_index += 1
46 merged_index += 1
47
48 return merged_list
Árvore de execução do Merge Sort. Os números representam o espaço extra a cada chamada recursiva.
E em seguida:
Conclusão
Esse post foi apenas uma breve introdução ao tópico de Algoritmos e
Complexidade para mostrar a sua importância. Para entender melhor o
assunto é necessário estudar mais a fundo cada um dos tópicos citados,
além de vários outros, utilizando recursos apropriados.
wilder/datastructures-and-algorithms
Repository for studying/practicing Data Structures and Algorithms. -
wilder/datastructures-and-algorithms
github.com
Referências
Loading...
Level up your coding skills and quickly land a job. This is the best
place to expand your knowledge and get prepared…
leetcode.com
616 1
WRITTEN BY
https://github.com/nagoya-foundation