Page 2 of 2
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 10:45 pm
by MarioG
Pues entonces te sugiero probar así que seguro es más rapido
Code: Select all | Expand
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
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 11:02 pm
by jcenteno
tambien:
for each hItems in aHash:Values()
? hItems:cMatricula
? hItems:cMarca
? hItems:nPrecio
? hItems:cColor
next
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 11:17 pm
by MarioG
perfecto!, eso era lo que me faltaba saber
![Wink :wink:](./images/smilies/icon_wink.gif)
Re: Iniciandome en el manejo de tablas HASH
Posted: Fri Mar 16, 2012 11:29 am
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 | Expand
********************************************************************************
#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.
********************************************************************************
Re: Iniciandome en el manejo de tablas HASH
Posted: Fri Mar 16, 2012 12:29 pm
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
Re: Iniciandome en el manejo de tablas HASH
Posted: Wed Sep 18, 2019 2:16 pm
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.
Re: Iniciandome en el manejo de tablas HASH
Posted: Wed Sep 18, 2019 2:34 pm
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.
Re: Iniciandome en el manejo de tablas HASH
Posted: Wed Sep 18, 2019 2:42 pm
by leandro
Gracias por responder Cristobal
Me funciono pero así:
De nuevo gracielas