O tamanho parece um esforço desnecessário. Além disso, o uso de uma biblioteca bem conhecida e mantida como a goiaba pode economizar tempo de desenvolvimento e garantir uma melhor confiabilidade.
respondeu 11 de outubro de 2012 às 8:07
6.872 4 4 Badges de ouro 23 23 Crachás de prata 46 46 Crachás de bronze
À luz do esclarecimento, eu sugiro que você use uma árvore B+. Essa estrutura de dados frequentemente usada garante a ordem classificada, permite duplicatas e fornece operações eficientes de inserção e atualização. Ele também oferece recursos rápidos de pesquisa e consumo de alcance.
respondeu 11 de outubro de 2012 às 7:41
26.7K 51 51 Crachás de ouro 182 182 Crachás de prata 254 254 Crachás de bronze
Seria altamente portátil com um frasco de Mavon e sem dependências externas (embora um teste de unidade da biblioteca + Cl pudesse ser bom, mas eu mudei de volta para o JUNIT)
11 de outubro de 2012 às 8:59
Você pode usar um Treemap. Ele é implementado com uma árvore preto, permite duplicatas e oferece complexidade do tempo logarítmico para operações de inserção e pesquisa. Além disso, o TREEMAP está incluído na biblioteca padrão Java, para que você não tenha dependências externas.
respondeu 11 de outubro de 2012 às 8:48
12.9K 11 11 Crachás de ouro 57 57 Crachás de prata 77 77 Crachás de bronze
Quanto ao desempenho: LinkedList é mais lento. Então vem o Arraylist. As outras implementações escalam com o número de elementos.
11 de outubro de 2012 às 7:10
Usando uma lista do Linkedlist ou Arraylist e classificação antes de cada operação de pesquisa seria realmente ineficiente. Se você deseja uma coleção classificada que permita duplicatas e fornece inserção e atualização rápidas, considere usar uma lista de pular. Tem complexidade de tempo semelhante como uma árvore de busca binária equilibrada, mas evita as operações de equilíbrio.
respondeu 11 de outubro de 2012 às 8:33
34.7K 49 49 Crachás de ouro 129 129 Crachás de prata 158 158 Crachás de bronze
Você tem muitas opções para coleções classificadas que permitem duplicatas. Algumas das escolhas populares são:
- Treeset: implementa a interface do STOREDETST em Java. É apoiado por um Treemap e fornece operações eficientes de inserção, exclusão e pesquisa.
- Treemultiset (de goiaba): Esta classe fornece uma coleção classificada que permite duplicatas usando um treemultiset apoiado.
- Concurrentskiplistset: é uma implementação simultânea da interface do STORNEDSET. Ele usa uma lista de pular como a estrutura de dados subjacente.
- Árvore B+: Uma árvore de pesquisa auto-balance.
Por fim, a escolha depende de seus requisitos e compensações específicas. É importante considerar fatores como complexidade, eficiência de memória, desempenho e facilidade de uso. Você pode experimentar diferentes opções e compará -las para encontrar a solução mais adequada para o seu caso de uso.
respondeu em 29 de junho de 2021 às 9:20
1.781 3 3 crachás de ouro 11 11 crachás de prata 30 30 Crachás de bronze
Não vou perguntar sobre as razões para esse comportamento do priorityQueue, já que a discussão aqui cobre isso muito bem. O que eu quero perguntar, no entanto, é se há alguma alternativa por aí que eu não conheço?
O conjunto classificado permite duplicatas?
O conjunto ordenado contém elementos exclusivos em ordem classificada, assim como o conjunto. Ao lidar com um conjunto ordenado com elementos duplicados, o tipo de dados do par é usado em vez de int, onde o primeiro valor do par armazenará o elemento e o segundo valor armazenará os índices correspondentes. Ao fazer isso, cada par no conjunto ordenado será único e pode -se armazenar facilmente os elementos duplicados da matriz.
Operações:
1. order_of_key (): Ele aceita um elemento como um parâmetro e retorna o número de elementos estritamente menor que a chave. Ao implementá -lo, precisamos passar um par como o parâmetro cujo primeiro valor precisa ser o número para o qual queremos o resultado e o segundo valor conterá um valor negativo e.g., -1 porque os pares inseridos no Ordered_set terão o valor maior que o igual a 0, pois denota os índices da matriz.
2. find_by_order (): Ele aceita um índice como um parâmetro e retorna um iterador ao elemento i th (par) em ordem classificada.
Exemplo:
Vamos supor que haja um par de set ordenado myset =
Aqui,
- O par de set ordenado tem elementos duplicados.
- Depois de inserir todos os elementos em ordenado_set_pair,
- myset.order_of_key (): Isso dará o número de elementos menores de 5 i.E, 6.
- myset.Find_by_order (8): Ele dará um iterador ao 8º elemento no conjunto ordenado i.E, 7.
Abaixo está o programa C ++ para implementar a abordagem acima:
Java: coleção classificada que permite duplicatas, é eficiente em memória e fornece inserção rápida + atualização
Qualquer pessoa com sugestões melhores? Ou devo fugir da minha própria dados de dados classificados (que?)? Além disso, outras fontes (em Java, código aberto, com testes de unidade e pequenos depósitos) seriam legais.
Atualizar
Mais detalhes sobre meu caso de uso no momento (embora eu esteja tendo demanda semelhante na última vez). Eu tenho uma coleção (com milhões) de referências onde quero ser capaz
- e atualizar os campos s com a ajuda do campo a
- Valores idênticos dos campos s podem acontecer. Campo A é na verdade um número inteiro apontando para outra matriz
- A única dependência que eu quero é trove4j. Eu poderia usar um diferente, como as coleções Mahout, se isso fosse necessário. Mas não goiaba como, embora uma boa libera as coleções não sejam ajustadas para serem eficientes em memória (boxe/unboxing).
Então, todos os choram por uma pilha de Fibonacci, mas eu temo que ele tenha muita sobrecarga por elemento -> essa foi a razão pela qual pensei em uma solução mais eficiente de memória “classificada+segmentada”.
1 1 1 crachá de prata
Questionado em 10 de outubro de 2012 às 20:15
17K 16 16 Crachás de ouro 97 97 Crachás de prata 196 196 Crachás de bronze
Qual foi o problema de usar a Guava Treemultiset ?
10 de outubro de 2012 às 20:22
@vainolo dependência externa de acordo com a observação operacional.
10 de outubro de 2012 às 20:24
Pode ser útil – Felas de Cheats de Complexidade: Bigocheatsheet.com
11 de julho de 2017 às 14:29
6 respostas 6
Quando você precisar de uma coleção classificada, você deve analisar suas necessidades cuidadosamente.
Se a maioria das operações for inserção e apenas alguns devem pesquisar e depois usando uma coleção classificada i.e. Mantenha os elementos classificados na coleção constantemente, não seria uma boa opção (devido à sobrecarga de manter os elementos classificados na inserção que seria a operação mais comum).
Nesse caso, seria melhor manter um não triados coleta e faça a classificação apenas quando necessário. EU.. antes da pesquisa. Você pode até usar uma lista simples e classificá -la (usando coleções.classificar eu.e. mesclar) quando necessário. Mas eu recomendo isso com cautela, pois para isso ser eficiente, a suposição é que você trabalha em grandes dados. Em dados realmente pequenos, mesmo a pesquisa linear é boa o suficiente.
Se a maioria das operações for procurando Então você pode usar uma coleção classificada que, do meu ponto de vista, existem estruturas de dados para escolher (algumas que você já mencionou) e você pode comparar com qual deles se encaixa seu .
respondeu 10 de outubro de 2012 às 20:25
52.7K 66 66 Crachás de ouro 207 207 Crachás de prata 338 338 Crachás de bronze
Isso não responde à pergunta, realmente apenas reafirma
28 de junho de 2021 às 20:51
Que tal goiaba treemultiset? O que você pediu: uma coleção classificada que aceita duplicatas. Não sei nada sobre seu desempenho embora.
3,280 5 5 crachás de ouro 35 35 crachás de prata 49 49 crachás de bronze
respondeu em 10 de outubro de 2012 às 20:21
6.872 4 4 Badges de ouro 23 23 Crachás de prata 46 46 Crachás de bronze
Já adicionei, mas acho (ainda não olhei para o código) que a implementação é quase idêntica ao mapear
10 de outubro de 2012 às 21:22
Parece do código uma implementação completamente nova. Muito e muito código. E você pode baixar a fonte e adicioná -la ao seu projeto, então qual é o problema? licenciamento?
10 de outubro de 2012 às 21:28
Tamanho da jarra. meu aplicativo deve ser pequeno e portátil.
11 de outubro de 2012 às 7:10
Que tal usar ferramentas como o ProGuard para comprimir o frasco depois de terminar de programar? Escrever sua própria biblioteca apenas por causa do tamanho do JAR não é um bom investimento do seu tempo.
11 de outubro de 2012 às 7:38
Bem, eu gostaria de manter meu projeto (de código aberto) limpo e com apenas algumas dependências. e apenas por causa de umaestrutura de dados, eu definitivamente não dependerei de uma biblioteca inteira. Eu já tenho trove4j e não quero mais uma coleção Lib
11 de outubro de 2012 às 9:53
Eu decidi rolar o meu próprio, mas não a solução ideal apenas uma variante Treemap. Vou manter isso atualizado se eu ajustar esta coleção em relação à memória. A velocidade já é muito melhor do que a tentativa anterior de prioridade, pois eu precisava da coleção.Remover (objeto) Método (para atualizar uma entrada):
pacote com.GraphHopper.Coll; importar GNU..iterador.TintIterator; importar GNU.Trove.definir.cerquilha.Timhashset; importar java.util.Mapa.Entrada; importar java.util.Treemap; /*** Uma fila de prioridade implementada por um Treemap para permitir uma atualização rápida da chave. Ou devemos usar uma árvore B padrão *? */ Classe Pública MySortedCollection < private int size; private int slidingMeanValue = 20; private TreeMapmap; public MySortedCollection(int size) < map = new TreeMap(); > Void Remover (tecla int, int valor) < TIntHashSet set = map.get(value); if (set == null || !set.remove(key)) throw new IllegalStateException("cannot remove key " + key + " with value " + value + " - did you insert " + key + "," + value + " before?"); size--; if (set.isEmpty()) map.remove(value); >Atualização do vazio público (Int Key, Int OldValue, Int Value) < remove(key, oldValue); insert(key, value); >Inserção de vazio público (tecla int, int valor) < TIntHashSet set = map.get(value); if (set == null) map.put(value, set = new TIntHashSet(slidingMeanValue)); // else // slidingMeanValue = Math.max(5, (slidingMeanValue + set.size()) / 2); if (!set.add(key)) throw new IllegalStateException("use update if you want to update " + key); size++; >público int peekvalue () < if (size == 0) throw new IllegalStateException("collection is already empty!?"); Entrye = map.firstEntry(); if (e.getValue().isEmpty()) throw new IllegalStateException("internal set is already empty!?"); return map.firstEntry().getKey(); > público int peekkey () < if (size == 0) throw new IllegalStateException("collection is already empty!?"); TIntHashSet set = map.firstEntry().getValue(); if (set.isEmpty()) throw new IllegalStateException("internal set is already empty!?"); return set.iterator().next(); >Public Int Pollkey () < size--; if (size < 0) throw new IllegalStateException("collection is already empty!?"); Entrye = map.firstEntry(); TIntHashSet set = e.getValue(); TIntIterator iter = set.iterator(); if (set.isEmpty()) throw new IllegalStateException("internal set is already empty!?"); int val = iter.next(); iter.remove(); if (set.isEmpty()) map.remove(e.getKey()); return val; > Public int size () < return size; >público booleano isempty () < return size == 0; >public int getSlidingmeanValue () < return slidingMeanValue; >@Override public string tostring () < return "size " + size + " min=(" + peekKey() + "=>" + peekvalue () +") "; >>
Coleção classificada que permite duplicatas?
Postado 13 anos atrás
Número de fatias para enviar:
NOTA OPCIONAL ‘Agradece’:

Depois de uma breve sessão de solução de problemas, onde eu não conseguia entender por que meus olhos classificados com prioridade cuspiram seus elementos de uma maneira não classificada, li o javadoc e percebi que o iterador da prioridade é livre para retornar os elementos em qualquer ordem que ele goste basicamente. Em outras palavras, um priorityQueue não pode ser considerado uma coleção classificada. A razão pela qual um árvore não é uma opção é que eu preciso da coleção para permitir duplicatas. E eu quero que seja sempre classificado, sem usar coleções.organizar().
Não vou perguntar sobre as razões para esse comportamento do priorityQueue, já que a discussão aqui cobre isso muito bem. O que eu quero perguntar, no entanto, é se há alguma alternativa por aí que eu não conheço?
Então, para resumir, o que eu preciso é uma coleção que:
Existe uma coleção na API Java? Ou meus requisitos são muito absurdos? Quaisquer sugestões sobre a melhor e mais limpa maneira de resolver isso? E o desempenho não é uma preocupação para mim, pois no total a coleção nunca conterá mais do que dizer algumas centenas de elementos.
Marechal
Postagens: 77786
Postado 13 anos atrás
Número de fatias para enviar:
NOTA OPCIONAL ‘Agradece’:

Eu acho que você vai ter que escrever o seu próprio. O que você descreve é uma lista que leva a ordem natural, em vez de a ordem de inserção como sua ordem. Escreva um invólucro em torno de uma implementação da lista; Use uma pesquisa binária para encontrar o ponto de inserção no seu método add (e) e jogue AnunsupportEdOperException do método add (int, e). Observe que sua classe de wrapper terá que implementar a lista
Xerife
Postagens: 22739
Postado 13 anos atrás
Número de fatias para enviar:
NOTA OPCIONAL ‘Agradece’:

Campbell Ritchie escreveu: e jogue AnunsupportEdOperationException do método add (int, e). Observe sua classe de wrapper terá que implementar a interface da lista também.
A classe Wrapper não precisa implementar a lista; implementar a coleta. A lista adiciona três coisas que a coleção não tem:
1) um pedido especificado
2) indexação de elementos
3) Avançando para frente e para trás com o listiterator
Como você provavelmente não precisará de 2 ou 3, o invólucro precisa apenas implementar a coleção. Se você implementar a lista, estará dificultando mais para si mesmo, porque add (int, e) não é o único lugar em que você pode quebrar seu pedido classificado:
– Addall (Int, coleção) também permite adicionar em qualquer local (outro não suportadoPoperationException)
– set (int) permite que você substitua um elemento com qualquer outro elemento (outro não supportOperationException)
– Você precisa proteger a lista retornada por sublist também (você pode embrulhá -lo em uma nova instância de wrapper)
– Você precisa proteger seu listiterator, ele permite adicionar e substituir elementos também (você precisará de outra classe de wrapper)
E o que a lista fornece que você pode querer? get (int), indexOf (objeto), LastIndexOF (objeto), sublist (int, int). Mas você realmente precisa desses? A coleção não os possui, o conjunto não os possui, a fila (prioritária) não os possui.
SCJP 1.4 – SCJP 6 – SCWCD 5 – OCEEJBD 6 – OCEJPAD 6
Como fazer perguntas como responder a perguntas
Jimi Svedenholm
Mão do rancho
Postado 13 anos atrás
Número de fatias para enviar:
NOTA OPCIONAL ‘Agradece’:

Ok, tenho pensado um pouco mais e tenho algumas opções para escolher entre:
A opção 3 foi o meu primeiro pensamento, pois na minha mente isso deve ser muito fácil. Mas aconteceu que na verdade não era tão fácil. O que estou tentando classificar são objetos que implementam a organização da interface.Springframework.essencial.Ordenado. Já existe um comparador para objetos ordenados, no entanto, se o número de pedidos de ambos os objetos forem iguais, o comparador simplesmente retorna 0. Mas eu só quero que ele retorne 0 se os objetos realmente forem iguais. Porque haverá objetos ordenados que estão longe de serem iguais, mas com o mesmo número de ordem. Se o comparador retornar 0, então o Treeset considera esses objetos iguais.
O problema que estou tendo é decidir se o elemento E1 deve ser considerado menor ou maior do que o elemento E2 quando E1.getOrder () == E2.getOrder (). O que eu fiz agora, em uma implementação de teste, é:
Não tenho nenhum problema com as etapas um tanto complexas envolvidas, pois raramente descerá até E ou F Asuming Bom HashCode implementações. O problema que tenho é com o último passo, f. Porque quebra o contrato de comparável. Se uma comparação (e1, e2) se resume a f, o resultado é -1, mas o resultado de comparar (e2, e1) é * também * -1! Mesmo que isso quase nunca aconteça, isso * pode * acontecer.
O que vocês acham sobre este comparador? Parecia “apenas errado” quando escrevi, mas também não gosto da maneira como a organização.Springframework.essencial..igual a (O2)) a ser igual (retornando 0). Ou, quando penso sobre isso, meu * real * pev peve é a interface definida, que afirma claramente que considera os objetos iguais se o compare/compareto resultar em 0. O que deve fazer, se você me perguntar, é fazer uma chamada subsequente O1.equals (O2) e apenas considere -os como duplicados se retornar.
Mas como as implementações do conjunto não vão mudar tão cedo (ou não) a esse respeito, estou começando a me inclinar para a opção 2 acima, pois é mais simples do que a opção 1 e mais limpa do que a opção 3.
Marechal
Postagens: 77786
Postado 13 anos atrás
Número de fatias para enviar:
NOTA OPCIONAL ‘Agradece’:

Um comparador consistente com o Equals parece uma boa ideia, mas se você o usar com um árvore, não receberá nenhum duplicado.
Jimi Svedenholm
Mão do rancho
Postado 13 anos atrás
Número de fatias para enviar:
NOTA OPCIONAL ‘Agradece’:

Campbell Ritchie escreveu: Um comparador consistente com iguais parece uma boa ideia, mas se você o usar com um árvore, não receberá nenhuma duplicata.
Bem, existem dois tipos diferentes de igualdade/duplicidade aqui*. Um comparador considera dois elementos iguais se o “comparar cálculo” resultar em 0. E este é aparentemente o único igual a check que um conjunto de classificação faz. Mas a maneira como eu vejo, esta definição estreita de igual é inadequada. Os objetos são apenas “iguais” aos olhos do comparador, mas o conjunto de classificação deve usar apenas o comparador para Ordenação, Não é verificações de duplicidade. Se dois elementos tiverem um “compareto-resulto” de 0, mas onde igual () retorna false, então deve considerar isso como “não duplica, mas a ordem é irrelevante”.
Mas talvez alguém possa explicar o motivo por trás desse recurso falha no meu olho de classificação? Por que confia na comparação/compareto em relação à verificação de duplicidade sem fazer um apropriado equals () Verifique? Eu li o javadoc, mas tudo o que diz é que é assim que é implementado. Desempenho?
Então, para voltar ao meu post original. Quando falei sobre duplicatas, quis dizer duplicatas de acordo com o ponto de vista dos comparadores, e a razão pela qual usei essa definição foi que essa é a definição que o SortedSet usa. Não tenho motivos para colocar verdadeiro duplicatas (ou seja, onde o1.igual a (O2)) na coleção.
A solução que eu me inclino agora é criar minha própria coleção (ou seja, “Coleção de implementos”) que possui um ArrayList interno. Esta coleção simplesmente delega todas as chamadas de método para o ArrayList, mas antes que os métodos de ToArray e Iterator sejam chamados, eu classificar a Arraylist usando o comparador fornecido fornecido. Um resultado bônus disso em comparação com a “Opção 3” acima é que esta solução não tem problemas com elementos mutáveis em que o (s) campo (s) usado para comparação pode mudar depois que ela foi adicionada à coleção. Um conjunto de classificação provavelmente não seria capaz de lidar com esse cenário elegantemente.
Qualquer comentário sobre esta solução?
* Três se você considerar ‘==’, mas esse é apenas um caso especial de igual () ().
Como permitir duplicatas
А вззжжно, арра эpthэээрной пчччээлююююююяяяюю sentido аююэээth а а edade троной пчччч п п пччч пччччiliar.
Conjuntos classificados em Redis não permitiram duplicatas. Podemos permitir duplicatas em conjuntos classificados ?
—
Cumprimentos,
Manula thanTriwatte .
Graduação | Escola de Computação da Universidade de Colombo
Sri Lanka
Demis Bellot
нрочитано,
23 de fevereiro. ., 09:28:47 23.02.2011
Напота сощщение Averh
Ччоыы отиить а Está
Ччоыы переitivamente сощщщение, вйиfia
В ва на на на на н н н н н н n A н н в в в в в в в в в н н н н в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в nchOзн гugh mandes tound toun toun the touse toun the hour the house toun house house house toun the house house housel s) fosc).
Пожалоgua н н нощщение
Ччоыы пжалаcente
Поазать ихходное сощщение
А вззжжно, арра эpthэээрной пчччээлююююююяяяюю sentido аююэээth а а edade троной пчччч п п пччч пччччiliar.
– Redi. @GoogleGroups.com, Manula thanTriwatte
Tem certeza que não quer usar uma lista? Como um conjunto por definição não contém duplicatas.
—
Você recebeu esta mensagem porque está inscrito no grupo “Redis DB” do Google Group.
Para postar para este grupo, envie um e -mail para Redi. @GoogleGroups.com.
Para cancelar a inscrição deste grupo, envie email para Redis-DB+U. @GoogleGroups.com.
Para mais opções, visite este grupo em http: // grupos.Google.com/grupo/redis-db?hl = en.
Didier Spezia
нрочитано,
23 de fevereiro. 2011 г., 10:18:24 23.02.2011
Напота сощщение Averh
Ччоыы отиить а Está
Ччоыы переitivamente сощщщение, вйиfia
В ва на на на на н н н н н н n A н н в в в в в в в в в н н н н в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в nchOзн гugh mandes tound toun toun the touse toun the hour the house toun house house house toun the house house housel s) fosc).
Пожалоgua н н нощщение
Ччоыы пжалаcente
Поазать ихходное сощщение
А вззжжно, арра эpthэээрной пчччээлююююююяяяюю sentido аююэээth а а edade троной пчччч п п пччч пччччiliar.
Se você está tentando construir uma indexação ordenada e não exclusiva
estrutura de dados, e está realmente presa com Redis, você pode
quero dar uma olhada no banco de dados de alquimia de Jak Sprats.
Permanece principalmente compatível com redis, mas pode se encaixar no seu
Precisa melhor devido ao seu suporte para índices BTREE na memória.
Se você precisa discutir sobre isso, use o
grupo dedicado.
Em 23 Fév, 09:25, Manula thanTriwatte
escreveu:
Will Maier
нрочитано,
23 de fevereiro. 2011 г., .02.2011
Напота сощщение Averh
Ччоыы отиить а Está
Ччоыы переitivamente сощщщение, вйиfia
В ва на на на на н н н н н н n A н н в в в в в в в в в н н н н в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в в nchOзн гugh mandes tound toun toun the touse toun the hour the house toun house house house toun the house house housel s) fosc).
Пожалоgua н н нощщение
Ччоыы пжалаcente
Поазать ихходное сощщение
А вззжжно, арра эpthэээрной пчччээлююююююяяяюю sentido аююэээth а а edade троной пчччч п п пччч пччччiliar.
– Redi. @GoogleGroups.com
Em quarta -feira, 23 de fevereiro de 2011 às 13:55:16 +0530, Manula thanTriwatte escreveu:
> Conjuntos classificados em Redis não permitiram duplicatas. Podemos permitir duplicatas em
> Conjuntos classificados ?
O truque usual envolve compor valores no conjunto usando a pontuação. Por tempo
dados da série, onde a pontuação é um registro de data e hora e o valor é um número, este
deve ser suficiente para preservar a única coisa de repetir os valores.
Por exemplo:
Zadd Time.Série 1298460338 “1298460348 9”
Zadd Time.Série 1298460348 “1298460348 10”
Zadd Time.Série 1298460358 “1298460358 11”
Seu cliente precisaria dividir os valores que recebe da Redis em ordem
Para obter o valor real.