dictionary.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:5k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  dictionary.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_DICTIONARY_H
  12. #define LEDA_DICTIONARY_H
  13. #include <LEDA/basic.h>    
  14. #define DIC_DEF_IMPL skiplist
  15. #include <LEDA/impl/skiplist.h> 
  16. typedef skiplist_item dic_item;
  17. /*{Manpage {dictionary} {K,I} {Dictionaries}}*/
  18. template <class K, class I> 
  19. class dictionary : public virtual DIC_DEF_IMPL 
  20. {
  21. /*{Mdefinition
  22. An instance $D$ of the parameterized data type name is a collection
  23. of items ($dic_item$). Every item in $D$ contains a key from the linearly
  24. ordered data type $K$, called the key type of $D$, and an information from the
  25. data type $I$, called the information type  of $D$. The number of items in $D$
  26. is called the size of $D$. A dictionary of size zero is called the empty
  27. dictionary. We use $<k,i>$ to denote an item with key $k$ and information
  28. $i$ ($i$ is said to be the information associated with key $k$).  For each
  29. $k in K$ there is at most one $i in I$ with $<k,i> in D$.}*/
  30. int  int_type()              const { return LEDA_INT_TYPE(K); }
  31. int  cmp(GenPtr x, GenPtr y) const { return LEDA_COMPARE(K,x,y); }
  32. int  hash_fct(GenPtr x)      const { return LEDA_HASH(K,x); }
  33. void clear_key(GenPtr& x)    const { LEDA_CLEAR(K,x); }
  34. void clear_inf(GenPtr& x)    const { LEDA_CLEAR(I,x); }
  35. void copy_key(GenPtr& x)     const { LEDA_COPY(K,x); }
  36. void copy_inf(GenPtr& x)     const { LEDA_COPY(I,x); }
  37. public:
  38. /*{Mcreation D }*/
  39. dictionary() {}
  40. /*{Mcreate creates an instance var of type name and initializes it with 
  41.             the empty dictionary.}*/
  42. dictionary(const dictionary<K,I>& D) : DIC_DEF_IMPL(D) {}
  43. dictionary<K,I>& operator=(const dictionary<K,I>& D)
  44. { DIC_DEF_IMPL::operator=(D); return *this; }
  45.          
  46. virtual ~dictionary()   { DIC_DEF_IMPL::clear(); }
  47. /*{Moperations 2 4.2 }*/
  48. virtual K key(dic_item it) const { return LEDA_ACCESS(K,DIC_DEF_IMPL::key(it));}
  49. /*{Mop   returns the key of item $it$.\
  50.   precond $it$ is an item in var.}*/
  51. virtual I inf(dic_item it) const { return LEDA_ACCESS(I,DIC_DEF_IMPL::inf(it));}
  52. /*{Mop     returns the information of item $it$.\
  53.     precond $it$ is an item in var.}*/
  54. virtual int  defined(K k) const 
  55. { return (lookup(k) == nil) ? false : true; }
  56. virtual dic_item insert(K k, I i)
  57. { return DIC_DEF_IMPL::insert(Convert(k),Convert(i)); } 
  58. /*{Mop      associates the information $i$ with the key $k$.
  59.              If there is an item $<k,j>$ in var then $j$ is
  60.              replaced by $i$, else a new item $<k,i>$ is added
  61.              to var. In both cases the item is returned.}*/
  62. virtual dic_item lookup(K k) const
  63. { return DIC_DEF_IMPL::lookup(Convert(k));}
  64. /*{Mop        returns the item with key $k$ (nil if no such
  65.        item exists in var).}*/
  66. virtual I access(K k)  const { return inf(lookup(k));}
  67. /*{Mop       returns the information associated with key $k$.
  68.               precond there is an item with key $k$ in var.}*/
  69. virtual void  del(K k)          { DIC_DEF_IMPL::del(Convert(k)); } 
  70. /*{Mop       deletes the item with key $k$ from var
  71.               (null operation, if no such item exists).}*/
  72. virtual void  del_item(dic_item it) { DIC_DEF_IMPL::del_item(it); } 
  73. /*{Mop       removes item $it$ from var.\
  74.               precond $it$ is an item in var.}*/
  75. virtual void change_inf(dic_item it, I i)
  76. { DIC_DEF_IMPL::change_inf(it,Convert(i)); }
  77. /*{Mopl      makes $i$ the information of item $it$.\
  78.               precond $it$ is an item in var.}*/
  79. virtual void     clear() { DIC_DEF_IMPL::clear(); }
  80. /*{Mop       makes var the empty dictionary.}*/ 
  81. virtual int      size()  const { return DIC_DEF_IMPL::size(); }
  82. /*{Mop       returns the size of var.}*/
  83. virtual bool     empty() const { return (size()==0) ? true : false; }
  84. /*{Mop       returns true if var is empty, false otherwise.}*/
  85. virtual dic_item first_item() const { return DIC_DEF_IMPL::first_item(); }
  86. virtual dic_item next_item(dic_item it) const { return DIC_DEF_IMPL::next_item(it);}
  87. };
  88. /*{Mimplementation
  89. Dictionaries are implemented by randomized search trees cite{AS89}. Operations 
  90. insert, lookup, del_item, del take time $O(log n)$, key, inf, empty, size,
  91. change_inf take time $O(1)$, and clear takes time $O(n)$. Here $n$ is the 
  92. current size of the dictionary. The space requirement is $O(n)$.}*/ 
  93. /*{Mexample
  94. We count the number of occurrences of each string in a sequence of strings.
  95. begingroup
  96. ttbig
  97. {obeyspacesgdef { }}
  98. ttverbatim
  99. #include <LEDA/dictionary.h>
  100. main()
  101. { dictionary<string,int> D;
  102.   string s;
  103.   dic_item it;
  104.   while (cin >> s)
  105.   { it = D.lookup(s);
  106.     if (it==nil) D.insert(s,1);
  107.     else D.change_inf(it,D.inf(it)+1);
  108.   }
  109.   forall_items(it,D) cout << D.key(it) << " : " <<  D.inf(it) << endl;
  110. }
  111. endgroup
  112. }*/
  113. #endif