[Dcmlib] Essai sur les table de hashage

Eric Boix frog at creatis.insa-lyon.fr
Tue May 28 17:13:26 CEST 2002


	Salut,

	Il semblerait que nous devions faire un usage intensif des
tables de hashage. Les specifs actuelles (faites sur un coin de table
lors de la derniere reunion) sont:
  * un tableau associatif
  * clef unique (je ne suis pas tout a fait certain de cela).
  * trie' (sur les clefs)
  * avec les methodes de traverse'e first(), next(), last...

Il existe bien sur des choses dans la STL et apres une premiere lecture
du chapitre 3.3 de
    http://www.sgi.com/tech/stl/table_of_contents.html
ce qu'il nous faudrait est donc un "Unique Sorted Associative Container"
i.e. soit un <set> soit un <map>.

Toujours en premier lecture, il semblerait que l'on ne puis PAS ajouter
a nos contraintes que l'implementation soit fait sous forme de table de
hashage (pour des raisons de complexite' algorithmique et non de
fonctionalite') sans perdre l'ordre (Sorted) des clefs.
Autrement dit un Unique Hashed Associative Container n'est pas sorted.
Ajoutez a cela que les templates correspondants a cela (i.e. <hash_set> et 
<hash_map>) n'existent pas nativement dans VC++6.0 (pfff)...

	Ma conclusion partielle est qu'il faut pendre un <map>. Voici un
bout de code (aussi en attachement) qui compile et linke avec la commande
   "g++ hashtest.cxx"
sous linux...


#include <map>
#include <string>
#include <iostream>

int main()
{
  typedef map<string, char*> dict;

  dict current;
  current["00100010"] = "Patient Name";
  current["7fe00010"] = "Pixel Data";
  current["50000010"] = "Number of points";
  current["00380010"] = "Admission ID";

   cout << "Traversal of dictionary (note the proper ordering on key)." << endl;   for ( dict::iterator im = current.begin(); im != current.end(); ++im )
      cout << "   \"" << im->first << "\" = " << im->second << endl;
   cout << "End of dictionary." << endl;

   cout << "Find request on key 00380010" << endl;
   dict::iterator im = current.find("00380010");
   cout << "   \"" << im->first << "\" = " << im->second << endl;
}


	So ?
	Frog.

-------------- next part --------------
#include <map>
#include <string>
#include <iostream>

int main()
{
  typedef map<string, char*> dict;
  
  dict current;
  current["00100010"] = "Patient Name";
  current["7fe00010"] = "Pixel Data";
  current["50000010"] = "Number of points";
  current["00380010"] = "Admission ID";

	cout << "Traversal of dictionary (note the proper ordering on key)." << endl;
	for ( dict::iterator im = current.begin(); im != current.end(); ++im )
		cout << "   \"" << im->first << "\" = " << im->second << endl;
 	cout << "End of dictionary." << endl;

 	cout << "Find request on key 00380010" << endl;
	dict::iterator im = current.find("00380010");
	cout << "   \"" << im->first << "\" = " << im->second << endl;
}


More information about the Dcmlib mailing list