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}
A
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()
A
Ataxexe
Use o HashSet (como o entanglement disse).
D
DaniloAndrade
caramba, to gostando da brincadeira, rsrsr
A
Algebra
Cara show de bola.
de 153875 para 1597 milissegundos.
bota otimização nisso!
Valew galera alto nível.
Abraços
D
DaniloAndrade
agora tem que pagar o cafezinho, rsrs
A
Algebra
depois de uma otimização destas merece até um churrasco \o/
D
DaniloAndrade
é, mas isso foi resultado da junção das ideias de todos que postaram
A
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).
A
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!
S
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” ?
A
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??
L
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.
D
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.
D
DaniloAndrade
parabéns pelo nosso trabalho em equipe.
que venham outros desafios como esse, eu particularmente gostei muito da brincadeira
rsrsr
G
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
L
lele_vader
Qualquer milissegundo com milhões de registros significaria uma melhoria significativa imagino eu.