to usando esse código para transformar uma lista de texto em uma lista de palavras… porém quando a lista de texto é muito grande esse código é ruim acho que a complexidade dele é maior que n^2. Alguem conhece alguma maneira de otimizar isso?
for(intm=0;m<list.size();m++){lista.addAll(Arrays.asList(list.get(m).replaceAll("[,;.]","").split("\\s+")));// com o regex \\s+ fica melhor pois pode ter mais de um espaço entre palavras}
Algebra
entanglement:
Troque seu ArrayList por um TreeSet ou HashSet().
Seu código ficaria mais ou menos assim:
for(intm=0;m<list.size();m++){lista.addAll(Arrays.asList(list.get(m).replaceAll("[,;.]","").split("\\s+")));// com o regex \\s+ fica melhor pois pode ter mais de um espaço entre palavras}
for(intm=0;m<list.size();m++){lista.addAll(Arrays.asList(list.get(m).replaceAll("[,;.]","").split("\\s+")));// com o regex \\s+ fica melhor pois pode ter mais de um espaço entre palavras}
ficou muito mais rápido danilo:
antes
153875
depois
1597
mas o problema é que ele adiciona repetidos
facil de resolver troca o List lista = new ArrayList();
pelo Set lista = new HashSet()
Ataxexe
Use o HashSet (como o entanglement disse).
DaniloAndrade
caramba, to gostando da brincadeira, rsrsr
Algebra
Cara show de bola.
de 153875 para 1597 milissegundos.
bota otimização nisso!
Valew galera alto nível.
Abraços
DaniloAndrade
agora tem que pagar o cafezinho, rsrs
Algebra
depois de uma otimização destas merece até um churrasco \o/
DaniloAndrade
é, mas isso foi resultado da junção das ideias de todos que postaram
Ataxexe
Outro ponto:
em vez de
for(intm=0; m < list.size(); m++ ){
use
for(Stringstring:list){
assim evita o list.size() e o list.get(), que podem reduzir o desempenho (dependendo da implementação da lista).
Algebra
Ataxexe:
Outro ponto:
em vez de
for(intm=0; m < list.size(); m++ ){
use
for(Stringstring:list){
assim evita o list.size() e o list.get(), que podem reduzir o desempenho (dependendo da implementação da lista).
Ponto positivo pra vc Ataxexe. consegui melhorar ainda mais a média.
de 1597 para 1180 ms.
A principio a diferença parece pequena, mas para um grande volume de informações isso faz muita diferença!
sergiotaborda
Algebra:
Ataxexe:
Outro ponto:
em vez de
for(intm=0; m < list.size(); m++ ){
use
for(Stringstring:list){
assim evita o list.size() e o list.get(), que podem reduzir o desempenho (dependendo da implementação da lista).
Ponto positivo pra vc Ataxexe. consegui melhorar ainda mais a média.
de 1597 para 1180 ms.
A principio a diferença parece pequena, mas para um grande volume de informações isso faz muita diferença!
Vc consegue ir mais longe tirando esse for. De onde vêm essa lista ? Porque vc não recebe o texto em um único String e recebe “frases” ?
Algebra
sergiotaborda:
Algebra:
Ataxexe:
Outro ponto:
em vez de
for(intm=0; m < list.size(); m++ ){
use
for(Stringstring:list){
assim evita o list.size() e o list.get(), que podem reduzir o desempenho (dependendo da implementação da lista).
Ponto positivo pra vc Ataxexe. consegui melhorar ainda mais a média.
de 1597 para 1180 ms.
A principio a diferença parece pequena, mas para um grande volume de informações isso faz muita diferença!
Vc consegue ir mais longe tirando esse for. De onde vêm essa lista ? Porque vc não recebe o texto em um único String e recebe “frases” ?
Essa lista vem do meu controller no grails
deflista=Documento.getAll().texto
Eu pego um campo chamado texto da minha classe documento.
Não consigo ver otimização neste ponto, dá pra fazer??
lele_vader
Muito interessante esse tópico.
Ajuda a pensar em soluções mais eficazes para um determinado problemas.
Seria uma idéia ter mais tópicos como esses.
DaniloAndrade
lele_vader:
Muito interessante esse tópico.
Ajuda a pensar em soluções mais eficazes para um determinado problemas.
Seria uma idéia ter mais tópicos como esses.
concordo em gênero numero e grau.
por mim pode ter vários e sempre que possível irei participar
J
juliocbq
Essa sua solução foi muito boa realmente. Algoritmos com laços aninhados são ineficientes por causa da complexidade n log^n. Da maneira que fez deixou ele linear que é como toda solução deve ficar. Muito bem.
DaniloAndrade
parabéns pelo nosso trabalho em equipe.
que venham outros desafios como esse, eu particularmente gostei muito da brincadeira
rsrsr
gomesrod
Pensei aqui em uma coisa que teoricamente daria mais uma melhorada, que é deixar os regex pré-compilados ao invés de criá-los a cada chamada de split() e replaceAll().
// Antes do loop maior, pode até cachear em um static final na classe porque não muda nunca.PatternsplitPattern=Pattern.compile("\\s+");PatternremoveSpecialCharsPattern=Pattern.compile("[,;.]");// Substituirfrase.replaceAll("[,;.]","").split("\\s+"))// porsplitPattern.split(removeSpecialCharsPattern.matcher(frase).replaceAll("")))
Mas em um teste que fiz aqui não diminuiu muito
lele_vader
Qualquer milissegundo com milhões de registros significaria uma melhoria significativa imagino eu.