| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 15:06:59
|
Marcio Duran
GUJ Master
![[Avatar]](/images/avatar/df0e19d29493ef2136fc3e2fc029c054.jpg)
Membro desde: 23/01/2008 11:14:35
Mensagens: 1905
Offline
|
Iterating collection:
Iterating collection using all three types of classes ,ArrayList ,Vector and LinkedList gives similar performance because they need not do any extra work they simply iterate one by one. You can use any Iterator . But using ListIterator gives more flexibility than Iterator and Enumeration. You can traverse both sides
This message was edited 1 time. Last update was at 30/07/2009 15:08:03
|
Consultor Open Source
Comunidade JavaLivros
Twitter Comunidade JavaLivros
Novo Blog do MiddleHeaven |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 16:23:52
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline
|
sergiotaborda wrote:
Ou seja, para add(object) LinkedList é sempre mais eficiente.
Hein? Parece ate que voce nao esta lendo meus comentarios. Se os dois sao tempo constante (amortizado), a eficiencia computacional é a mesma!! Se voce for medir em milisegundos, a ArrayList ganha em todos os casos (relembrando: metodo add adicionando no final). Voce pode rodar os tests por si mesmo (voce rodou?), ou ver inumeros que tem na internet se nao esta convencido:
http://onjava.com/pub/a/onjava/2001/05/30/optimization.html
sergiotaborda wrote:
Só para completar :
Esse link que voce citou, o autor mostra que nao conhece muito de analise de algoritmos, pois small inserts na LinkedList tambem é O(1) (e sob hipotese alguma O(logn) como ele chuta e todos nos sabemos que nao é assim). Lista ligada clássica com inserções de O(logn)...? Nao preciso nem falar nada... Cuidado ao ler qualquer coisa por aí.
sergiotaborda wrote:
ArrayList é mais rápido (para poucos elementos) , mas não tem melhor performance. (Se ArrayList fosse melhor que LinkedList sempre, LinkedList seria inutil)
De novo: nao! Sou um cara que gosta bastante teoria, e sei que o tempo cronometrado nao é só o que import, mas aqui nos dois critério ArrayList ou ganha ou empata! Então o que é "nao tem melhor perfomance"? Qual é a sua diferenca para mais rapido e melhor performance? Computacionalmente falando, os dois sao empatados (pela analise do algoritmo, os dois sao O(1) para 1 elemento, amortizado, que é o que vale no fim das contas). Por tempo de relogio, a ArrayList ganha sempre para uma quantidade razoavel de elementos (e acima disso, como no link que passei). Entao nao entendo a insistencia na frase "arraylist nao tem melhor performance" (tem melhor performance em tempo, e a mesma computacionalmente, para o metodo add.
Sobre a inutilidade de LinkedLIst, estamos aqui falando apenas do metodo add, que adiciona no final. LinkedList tem sua utilidade para adicionar no inicio, remover do inicio, e poderia ter para remover/adicionar no meio se voce pudesse manter referencia para os Nodes internos (como ocorre para o .remove() dentro do iterator de LinkedList, que roda em O(1), e na ArrayList em O(n)).
This message was edited 1 time. Last update was at 30/07/2009 16:24:30
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 16:27:55
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Paulo Silveira wrote:
sergiotaborda wrote:
Ou seja, para add(object) LinkedList é sempre mais eficiente.
Hein? Parece ate que voce nao esta lendo meus comentarios. Se os dois sao tempo constante ( amortizado), a eficiencia computacional é a mesma!!
Só que não são os dois. Apenas o arraylist é amortizado.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 16:45:49
|
Sergio Lopes
Moderador
![[Avatar]](/images/avatar/8232e119d8f59aa83050a741631803a6.jpg)
Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline
|
sergio, naquele link que vc passou o cara só fala asneira... alem do fato de um linkedlist nao ter nada de logn, ele anda fala:
Ultimately, the average cost of adding to an ArrayList, as Sun states, is O(n).
o custo MEDIO é O(N)? mto pelo contrario, o custo medio é O(1), amortizado.
o que acontece é que alguma determinada insercao vai ter custo N, mas nao o custo medio de todas as insercoes.
como o paulo falou, é preciso separar a eficiencia computacional dos benchmarks por ai.
nos benchmarks, apos tudo que falaram, espero que ja esteja convencido de que o arraylist eh mais rapido no add.
agora computacionalmente falando, é preciso entender direito o que significa custo amortizado para se entender pq ArrayList#add é O(1) e LinkedList#add tambem é O(1).
o detalhe do arraylist é que ele demora 1 passo para adicionar N-1 elementos. ao adicionar o N-esimo ai sim vamos ter um add que demora N passos. mas como o paulo falou, o crescimento do espaco do arraylist eh exponencial, o q faz com que aquele custo de N passos na N-enesima adicao seja amortizado nas N insercoes. isso faz com que o custo amortizado do add no fim seja O(1), mesmo que algumas insercoes demorem N passos
ou seja, computacionalmente eh o mesmo custo que o linkedlist e na pratica eh mais rapido mesmo
|
Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 16:54:39
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline
|
Sergio Lopes wrote:
ou seja, computacionalmente eh o mesmo custo que o linkedlist e na pratica eh mais rapido mesmo
pois é, ja falei O(n) vezes isso nessa thread , mas...
Taborda, consulte o Introduction to Algorithms (aka CLR/CLRS), do Cormen e galerinha do MIT, e la voce vai ver que o tempo é o mesmo, e que a linkedlist nao ganha, diferente do que voce afirmou todas as vezes aqui. So nao vale citar quem fala que insercao em linked list classica é O(logn)....
This message was edited 1 time. Last update was at 30/07/2009 16:55:51
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 17:45:04
|
Marcio Duran
GUJ Master
![[Avatar]](/images/avatar/df0e19d29493ef2136fc3e2fc029c054.jpg)
Membro desde: 23/01/2008 11:14:35
Mensagens: 1905
Offline
|
é. Ao executar este programa, o resultado deve ser algo parecido com isto: Resultado tempo gasto ArrayList = 4859 Resultado tempo gasto LinkedList = 125
This message was edited 1 time. Last update was at 30/07/2009 20:58:26
|
Consultor Open Source
Comunidade JavaLivros
Twitter Comunidade JavaLivros
Novo Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 18:04:38
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline
|
Sim duran, como todos falaram aqui, e ninguem discordou, a LinkedList é bem mair rapida que a ArrayList para se adicionar no comeco. Ela é O(1), e a ArrayList é O(n) (poderia ser O(1) se tivessem implementado como lista circular, uma pena). Se voce dobrar o tamanho do seu teste, vera que essa diferenca nao ficara so de 40x mais lenta, vai ficar por volta de 80x mais lenta, 160x mais lenta, etc... uma relacao quadratica.
Alias, o que voce fez é um exercicio do nosso FJ11, mostramos isso pros alunos, desde o basico, pra saber que decidir a implementacao pode impactar bastante numa decisao
This message was edited 1 time. Last update was at 30/07/2009 18:08:42
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 18:57:00
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
Ou seja sergiotaborda está claramente errado.
Pode admitir. Errar é humano, não precisa se envergonhar. O pior é querer ficar insistindo no erro.
Duran, o seu teste insere no começo: lista.add(0, elemento). A discussão é sobre a inserção no fim da lista: lista.add(elemento).
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 19:09:20
|
Marcio Duran
GUJ Master
![[Avatar]](/images/avatar/df0e19d29493ef2136fc3e2fc029c054.jpg)
Membro desde: 23/01/2008 11:14:35
Mensagens: 1905
Offline
|
Fabio Kung wrote:Ou seja sergiotaborda está claramente errado. Pode admitir. Errar é humano, não precisa se envergonhar. O pior é querer ficar insistindo no erro. Duran, o seu teste insere no começo: lista.add(0, elemento). A discussão é sobre a inserção no fim da lista: lista.add(elemento).
é. Estamos discutindo o performático em vista de fatores que combinem melhor resultado, não se pode limitar questão de perfomance nessa ótica de uma situação isolada referente ao algoritmo, é como eu lhe pergunta-se poderia usar ArryList em multi-thread, se sim, é mais adequado do que LinkedList ? Poderia fazer a demonstração nessa implementação.
This message was edited 4 times. Last update was at 30/07/2009 20:58:42
|
Consultor Open Source
Comunidade JavaLivros
Twitter Comunidade JavaLivros
Novo Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 19:12:37
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
Marcio Duran wrote:Estamos discutindo o performático em vista de fatores que combinem melhor resultado, não se pode limitar questão de perfomance nessa ótica de uma situação isolada referente ao algoritmo
Tem razão. E já foi dito nesse tópico algumas vezes que a melhor escolha vai depender do uso e necessidade.
Mas nesta discussão específica o ponto foi a afirmação de LinkedList ser "mais performático" para a operação add(elemento). O que claramente não é verdade, como mostrado pelo Paulo.
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 19:20:05
|
Marcio Duran
GUJ Master
![[Avatar]](/images/avatar/df0e19d29493ef2136fc3e2fc029c054.jpg)
Membro desde: 23/01/2008 11:14:35
Mensagens: 1905
Offline
|
Fabio Kung wrote:
Tem razão. E já foi dito nesse tópico algumas vezes que a melhor escolha vai depender do uso e necessidade.
Veja aqui você concorda.
Mas nesta discussão específica o ponto foi a afirmação de LinkedList ser "mais performático" para a operação add(elemento). O que claramente não é verdade, como mostrado pelo Paulo.
E aqui você não prova a Versatilidade ao proposito de coleção e seu uso, não podemos falar de Objeto isoladamente sua funcionalidade e proposito nunca será para um termo específico mas no que faz ser o sentido de o que é objeto "estado e comportamento".Ainda estou esperando a implementação para multi-Thread em ArrayList e em que contexto agora você vai querer defender sua tese.
This message was edited 2 times. Last update was at 30/07/2009 19:40:07
|
Consultor Open Source
Comunidade JavaLivros
Twitter Comunidade JavaLivros
Novo Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 19:48:38
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
Marcio Duran wrote:Ainda estou esperando a implementação para multi-Thread em ArrayList
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CopyOnWriteArrayList.html
Desculpa, mas o resto não consegui entender.
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 20:44:03
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline
|
Marcio Duran wrote:
Fabio Kung wrote: Duran, o seu teste insere no começo: lista.add(0, elemento). A discussão é sobre a inserção no fim da lista: lista.add(elemento).
é Estamos discutindo o performático em vista de fatores que combinem melhor resultado, não se pode limitar questão de perfomance
Sem duvida, é muito importante tambem discutirmos os outros metodos. O kung so quis afirmar que, como foi falado diversas vezes nessa thread, para o método add() que adiciona no final da lista, a ArrayList possui melhor performance que a LinkedList na prática e eficiência computacional igual na teoria (análise amortizada de pior caso). Ai voce postou uma comparacao de outro metodo, e pessoas poderiam ficar confusas achando que voce estaria falando do mesmo caso (metodo add no final).
This message was edited 1 time. Last update was at 30/07/2009 20:59:02
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 20:49:00
|
Marcio Duran
GUJ Master
![[Avatar]](/images/avatar/df0e19d29493ef2136fc3e2fc029c054.jpg)
Membro desde: 23/01/2008 11:14:35
Mensagens: 1905
Offline
|
é "Perdão eu realmente não fui tão claro !!!" Tese por algoritmo ou ao que estamos querendo dizer "Arquitetura e Design de Software" Uma visão sobre a plataforma Java Essa a minha versão para LinkedList situação Multi-Theard Desculpa, não entendi o seu exemplo.
This message was edited 2 times. Last update was at 30/07/2009 21:01:19
|
Consultor Open Source
Comunidade JavaLivros
Twitter Comunidade JavaLivros
Novo Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2009 21:10:02
|
Marcio Duran
GUJ Master
![[Avatar]](/images/avatar/df0e19d29493ef2136fc3e2fc029c054.jpg)
Membro desde: 23/01/2008 11:14:35
Mensagens: 1905
Offline
|
Paulo Silveira wrote:
Marcio Duran wrote:
Fabio Kung wrote:
Duran, o seu teste insere no começo: lista.add(0, elemento). A discussão é sobre a inserção no fim da lista: lista.add(elemento).
é
Estamos discutindo o performático em vista de fatores que combinem melhor resultado, não se pode limitar questão de perfomance
Sem duvida, é muito importante tambem discutirmos os outros metodos. O kung so quis afirmar que, como foi falado diversas vezes nessa thread, para o método add() que adiciona no final da lista, a ArrayList possui melhor performance que a LinkedList na prática e eficiência computacional igual na teoria (análise amortizada de pior caso). Ai voce postou uma comparacao de outro metodo, e pessoas poderiam ficar confusas achando que voce estaria falando do mesmo caso (metodo add no final).
"Trecho de sua Obra".
"Receber ArrayList como argumento faz sentido em pouquíssimos casos: raramente precisamos que uma coleção seja tão específica assim. Receber aqui um List provavelmente basta para o nosso método, e permite que o código invocador passe outras coleções como argumento. Podemos ir além, e receber Collection ou ainda Iterable, caso nossa necessidade seja apenas percorrer a lista"
O assunto tem que decorrer sobre o que é arquitetura e ao que percebemos a usar, e não de forma especifica o determinado algoritmo mas o que se combina e faz sentido o seu melhor uso pela a coleção em pró até de um Design Pattern em função a gerencia de objetos.
Vamos entender Coleção em vista de arquitetura e não especificar o que tende a ser outras interpretações ao seu melhor uso.
This message was edited 1 time. Last update was at 30/07/2009 21:11:28
|
Consultor Open Source
Comunidade JavaLivros
Twitter Comunidade JavaLivros
Novo Blog do MiddleHeaven |
|
|
 |
|
|