Slide 1

Slide 1 text

c o n s t r u ç ã o e u s o PRÁTICA DE CONJUNTOS Porquê e como implementar um tipo Set na linguagem Go. Luciano Ramalho @ramalhoorg

Slide 2

Slide 2 text

OBJETIVOS 1
 Demonstrar como e porque o uso de conjuntos pode simplificar a lógica. 2
 Discutir alternativas para implementar coleções de tipo Set em Go. 2

Slide 3

Slide 3 text

MOTIVAÇÃO Quando senti saudade de conjuntos 3

Slide 4

Slide 4 text

CASO DE USO #1 4 Exibir produto se todas as palavras da consulta apare- cerem na descrição

Slide 5

Slide 5 text

SOLUÇÃO SEM CONJUNTOS #1 Já escrevi código assim… 5 execução na ordem de O(m*n) busca em O(n) busca em O(m)

Slide 6

Slide 6 text

SOLUÇÃO SEM CONJUNTOS #2 Assim fica mais legível… 6 execução na ordem de O(m*n) busca em O(n)

Slide 7

Slide 7 text

7 Que tal se… Depois! Agora estou muito ocupado! www.workcompass.com/

Slide 8

Slide 8 text

CASO DE USO #1 8 Exibir produto se todas as palavras da consulta apare- cerem na descrição Q ⊂ D www.workcompass.com/

Slide 9

Slide 9 text

CASO DE USO #2 9 Marcar todos os produtos favoritados, exceto os que já estiverem no carrinho de compras.

Slide 10

Slide 10 text

CASO DE USO #2 10 Marcar todos os produtos favoritados, exceto os que já estiverem no carrinho de compras. F ∖ C

Slide 11

Slide 11 text

CASO DE USO #3: RUNEFINDER 11 https://tgo.li/runes2018

Slide 12

Slide 12 text

CASO DE USO #3: RUNEFINDER 12 https://tgo.li/runes2018

Slide 13

Slide 13 text

CASO DE USO #3: RUNEFINDER 13 https://tgo.li/runes2018

Slide 14

Slide 14 text

CASO DE USO #3: ÍNDICE INVERTIDO

Slide 15

Slide 15 text

CASO DE USO #3: ÍNDICE INVERTIDO “REGISTERED SIGN” é o nome oficial de ® em UnicodeData.txt

Slide 16

Slide 16 text

CASO DE USO #3: ÍNDICE INVERTIDO 16 www.workcompass.com/ index é o índice invertido: as chaves são palavras, e os valores são conjuntos de runas cujo nome contém a palavra. Ex. a runa ‘®’ aparece nas chaves “REGISTERED” e “SIGN”

Slide 17

Slide 17 text

CASO DE USO #3: ÍNDICE INVERTIDO 17 A ∩ B www.workcompass.com/

Slide 18

Slide 18 text

LÓGICA E CONJUNTOS Uma relação íntima 18

Slide 19

Slide 19 text

Ainda não descobriram um ramo da
 matemática que não possa ser formalizado
 pela teoria dos conjuntos. Thomas Forster
 (tradução livre de Logic Induction and Sets, p. 167) 19

Slide 20

Slide 20 text

CONJUNÇÃO LÓGICA: INTERSECÇÃO x pertence à intersecção de A e B. é o mesmo que: x pertence ao conjunto A e
 x também pertence ao conjunto B. Em notação matemática: x ∈ (A ∩ B) ⟺ (x ∈ A) ∧ (x ∈ B) Em computação: AND 20

Slide 21

Slide 21 text

DISJUNÇÃO LÓGICA: UNIÃO x pertence à união de A e B. é o mesmo que: x pertence ao conjunto A e/ou
 x pertence ao conjunto B. Em notação matemática: x ∈ (A ∪ B) ⟺ (x ∈ A) ∨ (x ∈ B) Em computação: OR 21

Slide 22

Slide 22 text

DIFERENÇA SIMÉTRICA x pertence ao conjunto A ou
 x pertence ao conjunto B
 mas não pertence aos dois é o mesmo que: x pertence à união de A e B menos a intersecção de A e B. Em notação matemática:
 Em computação: XOR 22 x ∈ (A ∆ B) ⟺ (x ∈ A) ⊻ (x ∈ B)

Slide 23

Slide 23 text

DIFERENÇA x pertence ao conjunto A mas
 não pertence ao conjunto B. é o mesmo que: elementos de A menos os de B Em notação matemática: x ∈ (A ∖ B) ⟺ (x ∈ A) ∧ (x ∉ B) 23

Slide 24

Slide 24 text

CONJUNTOS EM VÁRIAS LINGUAGENS 24

Slide 25

Slide 25 text

CONJUNTOS EM VÁRIAS BIBLIOTECAS-PADRÃO Algumas linguagens/plataformas que implementam conjuntos em sua biblioteca-padrão. 25 Java Interface Set com < 10 métodos; 8 implementações JavaScript (ES6) Set com < 10 métodos .Net (C# etc.) Interface ISet com > 10 métodos; 2 implementações Python set e frozenset com > 10 métodos e operadores Ruby Set com > 10 métodos e operadores

Slide 26

Slide 26 text

REINVENTANDO A RODA EM GO 26

Slide 27

Slide 27 text

USO DE MAP COMO CONJUNTO Chaves de um map formam um conjunto
 com duas características essenciais: •Garantia de unicidade: 
 uma chave só pode ocorrer uma vez. •Verificação de pertencimento em O(1): 
 tempo praticamente constante independente do número de elementos.
 
 
 
 Demais métodos? Fique à vontade para implementar! 27 if _, existe := conjunto[elem]; existe { // o elemento está no conjunto }

Slide 28

Slide 28 text

USO DE MAP COMO CONJUNTO Chaves de um map formam um conjunto
 com duas características essenciais: •Garantia de unicidade: 
 uma chave só pode ocorrer uma vez. •Verificação de pertencimento em O(1): 
 tempo praticamente constante independente do número de elementos.
 
 
 
 Demais métodos? Fique à vontade para implementar! 28 Curiosidade:
 era assim que a gente se virava em Python até 2003 — usando chaves de um dict como um conjunto! if _, existe := conjunto[elem]; existe { // o elemento está no conjunto }

Slide 29

Slide 29 text

RELEMBRANDO: CASO DE USO #1 29 Exibir produto se todas as palavras da consulta apare- cerem na descrição Q ⊂ D www.workcompass.com/

Slide 30

Slide 30 text

SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 30 map de para struct{}

Slide 31

Slide 31 text

SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 31 preencher o
 “conjunto”

Slide 32

Slide 32 text

SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 32 busca em O(1) busca em O(n)

Slide 33

Slide 33 text

CONJUNTOS “GENÉRICOS” EM GO Elementos tipo interface{} 33

Slide 34

Slide 34 text

GOLANG-SET By Ralph Caraveo (@deckarep) 34

Slide 35

Slide 35 text

35

Slide 36

Slide 36 text

GOLANG-SET, VULGO MAPSET… 36

Slide 37

Slide 37 text

GOLANG-SET: INTERFACE SET 37 22 métodos

Slide 38

Slide 38 text

threadUnsafeSet threadSafeSet GOLANG-SET: IMPLEMENTAÇÕES 38 elementos tipo interface{}

Slide 39

Slide 39 text

GOLANG-SET: EXEMPLO 39

Slide 40

Slide 40 text

GOLANG-SET: CODE REVIEW 40

Slide 41

Slide 41 text

GOLANG-SET: CODE REVIEW 41 elementos tipo interface{} porque?

Slide 42

Slide 42 text

GOLANG-SET: CODE REVIEW 42

Slide 43

Slide 43 text

GOLANG-SET: CODE REVIEW 43

Slide 44

Slide 44 text

GODS Go Data Structures 44

Slide 45

Slide 45 text

45 elementos tipo interface{}

Slide 46

Slide 46 text

GODS: PACKAGE SETS 46 interface:
 7 métodos 2 implementações: HashSest, TreeSet

Slide 47

Slide 47 text

GEN Type-driven code generation for Go 47

Slide 48

Slide 48 text

GEN: GERADOR DE CÓDIGO COM TIPOS PARAMETRIZADOS 48

Slide 49

Slide 49 text

GEN: MODO DE USAR 1. Marque o seu código com comentários especiais: 
 
 
 
 
 2. Execute o comando gen 
 3. Adicione ao seu projeto o arquivo .go gerado 49 Exemplo em: https://tgo.li/2vtcMjw

Slide 50

Slide 50 text

GEN: MEU CÓDIGO FONTE (CODEPOINTS.GO) 50 Exemplo em: https://tgo.li/2vtcMjw

Slide 51

Slide 51 text

GEN: O ARQUIVO GERADO (CODEPOINT_SET.GO) 51 Exemplo em: https://tgo.li/2vtcMjw código derivado
 de golang-set

Slide 52

Slide 52 text

CONJUNTOS ESPECIALIZADOS 52

Slide 53

Slide 53 text

MAP COM NOME standupdev/runeset 53

Slide 54

Slide 54 text

RUNESET: DEFINIÇÃO DO TIPO E MÉTODOS ESSENCIAIS 54 https://github.com/standupdev/runeset elementos do tipo rune

Slide 55

Slide 55 text

RUNESET: CARACERÍSTICAS Não encapsula o map: pode ser acessado e modificado direto.
 Sintaxe melhor para criar e testar elementos: 
 Exemplo: 55 s.Add(e)
 s.Contains(e) https://github.com/standupdev/runeset

Slide 56

Slide 56 text

RUNESET: TIPO MAP COM NOME E MÉTODOS 56 10 métodos, incluindo: Intersection, IntersectionUpdate

Slide 57

Slide 57 text

RUNESET: CONSTRUTORES Convenção: Usar Make para criar objetos manipulados por referências. 57 https://github.com/standupdev/runeset cria um
 Set vazio

Slide 58

Slide 58 text

MakeFromString: set de runas a partir de string RUNESET: CONSTRUTORES 58 custo zero para passar uma slice: runas…

Slide 59

Slide 59 text

RUNESET: INTERSECÇÃO 59 https://github.com/standupdev/runeset

Slide 60

Slide 60 text

RUNESET: USO EM ÍNDICE INVERTIDO (CASO DE USO #3)

Slide 61

Slide 61 text

RUNESET: MÉTODOS ÚTEIS Além de operações da teoria dos conjuntos…
 MakeFromString: construtor que aceita string.
 Sorted: devolve slice de runas em ordem ascendente String: elementos ordenados para facilitar exemplos.
 Equal: facilita muito os testes.
 Copy: importante especialmente em coleções mutáveis. 61

Slide 62

Slide 62 text

MAP ENCAPSULADO 62

Slide 63

Slide 63 text

STRSET: TIPO MAP ENCAPSULADO EM STRUCT 63 https://github.com/standupdev/strset

Slide 64

Slide 64 text

STRSET: CARACTERÍSTICAS Protege o map: campo privado só pode acessado via métodos e funções do mesmo pacote.
 Não é prático construir com a sintaxe Set{}: 
 melhor usar Make(). 
 Exemplo: 64 https://github.com/standupdev/strset

Slide 65

Slide 65 text

STRSET: API 65 26 métodos

Slide 66

Slide 66 text

COMPARAR APIS PARA ESCOLHER NOMES DE MÉTODOS 66

Slide 67

Slide 67 text

ORGANIZAÇÃO DO PACOTE STRSET Nota: todos os métodos que modificam um Set depois de criado estão no arquivo updaters.go. 67 core.go Make, Len, Contains, String, Equal, Copy, ToSlice, Channel operators.go Intersection, Union,
 Difference, SymmetricDifference relations.go SubsetOf, SupersetOf updaters.go Add, AddAll, Remove, RemoveAll, Pop, Clear, IntersectionUpdate, UnionUpdate, DifferenceUpdate, SymmetricDifferenceUpdate https://github.com/standupdev/strset

Slide 68

Slide 68 text

RUNESCAN: EXEMPLO DE USO DE STRSET 68

Slide 69

Slide 69 text

69

Slide 70

Slide 70 text

BÔNUS Contribuições do Vitor De Mario 70

Slide 71

Slide 71 text

SUGESTÕES DO VITOR DE MARIO 71

Slide 72

Slide 72 text

PROJETO SCYLLABDB GO-SET 72 https://github.com/scylladb/go-set

Slide 73

Slide 73 text

CONCLUSÃO 73

Slide 74

Slide 74 text

CONJUNTOS NA PRÁTICA Operações de conjunto podem simplificar sua lógica golang-set (@deckarep): a implementação rica mais popular gen pode produzir um golang-set específico para seu tipo Codar um tipo set é um ótimo exercício de programação Se precisar de Set para elementos string, use strset! 74 https://github.com/standupdev/strset

Slide 75

Slide 75 text

FICÇÃO CIENTÍFICA Bom mesmo seria isso… 75 var s1 set[string] s2 := make(set[uint64])

Slide 76

Slide 76 text

Luciano Ramalho
 @ramalhoorg | @standupdev
 [email protected] MUITO GRATO!