Estou tentando resolver o exercício "O idioma de programação go" 1.4, que exige que eu tenha um conjunto. Posso criar um tipo de conjunto, mas por que o idioma não vem com um? como vieram do google, onde a goiaba também se originou, por que os designers de idiomas não optaram por adicionar suporte a estruturas de dados fundamentais? por que forçar seus usuários a criar suas próprias implementações para algo tão básico como um conjunto?
data-structures
go
set
anjanb
fonte
fonte
Respostas:
Em parte, porque o Go não possui genéricos (então você precisaria de um tipo de conjunto para cada tipo ou recuaria na reflexão, o que é bastante ineficiente).
Em parte, porque se tudo o que você precisa é "adicionar / remover elementos individuais a um conjunto" e "relativamente eficiente em termos de espaço", você pode obter um pouco disso simplesmente usando a
map[yourtype]bool
(e defina o valortrue
para qualquer elemento no conjunto ) ou, para obter mais eficiência de espaço, você pode usar uma estrutura vazia como valor e usar_, present = the_setoid[key]
para verificar a presença.fonte
map[T]struct{}
vez demap[T]bool
.Um dos motivos é que é fácil criar um conjunto a partir do mapa:
União
Interseção
Não é realmente difícil implementar todas as outras operações definidas.
fonte
false
) indica isso corretamente. Não é necessário o idioma vírgula-ok para o teste.map[int]struct{}
vez debool
, porque uma estrutura vazia ocupa 0 bytes na memória. Eu escrevi recentemente uma essência para este gist.github.com/bgadrian/cb8b9344d9c66571ef331a14eb7a2e80Como escreveu Vatine: Como o go go carece de genéricos, ele deveria fazer parte da linguagem e não da biblioteca padrão. Para isso, você teria que poluir o idioma com as palavras-chave definidas, união, interseção, diferença, subconjunto ...
A outra razão é que não está claro qual é a implementação "correta" de um conjunto:
Existe uma abordagem funcional:
Este é um conjunto de todas as ints pares. Possui uma pesquisa muito eficiente e a união, interseção, diferença e subconjunto podem ser facilmente realizados pela composição funcional.
Um mapa não tem esse problema, pois você armazena algo associado ao valor.
fonte
+
para união,-
diferença,*
interseção,<=
subconjunto,>=
superconjunto,=
igualdade,<>
desigualdade ein
associação. Portanto, no Go, seria apenas uma única nova palavra-chave -in
. Por outro lado, os conjuntos internos de Pascal funcionam apenas em "ordinais" - ou seja, qualquer tipo que tenha uma representação subjacente de um valor inteiro de algum tamanho.s[key]
(como ses
fosse amap[T]bool
) em vez dekey in s
.n % 2 == 0
?Outra possibilidade é usar conjuntos de bits, para os quais existe pelo menos um pacote ou você pode usar o pacote grande embutido . Nesse caso, basicamente você precisa definir uma maneira de converter seu objeto em um índice.
fonte