Iniciandome en el manejo de tablas HASH

Re: Iniciandome en el manejo de tablas HASH

Postby MarioG » Tue Mar 13, 2012 10:45 pm

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
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Postby jcenteno » Tue Mar 13, 2012 11:02 pm

tambien:

for each hItems in aHash:Values()
? hItems:cMatricula
? hItems:cMarca
? hItems:nPrecio
? hItems:cColor
next
jcenteno
 
Posts: 23
Joined: Thu Dec 10, 2009 6:07 am

Re: Iniciandome en el manejo de tablas HASH

Postby MarioG » Tue Mar 13, 2012 11:17 pm

perfecto!, eso era lo que me faltaba saber :wink:
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Postby JmGarcia » Fri Mar 16, 2012 11:29 am

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.

********************************************************************************
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
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

Postby hmpaquito » Fri Mar 16, 2012 12:29 pm

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
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Iniciandome en el manejo de tablas HASH

Postby leandro » Wed Sep 18, 2019 2:16 pm

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 AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1482
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Iniciandome en el manejo de tablas HASH

Postby cnavarro » Wed Sep 18, 2019 2:34 pm

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.

Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6501
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Iniciandome en el manejo de tablas HASH

Postby leandro » Wed Sep 18, 2019 2:42 pm

Gracias por responder Cristobal :D

Me funciono pero así:

Code: Select all  Expand view

HDel(hEncabezado,"nombre")
 


De nuevo gracielas
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1482
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 14 guests