Iniciandome en el manejo de tablas HASH

User avatar
MarioG
Posts: 1356
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Post by MarioG »

Pues entonces te sugiero probar así que seguro es más rapido

Code: Select all

for each hItems in aHash
   // en realidad deberías investigar  que devuelve hItems, el nombre lo puse al hazar aunque no lo uso
   cMatricula:=HGetKeyAt( aHash,HB_EnumIndex() )
   ? aHash[cMatricula]:cMatricula
   ? aHash[cMatricula]:cMarca
   ? aHash[cMatricula]:nPrecio
   ? aHash[cMatricula]:cColor
next
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
jcenteno
Posts: 23
Joined: Thu Dec 10, 2009 6:07 am

Re: Iniciandome en el manejo de tablas HASH

Post by jcenteno »

tambien:

for each hItems in aHash:Values()
? hItems:cMatricula
? hItems:cMarca
? hItems:nPrecio
? hItems:cColor
next
User avatar
MarioG
Posts: 1356
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Post by MarioG »

perfecto!, eso era lo que me faltaba saber :wink:
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: Iniciandome en el manejo de tablas HASH

Post by JmGarcia »

Probaré vuestras últimas propuestas.

He hecho una pequeña prueba con la creación de un array de hasta 1.000 elementos, generando aleatoriamente la key (cMatricula), y efectuando 1.000.000 de accesos.

El resultado es sorprendente:
Con arrays convencionales tarda 266 seg. con arrays HASH tarda 4 seg.

Os dejo el código:

Code: Select all

********************************************************************************
#include "FiveWin.ch"

function main()
public aCoches:={},oCoche
public hCoches:={=>} // Crea array/tabla HASH vacia
public nIndice,cMatricula,nSegundos
*---
nSegundos:=seconds()
for nIndice=1 to 1000000 // Un millon de veces
   Buscar1(alltrim(str(int(HB_Random(1,1000))))) // Números aleatorios de 1 a 1000
next nIndice
nSegundos:=seconds()-nSegundos
? nSegundos // 266 seg. con arrays/tablas convencionales
aCoches:={}
*---
nSegundos:=seconds()
for nIndice=1 to 1000000 // Un millon de veces
   Buscar2(alltrim(str(int(HB_Random(1,1000))))) // Números aleatorios de 1 a 1000
next nIndice
nSegundos:=seconds()-nSegundos
? nSegundos // 4 seg. con arrays/tablas HASH
hCoches:={=>}
*---
return nil

********************************************************************************

function Buscar1(cMatricula) // Con arrays/tablas convencionales
local nIndice:=aScan(aCoches,{|oCoche|oCoche:cMatricula==cMatricula})
if nIndice>0 // Existe
   oCoche:=aCoches[nIndice]
   oCoche:nAccesos:=oCoche:nAccesos+1
else // No existe
   oCoche:=TCoche():New(cMatricula)
   cMatricula:=oCoche:cMatricula
   aadd(aCoches,oCoche)
endif

*-------------------------------------------------------------------------------

function Buscar2(cMatricula) // Con arrays/tablas HASH
if cMatricula IN hCoches // Existe
   hCoches[cMatricula]:nAccesos:=hCoches[cMatricula]:nAccesos+1
else // No existe
   hCoches[cMatricula]:=TCoche():New(cMatricula)
   cMatricula:=hCoches[cMatricula]:cMatricula
endif
return nil

********************************************************************************

CLASS TCoche
   DATA nAccesos AS NUMERIC INIT 0
   DATA cMatricula,nPeso,cColor
   CLASSDATA lRegistered AS LOGICAL
   METHOD New(cMatricula) CONSTRUCTOR
   METHOD End()
ENDCLASS

METHOD New(cMatricula) CLASS TCoche
DEFAULT cMatricula:="XX9999"
::nAccesos:=1
::cMatricula:=cMatricula
::nPeso:=1000
::cColor:="rojo"
return Self

METHOD End() CLASS TCoche
::nAccesos:=nil
::cMatricula:=nil
::nPeso:=nil
::cColor:=nil
return .T.

********************************************************************************
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Iniciandome en el manejo de tablas HASH

Post by hmpaquito »

jm,

Creo que no son resultados 'comparables'. En la busqueda por array utilizas ascan que hace una busqueda lineal. Una comparacion buena seria que la busqueda se hiciera con algun algoritmo de busqueda con el array previamente ordenado.

En cualquier caso, es verdad, y yo los utilizo, que los hash son espectaculares.
Saludos
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Iniciandome en el manejo de tablas HASH

Post by leandro »

Buenos días para todos

Active este tema de nuevo (lo he utilizado muchísimo) , por que me surge la necesidad de BORRAR un ELEMENTO de un HASH, pero he buscado en los foros y no logro encontrar la respuesta.

De antemano gracias al que pueda ayudarme.
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Iniciandome en el manejo de tablas HASH

Post by cnavarro »

hb_HDel(<hHash>, <Key>) ➜ hHash
Deletes a key and it’s associated value from a hash table.

hb_HDelAt(<hHash>, <nPosition>) ➜ hHash
removes an entry from a hash table, based on its index position.
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Iniciandome en el manejo de tablas HASH

Post by leandro »

Gracias por responder Cristobal :D

Me funciono pero así:

Code: Select all

HDel(hEncabezado,"nombre")
 
De nuevo gracielas
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
Post Reply