哈希的一种用法——判断相等
2015-01-25 14:23
211 查看
小结来源:poj3349 & poj3274
在输入数据量比较大,时间要求比较高的情况下,判断相等可以考虑哈希的方法,比如,输入10W、100W,时间要求4000MS、7000MS,用普通方法肯定要TLE的,这时就需要hash。
首先要构造hash表,这里根据输入量来确定hash table的大小,比如poj3349中输入量最大12W,所以最坏情况每一种雪花都不相等需要12W个哈希项,所以这里设置HASH_BASE=12W以上的最小素数=120007(后面hash函数使用直接取余法)。
这里的构造相对简单,每次插入一个数据,这个数据都看成一个HashNode,并且用cur标记它是第几个HashNode。HashNode除了要有指向下一个HashNode的next指针外(如果两个HashNode哈希值相同,则映射到hash table的同一个地址处),还要有判断两个HashNode是否相等的变量,这里认为如果两个HashNode的num数组相等,就认为两个HashNode是同一片雪花。
哈希函数:
插入数据:
程序的进行是一边读数据,一边构建hash table,一边判断当前读到的数据是否与已经在hash table中的数据相等进行的.
poj3247也是同样模式,最大数据有10W个,即10W行,因此不能直接枚举找最大距离,必须用Hash查找相同行,找到相同行再比较最大距离,看是否更新最大距离。
在输入数据量比较大,时间要求比较高的情况下,判断相等可以考虑哈希的方法,比如,输入10W、100W,时间要求4000MS、7000MS,用普通方法肯定要TLE的,这时就需要hash。
首先要构造hash表,这里根据输入量来确定hash table的大小,比如poj3349中输入量最大12W,所以最坏情况每一种雪花都不相等需要12W个哈希项,所以这里设置HASH_BASE=12W以上的最小素数=120007(后面hash函数使用直接取余法)。
这里的构造相对简单,每次插入一个数据,这个数据都看成一个HashNode,并且用cur标记它是第几个HashNode。HashNode除了要有指向下一个HashNode的next指针外(如果两个HashNode哈希值相同,则映射到hash table的同一个地址处),还要有判断两个HashNode是否相等的变量,这里认为如果两个HashNode的num数组相等,就认为两个HashNode是同一片雪花。
const int HASH_BASE = 1200007;//100000*12以上的最小素数 const int NODE_NUMBER = 1200010;//node个数 int hashTable[HASH_BASE]; int cur; struct HashNode{ int num[6]; int next; }; HashNode node[NODE_NUMBER]; void initHashTable() { cur = 0; for (int i = 0; i < HASH_BASE; i++) { hashTable[i] = -1; } }
哈希函数:
unsigned getHash(int num[]) { unsigned int value = 0; for (int i = 0; i < 6; i++) { value += num[i]; } return value%HASH_BASE; }
插入数据:
void insertHashNode(int num[], unsigned value) { for (int i = 0; i < 6; i++) { node[cur].num[i] = num[i]; } node[cur].next = hashTable[value]; hashTable[value] = cur; cur++; }
程序的进行是一边读数据,一边构建hash table,一边判断当前读到的数据是否与已经在hash table中的数据相等进行的.
bool searchHash(int num[]) { unsigned value = getHash(num); int next = hashTable[value]; while (next != -1) { if (compare(num, node[next].num)) return true; next = node[next].next; } insertHashNode(num, value); return false; }即如果发现该数据的哈希值与其它冲突(hashTable[value]!=-1),就比较是否相等,不想等就插入到表中。
poj3247也是同样模式,最大数据有10W个,即10W行,因此不能直接枚举找最大距离,必须用Hash查找相同行,找到相同行再比较最大距离,看是否更新最大距离。
相关文章推荐
- sql 判断的一种用法
- return的一种用法:如果当前判断为true则跳出这个方法。
- 9.了解四个相等判断的用法
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
- django学习——模板中判断相等与否的两种用法ifequal与if
- struts2标签循环一个数字及判断字符串相等的用法
- printf的一种用法
- 编码优化无极限——由一个相等判断想到的
- 关于条件判断的高级用法
- 完成端口的深入理解及一种变态用法
- C#试题(一)判断相等的方法和操作符--ReferenceEquels(),Equels(),==
- native2ascii命令的一种用法
- case的一种用法
- 想到Exchanger N parties的一种用法
- 条款9:理解几个相等判断之间的关系
- switch case 的 一种用法
- ASP生成静态网页,学习CASE的用法,以及“权限”的一种控制方法
- ActiveX控件中全局变量的一种用法
- 判断Checkbox和Radio的一种方法
- 一种判断市场潜力的方法