Page 2 of 2

Re: Iniciandome en el manejo de tablas HASH

PostPosted: 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 view
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

PostPosted: 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

PostPosted: Tue Mar 13, 2012 11:17 pm
by MarioG
perfecto!, eso era lo que me faltaba saber :wink:

Re: Iniciandome en el manejo de tablas HASH

PostPosted: 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 view
********************************************************************************
#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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: Wed Sep 18, 2019 2:42 pm
by leandro
Gracias por responder Cristobal :D

Me funciono pero así:

Code: Select all  Expand view

HDel(hEncabezado,"nombre")
 


De nuevo gracielas