散列表,又名哈希表、Hash表。这是一个神奇的数据结构,它的复杂度是常数级别,由于我非常喜欢这个数据结构,在此简单介绍一下。

(没有学过Hash表的同学,我推荐一个教程:http://www.cnblogs.com/jiewei915/archive/2010/08/09/1796042.html

让我们回忆一下之前学过的数据结构,列个表,与Hash表做个比较(表中c表示常数):

 

插入时间

删除时间

查找时间

编程复杂度

信息剖析度

无序数组

1

N

N

有序数组

N

N

logN

无序链表

1

N

N

☆☆☆

平衡树

logN

logN

logN

☆☆☆☆☆

Hash表

常数

常数

常数

☆☆

☆☆☆

这表中前四列很好理解(平衡树之所以给五颗星,是因为我假设大家树写得好看,如果代码不漂亮,恐怕多少颗星都有可能,甚至你写不对就是∞颗星……),而第五列新手可能比较陌生,这里解释一下。

例如你对N个元素写个无序结构,啥都不用想,存进去就好了;写个有序结构,也仅仅需要想想两个元素之间如何比大小即可(例如3<5、"ab"<"aca"),我们对这N个数本身的信息剖析得非常少。因此,像这种信息剖析度低的数据结构,你基本啥都不用想,拿来就可以写代码了。

但Hash表却并不是如此,我们需要对数据进行更深入的分析(例如数是不是整数、字符串有多长),否则你的Hash表就可能出错(例如有负数时,你直接去模)、复杂度退化为线性等等(例如很多数都是一个大素数K的整数倍,而你却正好选择了让每个数模K去Hash)。因此,养成分析数据的习惯,才能知道自己在具体题目中是否可以使用散列表、如何使用散列表。

好了,就介绍这么多。最后,既然我说Hash表的编程复杂度只有两颗星,那么下面给出我的代码(Hash表有很多种,我最常用的就是大素数Hash+链表存重,代码简单而且适用性强):

题目:sjtuoj 1224

清爽版:Hash表的代码,清爽版对于新手来说很容易搞乱,因此仅给出类版。

类版:

1、裸Hash表(本题内存足够大,所以能过)

2、模大素数+拉链(对于本题来说,比较NC的做法,感谢HQ同学提示可以直接采用裸Hash表AC)

 #include <cstring>

 // 裸Hash 类版
class Hash
{
int H[];
int k(int num) { return num+; }
int num(int k) { return k-; }
public:
Hash() { memset(H,,sizeof(H)); } // 此代码中,由于这个Hash表比较大,会定义在全局,故无需初始化
void in(int num) { ++H[k(num)]; }
int count(int num) { return H[k(num)]; }
}; // 模大素数+拉链表 类版
class Hash
{
struct hash
{
int num;
hash *next;
}*H[],New[];
int L;
hash* make(int num) { New[L].num=num; return New+L++; }
int k(int num) { return (num+)%; }
public:
Hash():L() { memset(H,,sizeof(H)); } // 此代码中,由于这个Hash表比较大,会定义在全局,故无需初始化
void in(int num)
{
hash *u=make(num);
u->next=H[k(num)]; H[k(num)]=u;
}
int count(int num)
{
int s=;
for(hash *u=H[k(num)];u;u=u->next)
if(u->num==num) ++s;
return s;
}
};

最新文章

  1. 消息服务MNS和消息队列ONS产品对比
  2. 六十三、android pad
  3. (Python)继承
  4. HTML5实战教程———开发一个简单漂亮的登录页面
  5. shell 中函数放回字符串问题
  6. Solve Longest Path Problem in linear time
  7. 关于wtl的一个实验
  8. ul ol 列表的样式的控制
  9. c语常用算法库(1)
  10. JS兼容性问题列表
  11. vue2+webpack使用1--初识默认展示页面
  12. [bzoj1242] Zju1015 Fishing Net弦图判定
  13. C语言第二次作业---分支结构
  14. HDU 5984.Pocky(2016 CCPC 青岛 C)
  15. P1181 数列分段Section I
  16. content-box和border-box
  17. Luogu2792 [JSOI2008]小店购物
  18. hdu-2087(kmp)
  19. 最全的jquery datatables api 使用详解
  20. mycat 不得不说的缘分

热门文章

  1. java——栈和队列 面试题
  2. C语言头文件怎么写?(转载)
  3. IOS 制作动画代码和 设置控件透明度
  4. DP之背包问题详解及案例
  5. Dijkstra单源最短路径,POJ(2387)
  6. 基于ngx_lua模块的waf开发实践
  7. python3中使用HTMLTestRunner.py报ImportError: No module named &#39;StringIO&#39;的解决办法
  8. Java-笔记1
  9. 第49章 在SRAM中调试代码—零死角玩转STM32-F429系列
  10. 通过ServletContext取Spring的WebApplicationContext