主要实现了以整数为关键字的hash,以key%m_nSize为哈希函数,以(hash(key)+i)%m_nSize重新寻址,并附带了elf_hash的实现,使用过程中可灵活修改。
  1. #ifndef _MY_HASH_INT_H_
  2. #define _MY_HASH_INT_H_
  3.  
  4. template<class T,class K>
  5. class HashInt{
  6. public:
  7. HashInt();
  8. virtual ~HashInt();
  9. private:
  10. typedef struct tagElement
  11. {
  12. T data;
  13. K key;
  14. bool use;
  15. tagElement(){use = false;}
  16. ~tagElement(){}
  17. }Element;
  18. unsigned int m_nSize;
  19. Element *m_arrT;
  20. unsigned int m_nElementCnt;
  21. // 查找
  22. bool find(K key,unsigned int &index);
  23. public:
  24. // 初始化,分配内存
  25. bool init(const unsigned int size);
  26. // 哈希函数
  27. unsigned int hash(K key);
  28. // ELF哈希函数
  29. unsigned int hash_elf(char *str);
  30. // 插入
  31. bool insert(T data,K key);
  32. // 删除
  33. bool remove(K key);
  34. // 查找
  35. bool find(K key,T &data);
  36. // 修改
  37. bool modify(T data,K key);
  38. void dump();
  39. };
  40.  
  41. template<class T,class K>
  42. unsigned int HashInt<T, K>::hash_elf( char *str)
  43. {
  44. unsigned int locate = ;
  45. unsigned int x = ;
  46. while (*str)
  47. {
  48. locate = (locate << ) + (*str++);//hash左移4位,当前字符ASCII存入hash低四位。
  49. if ((x = locate & 0xF0000000L) != )
  50. {//如果最高的四位不为0,则说明字符多余7个,如果不处理,再加第九个字符时,第一个字符会被移出,因此要有如下处理。
  51. locate ^= (x >> );
  52. //清空28-31位。
  53. locate &= ~x;
  54. }
  55. }
  56. return locate%m_nSize;
  57. }
  58.  
  59. template<class T,class K>
  60. HashInt<T, K>::~HashInt()
  61. {
  62. if(m_arrT != NULL)
  63. {
  64. delete[] m_arrT;
  65. }
  66. }
  67.  
  68. template<class T,class K>
  69. HashInt<T, K>::HashInt()
  70. {
  71. m_arrT = NULL;
  72. m_nSize = ;
  73. m_nElementCnt = ;
  74. }
  75.  
  76. template<class T,class K>
  77. void HashInt<T, K>::dump()
  78. {
  79. cout<<"m_nElementCnt="<<m_nElementCnt<<",m_nSize="<<m_nSize<<endl;
  80. for(unsigned int i = ;i < m_nSize;i++)
  81. {
  82. if(m_arrT[i].use == true)
  83. {
  84. cout<<i<<"-";
  85. m_arrT[i].data->display();
  86. }
  87. }
  88. cout<<endl;
  89. }
  90.  
  91. template<class T,class K>
  92. bool HashInt<T, K>::modify( T data,K key )
  93. {
  94. if( m_nElementCnt == )
  95. {
  96. return false;
  97. }
  98. bool exist = false;
  99. unsigned int index;
  100. exist = find(key,index);
  101. if( exist == true )
  102. {
  103. m_arrT[index].data = data;
  104. }
  105. return false;
  106. }
  107.  
  108. template<class T,class K>
  109. bool HashInt<T, K>::find( K key,T &data )
  110. {
  111. if( m_nElementCnt == )
  112. {
  113. return false;
  114. }
  115. bool exist = false;
  116. unsigned int index;
  117. exist = find(key,index);
  118. if( exist == true )
  119. {
  120. data = m_arrT[index].data;
  121. }
  122. return false;
  123. }
  124.  
  125. template<class T,class K>
  126. bool HashInt<T, K>::find( K key,unsigned int &index )
  127. {
  128. if( m_nElementCnt == )
  129. {
  130. return false;
  131. }
  132. unsigned int locate = hash(key),i = ;
  133. while(i < m_nSize)
  134. {
  135. if( m_arrT[locate].use == true && m_arrT[locate].key == key)
  136. {
  137. index = locate;
  138. return true;
  139. }
  140. locate = (locate + i)%m_nSize;
  141. i++;
  142. }
  143. return false;
  144. }
  145.  
  146. template<class T,class K>
  147. bool HashInt<T, K>::remove( K key )
  148. {
  149. // 表为空
  150. if( m_nElementCnt == )
  151. {
  152. return false;
  153. }
  154. bool exist = false;
  155. unsigned int index;
  156. exist = find(key,index);
  157. if( exist == true )
  158. {
  159. m_arrT[index].use = false;
  160. m_nElementCnt--;
  161. return true;
  162. }
  163. return false;
  164. }
  165.  
  166. template<class T,class K>
  167. bool HashInt<T, K>::insert( T data,K key)
  168. {
  169. // 表已满
  170. if( m_nElementCnt == m_nSize )
  171. {
  172. return false;
  173. }
  174. unsigned int locate = hash(key),i = ;
  175. while(i < m_nSize)
  176. {
  177. if( m_arrT[locate].use == false)
  178. {
  179. m_arrT[locate].data = data;
  180. m_arrT[locate].key = key;
  181. m_arrT[locate].use = true;
  182. m_nElementCnt++;
  183. return true;
  184. }
  185. locate = (locate + i)%m_nSize;
  186. i++;
  187. }
  188. return false;
  189. }
  190.  
  191. template<class T,class K>
  192. unsigned int HashInt<T, K>::hash( K key )
  193. {
  194. return key%m_nSize;
  195. }
  196.  
  197. template<class T,class K>
  198. bool HashInt<T, K>::init( const unsigned int size )
  199. {
  200. m_nSize = size;
  201. m_arrT = new Element[m_nSize];
  202. m_nElementCnt = ;
  203. cout<<"size = "<<sizeof(Element)*m_nSize<<endl;
  204. return true;
  205. }
  206.  
  207. #endif

C++ 简单 Hash容器的实现的更多相关文章

  1. 理解与模拟一个简单servlet容器

    servlet接口 使用servlet编程需要实现或者继承实现了javax.servlet.Servlet接口的类,其中定义了5个签名方法: public void init(ServletConfi ...

  2. HDOJ-ACM1425 sort 简单hash应用

    其实快排也可以通过这个问题~不是考点 没想到考点是这个,简单hash应用,空间换时间 初始化一个长度为1000001的数组(由于数字的范围为[-500000,500000]) 如果存在这个数m,数组下 ...

  3. 一个简单servlet容器

    一个简单servlet容器 2.1 javax.servlet.Servlet接口 Servlet编程需要使用javax.servlet和javax.servlet.http两个包下的接口和类 在所有 ...

  4. 【最简单IOC容器实现】实现一个最简单的IOC容器

    前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...

  5. HDU 1880 简单Hash

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=1880] 中文题面,题意很简单: 题解: 把每个 魔咒 和 对应的功能分别Hash,然后分别映射到ma ...

  6. HDU——2112HDU Today(SPFA+简单Hash或map+前向星)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 简单IOC容器实现

    前言 本文是为了学习Spring IOC容器的执行过程而写,不能完全代表Spring IOC容器,只是简单实现了容器的依赖注入和控制反转功能,无法用于生产,只能说对理解Spring容器能够起到一定的作 ...

  8. 简单Hash函数LongHash

    import java.security.SecureRandom; import java.util.Random; public class LongHash { private static l ...

  9. hdu 4287Intelligent IME(简单hash)

    Intelligent IME Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. BeagleBone硬件概览Ethernet端口板载LEDc重置按钮等介绍

    BeagleBone硬件概览Ethernet端口板载LEDc重置按钮等介绍 你进入BeagleBone世界的第一步就是将它连接以得到命令提示,然后你就可以处理文件以及执行命令了.在这里,你就可以定制你 ...

  2. Hadoop_10_shuffle02_详解Shuffle过程【来源网络】推荐更为详细

    网址:http://www.cnblogs.com/felixzh/p/4680808.html Shuffle过程,也称Copy阶段.reduce task从各个map task上远程拷贝一片数据, ...

  3. DataTable转换成List<T>

    很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: public static class DataTableToModel { public ...

  4. BZOJ3790 : 神奇项链

    Manacher求出所有极长回文子串后,得到一堆线段,转化成线段覆盖问题 预处理出g[i]表示左端点不超过i的右端点的最大值 贪心地线段覆盖即可 时间复杂度$O(n)$ #include<cst ...

  5. chrome developer tool 调试技巧

    这篇文章是根据目前 chrome 稳定版(19.0.1084.52 m)写的, 因为 google 也在不断完善chrome developer tool, 所以 chrome 版本不同可能稍有差别. ...

  6. javascript,HTML,PHP,ASP做301跳转代码 SEO优化设置

    URL HTTP Redirection URL http redirection is an automatic URL change operation from one URL to anoth ...

  7. NOIp 2006 作业调度方案 Label:坑 模拟(tyvj你不给我ac,我就把名字献给附中oj)

    福建师大附中链接:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1211 [问题描述] 我们现在要利用m台机器加工n个工件,每个工件都有m道工序 ...

  8. COJ976 WZJ的数据结构(负二十四)

    试题描述 输入一个字符串S,回答Q次问题,给你l,r,输出从Sl--Sr组成的串在S中出现了多少次. 输入 第一行为一个字符串S.第二行为一个正整数Q.接下来Q行每行为l,r. 输出 对于每个询问,输 ...

  9. [开源框架推荐]Icepdf:纯java的pdf文档的提取和转换库

    ICEpdf 是一个轻量级的开源 Java 语言的 PDF 类库.通过 ICEpdf 可以用来浏览.内容提取和转换 PDF 文档,而无须一些本地PDF库的支持. 可以用来做什么? 1.从pdf文件中提 ...

  10. Struts2之自定义类型转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...