<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: Benchmark TreeSet x HashSet</title>
	<atom:link href="http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/feed/" rel="self" type="application/rss+xml" />
	<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/</link>
	<description>Linux, Open-source, Programação e Produtividade</description>
	<pubDate>Thu, 20 Nov 2008 10:16:51 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
		<item>
		<title>By: Jonas Abreu</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-22415</link>
		<dc:creator>Jonas Abreu</dc:creator>
		<pubDate>Sun, 23 Mar 2008 15:49:41 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-22415</guid>
		<description>Olá Carlos, 

realmente o link estava errado (copiei o de complexidade...). Acabei de corrigí-lo.

Quanto a função de hashing, é necessário um bom conhecimento teórico para fazer uma boa (coisa que muitos programadores não tem). Por isso fiz o benchmark em cima da implementação da SUN (quase todo mundo vai usar a dela sem nem pensar duas vezes).

Obrigado pela visita!</description>
		<content:encoded><![CDATA[<p>Olá Carlos, </p>
<p>realmente o link estava errado (copiei o de complexidade&#8230;). Acabei de corrigí-lo.</p>
<p>Quanto a função de hashing, é necessário um bom conhecimento teórico para fazer uma boa (coisa que muitos programadores não tem). Por isso fiz o benchmark em cima da implementação da SUN (quase todo mundo vai usar a dela sem nem pensar duas vezes).</p>
<p>Obrigado pela visita!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Carlos Caldas</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-22397</link>
		<dc:creator>Carlos Caldas</dc:creator>
		<pubDate>Sun, 23 Mar 2008 12:08:42 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-22397</guid>
		<description>Achei o artigo muito bom. Porém gostaria de destacar dois pontos:
1-Não achei informações sobre Árvore Rubro Negra no link citado
2-A função Hash feita pela SUN pode ser boa, mas não necessariamente vai ser boa para os dados utilizados por você. A qualidade de uma função Hash depende dos dados armazenados, entao ninguem melhor do que o programador para saber se uma função é ótima para os seus tipos de dados.</description>
		<content:encoded><![CDATA[<p>Achei o artigo muito bom. Porém gostaria de destacar dois pontos:<br />
1-Não achei informações sobre Árvore Rubro Negra no link citado<br />
2-A função Hash feita pela SUN pode ser boa, mas não necessariamente vai ser boa para os dados utilizados por você. A qualidade de uma função Hash depende dos dados armazenados, entao ninguem melhor do que o programador para saber se uma função é ótima para os seus tipos de dados.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonas Abreu</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-19002</link>
		<dc:creator>Jonas Abreu</dc:creator>
		<pubDate>Sat, 08 Mar 2008 15:35:00 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-19002</guid>
		<description>Acho que só até certo ponto luiz. Em termos práticos, se temos uma função que consome tempo proporcional a 1000000 e outra que é proporcional a n, a linear ainda vai funcionar muito melhor na prática (estou pensando em um caso em que você trabalha com poucos itens - menos de 1000, o que é comum).

Embora a teoria nos diga que a a constante seja melhor (O(1) &lt; O(n)), na práticao que acontece é que para quase todos os casos a linear produz um resultado muito mais rápido. 

Então em um ambiente com pouca memória (que eleve ainda mais o custo de uma realocação) a árvore vai ser mais performática que o hashset.</description>
		<content:encoded><![CDATA[<p>Acho que só até certo ponto luiz. Em termos práticos, se temos uma função que consome tempo proporcional a 1000000 e outra que é proporcional a n, a linear ainda vai funcionar muito melhor na prática (estou pensando em um caso em que você trabalha com poucos itens - menos de 1000, o que é comum).</p>
<p>Embora a teoria nos diga que a a constante seja melhor (O(1) < O(n)), na práticao que acontece é que para quase todos os casos a linear produz um resultado muito mais rápido. </p>
<p>Então em um ambiente com pouca memória (que eleve ainda mais o custo de uma realocação) a árvore vai ser mais performática que o hashset.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Luiz</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-18795</link>
		<dc:creator>Luiz</dc:creator>
		<pubDate>Fri, 07 Mar 2008 16:42:20 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-18795</guid>
		<description>Um fato bastante importante que não foi observado é que, assintoticamente, mesmo com as realocações da tabela, o HashSet foi melhor do que o TreeSet. Logo, a teoria confirma a prática, sim.</description>
		<content:encoded><![CDATA[<p>Um fato bastante importante que não foi observado é que, assintoticamente, mesmo com as realocações da tabela, o HashSet foi melhor do que o TreeSet. Logo, a teoria confirma a prática, sim.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonas Abreu</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5725</link>
		<dc:creator>Jonas Abreu</dc:creator>
		<pubDate>Thu, 11 Oct 2007 17:12:47 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5725</guid>
		<description>Acabei de olhar na api do Java 5 que a função hashCode() de Object costuma devolver o endereço na memória do objeto como seu código de hashing. Não consigo afirmar que essa seja uma boa implementação (não acho bom estar tão associado à porção de memória onde o programa está rodando) mas também não encontro um argumento forte contra tal implementação. 

O link na api é esse: &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode()" target="_blank" rel="nofollow"&gt;http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode()&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>Acabei de olhar na api do Java 5 que a função hashCode() de Object costuma devolver o endereço na memória do objeto como seu código de hashing. Não consigo afirmar que essa seja uma boa implementação (não acho bom estar tão associado à porção de memória onde o programa está rodando) mas também não encontro um argumento forte contra tal implementação. </p>
<p>O link na api é esse: <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode()" target="_blank" rel="nofollow"></a><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode" rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode</a>()</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonas Abreu</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5687</link>
		<dc:creator>Jonas Abreu</dc:creator>
		<pubDate>Thu, 11 Oct 2007 02:30:23 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5687</guid>
		<description>Olá Akaihen,

O Hash do utorrent é um pouco diferente do que eu falei aqui no post. Lá ele pode significar duas coisas: pode ser informação sobre onde estão (na web) os pedaços de arquivos que você está baixando ou ele é o tipo de função (função de hashing) que é aplicado em cada pedaço que você recebe pra saber se o pedaço está certo oui se alguns bits estão alterados.

Aqui no post, Hash é diminutivo de HashTable, que é uma estrutura de dados que possui acesso, gravação e remoção muito rápidos. Se estiver interessado de uma olhada nos links que estão no post. Mais pra frente vou escrever um pouco sobre estruturas de dados aqui.

Paulo, 
Obrigado pela dica.Dei uma olhada e parece bem interessante. Vou ver se pego o fonte para dar uma olhada.

Bruno, 
Entendi o que você disse sobre manter a ordem dos elementos (faz sentido afinal, se você garante algo a mais, deve existir algum custo a mais também) mas a grande diferença dessas estruturas de dados é a disposição dos dados. O Hash possui acesso quase direto ao elemento (um hashing perfeito possui) usando uma função que devolve o lugar onde o item deve estar. A árvore, ao contrario, determina uma disposição entre os elemento, de forma que o único jeito de você chegar em um elemento é passando pelos outros. Esse caminho extra que existe na árvore é que causa essa diferença de complexidade (tempo gasto).

Quanto à função de hashing, no código que você postou você usou a hashCode que está implementada em Object. É essa função quem está primariamente determinando o código de hashing do seu item e nela está o segredo da velocidade do Hash. Quando eu encontrar uma boa implementação dela eu posto aqui no blog.

Muito obrigado a todos pelas visitas.</description>
		<content:encoded><![CDATA[<p>Olá Akaihen,</p>
<p>O Hash do utorrent é um pouco diferente do que eu falei aqui no post. Lá ele pode significar duas coisas: pode ser informação sobre onde estão (na web) os pedaços de arquivos que você está baixando ou ele é o tipo de função (função de hashing) que é aplicado em cada pedaço que você recebe pra saber se o pedaço está certo oui se alguns bits estão alterados.</p>
<p>Aqui no post, Hash é diminutivo de HashTable, que é uma estrutura de dados que possui acesso, gravação e remoção muito rápidos. Se estiver interessado de uma olhada nos links que estão no post. Mais pra frente vou escrever um pouco sobre estruturas de dados aqui.</p>
<p>Paulo,<br />
Obrigado pela dica.Dei uma olhada e parece bem interessante. Vou ver se pego o fonte para dar uma olhada.</p>
<p>Bruno,<br />
Entendi o que você disse sobre manter a ordem dos elementos (faz sentido afinal, se você garante algo a mais, deve existir algum custo a mais também) mas a grande diferença dessas estruturas de dados é a disposição dos dados. O Hash possui acesso quase direto ao elemento (um hashing perfeito possui) usando uma função que devolve o lugar onde o item deve estar. A árvore, ao contrario, determina uma disposição entre os elemento, de forma que o único jeito de você chegar em um elemento é passando pelos outros. Esse caminho extra que existe na árvore é que causa essa diferença de complexidade (tempo gasto).</p>
<p>Quanto à função de hashing, no código que você postou você usou a hashCode que está implementada em Object. É essa função quem está primariamente determinando o código de hashing do seu item e nela está o segredo da velocidade do Hash. Quando eu encontrar uma boa implementação dela eu posto aqui no blog.</p>
<p>Muito obrigado a todos pelas visitas.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bruno Laturner</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5570</link>
		<dc:creator>Bruno Laturner</dc:creator>
		<pubDate>Mon, 08 Oct 2007 21:47:27 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5570</guid>
		<description>O WordPress comeu parte do que postei acima...

Aqui tem o hash que o GNU implementa no GCJ:

http://www.google.com/codesearch?hl=pt-BR&#38;q= HashMap.java show:ukwwUY-mhAE:DRmxMbjifok:HoPTo2E50cc&#38;sa=N&#38;cd=7&#38;ct=rc&#38;cs_p=http://ftp2.at.freebsd.org/pub/FreeBSD/distfiles/gcc-2.97.tar.gz&#38;cs_f=gcc/libjava/java/util/HashMap.java#first

mas fiquem avisados que a implementação da Sun é _muito_ diferente.</description>
		<content:encoded><![CDATA[<p>O WordPress comeu parte do que postei acima&#8230;</p>
<p>Aqui tem o hash que o GNU implementa no GCJ:</p>
<p><a href="http://www.google.com/codesearch?hl=pt-BR&amp;q=" rel="nofollow">http://www.google.com/codesearch?hl=pt-BR&amp;q=</a> HashMap.java show:ukwwUY-mhAE:DRmxMbjifok:HoPTo2E50cc&amp;sa=N&amp;cd=7&amp;ct=rc&amp;cs_p=http://ftp2.at.freebsd.org/pub/FreeBSD/distfiles/gcc-2.97.tar.gz&amp;cs_f=gcc/libjava/java/util/HashMap.java#first</p>
<p>mas fiquem avisados que a implementação da Sun é _muito_ diferente.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bruno Laturner</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5569</link>
		<dc:creator>Bruno Laturner</dc:creator>
		<pubDate>Mon, 08 Oct 2007 21:38:37 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5569</guid>
		<description>A diferença brutal deve-se ao fato que o TreeSet mantém a árvore ordenada, enquanto o HashSet não garante que a ordem se manterá constante com o tempo.

Tudo isso é muito bem explicado no JavaDoc dos mesmos.

E respondendo a dúvida sobre o função hash implementada nas classes Hash do Java:

    static int hash(Object x) {
        int h = x.hashCode();

        h  = ~(h &#62;&#62; 14);
        h  =  (h &#62;&#62; 10);
        return h;
    }</description>
		<content:encoded><![CDATA[<p>A diferença brutal deve-se ao fato que o TreeSet mantém a árvore ordenada, enquanto o HashSet não garante que a ordem se manterá constante com o tempo.</p>
<p>Tudo isso é muito bem explicado no JavaDoc dos mesmos.</p>
<p>E respondendo a dúvida sobre o função hash implementada nas classes Hash do Java:</p>
<p>    static int hash(Object x) {<br />
        int h = x.hashCode();</p>
<p>        h  = ~(h &gt;&gt; 14);<br />
        h  =  (h &gt;&gt; 10);<br />
        return h;<br />
    }</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paulo Silveira</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5549</link>
		<dc:creator>Paulo Silveira</dc:creator>
		<pubDate>Mon, 08 Oct 2007 05:27:44 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5549</guid>
		<description>Oi Jonas

Algumas pessoas implementaram as Collections do java.util de maneira a evitar o rehashing gigante em tabelas de hash ou a realocacao de arrays no caso de ArrayList e afins. O objetivo é ter um tempo gasto médio, em vez de picos de consumo de CPU (fazendo nossa analise ser amortizada).

Uma dessas apis é até usada pela NASA, pois serve aos propositos de algumas aplicacoes realtime, nao estressa o garbagte collector e voce tem melhores previsoes de consumo de tempo. Essa é a Javolution:

http://javolution.org/</description>
		<content:encoded><![CDATA[<p>Oi Jonas</p>
<p>Algumas pessoas implementaram as Collections do java.util de maneira a evitar o rehashing gigante em tabelas de hash ou a realocacao de arrays no caso de ArrayList e afins. O objetivo é ter um tempo gasto médio, em vez de picos de consumo de CPU (fazendo nossa analise ser amortizada).</p>
<p>Uma dessas apis é até usada pela NASA, pois serve aos propositos de algumas aplicacoes realtime, nao estressa o garbagte collector e voce tem melhores previsoes de consumo de tempo. Essa é a Javolution:</p>
<p><a href="http://javolution.org/" rel="nofollow">http://javolution.org/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Akaihen</title>
		<link>http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5547</link>
		<dc:creator>Akaihen</dc:creator>
		<pubDate>Mon, 08 Oct 2007 02:38:58 +0000</pubDate>
		<guid isPermaLink="false">http://vidageek.net/2007/10/07/benchmark-treeset-x-hashset/#comment-5547</guid>
		<description>Dae meu! Po curti teu blog e também porque to começando em java to procurando conhecer pessoas da area para me engajar. uma pergunta que é hash? porque eu sei q ue eu uso isso no utorrent mas eu não nada disso ai não. outra coisa vou por vc como amigo la no meu blog valeu.!</description>
		<content:encoded><![CDATA[<p>Dae meu! Po curti teu blog e também porque to começando em java to procurando conhecer pessoas da area para me engajar. uma pergunta que é hash? porque eu sei q ue eu uso isso no utorrent mas eu não nada disso ai não. outra coisa vou por vc como amigo la no meu blog valeu.!</p>
]]></content:encoded>
	</item>
</channel>
</rss>
