做的第一道哈希表的题目。速度很慢,跑了3000+ms。采用六条边的和对一个大质数的余数作为哈希表的key,理论上质数取得越大,消耗的空间就越大,但是速度会加快,这里取了14997。地址冲突用链表解决。

我认为跑得慢很大一个原因是在比较两篇雪花是否相同的操作相当费时,不知道有没有更好的解决方法。

此外,这个程序还存在的问题是,我写了清除哈希表的函数,但是如果这个函数在程序结束时调用的话,在poj上就会超时,所以就没调用了,其实是钻了空子的。

#include <cstdio>
using namespace std; const int big_prime = ;
const int LEN = ; struct Node{
int len[LEN];
Node *next;
}; Node *hash_table[big_prime + ]; void init_hash_table()
{
for (int i = ; i < big_prime + ; i++){
hash_table[i] = NULL;
}
} void delete_hash_table()
{
for (int i = ; i < big_prime + ; i++){
Node *p = hash_table[i];
while (p){
Node *tmp = p->next;
delete p;
p = tmp;
}
}
} int hash(const Node &node)
{
int key = ;
for (int i = ; i < LEN; i++){
key = (key + node.len[i] ) % big_prime;
}
return key;
} bool cmp(const Node &n1, const Node &n2)
{
for (int start = ; start < LEN; start++){
int j = ;
for (int i = start; j < LEN; j++, i = (i + ) % LEN){
if (n1.len[i] != n2.len[j])
break;
}
if (j == LEN)
return true;
}
for (int start = ; start < LEN; start++){
int j = ;
for (int i = start; j < LEN; j++, i = (i + ) % LEN){
if (n1.len[i] != n2.len[j])
break;
}
if (j == LEN)
return true;
}
return false;
} bool search_and_insert(Node *node)
{
int key = hash(*node);
if (!hash_table[key]){
hash_table[key] = node;
}
else{
Node *p = hash_table[key], *pre = p;
while (p){
if (cmp(*p, *node))
return false;
pre = p;
p = p->next;
}
pre->next = node;
}
return true;
} int main()
{
init_hash_table();
int n;
bool flag = false;
scanf("%d", &n);
for (int i = ; i < n; i++){
int num[LEN];
for (int j = ; j < LEN; j++){
scanf("%d", num + j);
}
if (!flag){
Node *p = new Node;
p->next = NULL;
for (int j = ; j < LEN; j++){
p->len[j] = num[j];
}
if (!search_and_insert(p))
flag = true;
}
}
if (flag){
printf("Twin snowflakes found.\n");
}
else{
printf("No two snowflakes are alike.\n");
}
return ;
}

poj3349(hash table)的更多相关文章

  1. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  2. 哈希表(Hash Table)

    参考: Hash table - Wiki Hash table_百度百科 从头到尾彻底解析Hash表算法 谈谈 Hash Table 我们身边的哈希,最常见的就是perl和python里面的字典了, ...

  3. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  4. 几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table

    list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的.  如果我自己写,我也会用二叉检索树,它在 ...

  5. PHP内核探索之变量(3)- hash table

    在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量 ...

  6. php Hash Table(四) Hash Table添加和更新元素

    HashTable添加和更新的函数: 有4个主要的函数用于插入和更新HashTable的数据: int zend_hash_add(HashTable *ht, char *arKey, uint n ...

  7. php Hash Table(一) Hash Table的结构

    关于Hash Table专题: 一直想深入理解一下php的hash table的实现,以前一直是星星点点的看看,从未彻底的总结过,那就从这个专题开始吧! 主要想总结几个部分:hashtable结构,h ...

  8. Hash Table 的实现步骤是什么

    什么是HashTable Hash Table 是计算机科学中很重要的一种数据结构,其时间复杂度为O(1),主要是通过把关键字Key 映射到数组中的一个位置来访问记录,所以速度相当快.映射函数称为 H ...

  9. 纸上谈兵:哈希表(hash table)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! HASH 哈希表(hash table)是从一个集合A到另一个集合B的映射(map ...

随机推荐

  1. HDU 2097 Sky数 进制转换

    解题报告:这题就用一个进制转换的函数就可以了,不需要转换成相应的进制数,只要求出相应进制的数的各位的和就可以了. #include<cstdio> #include<string&g ...

  2. nginx+tomat https ssl 部署 完美解决方案

    关于nginx+tomcat https的部署之前网上一直有2种说法: 1.nginx和tomcat都要部署ssl证书 2.nginx部署ssl证书,tomcat增加ssl支持 在实际的部署过程中ng ...

  3. 防止 Google Smart Lock 记忆错的用户名

    默认 chrome 会查找密码上面的那个(非隐藏非禁用)的表单域 如果上面是个短信验证码框,就会将验证码当成用户名提示用户保存. 在用户名 input 上添加 autocomplete="u ...

  4. 在c++中实现反射的初步想法

    最近在思考如何在c++中实现反射.事情的起因是这样的:我们服务器是用c++开发的,如果需要写一些测试用的GM指令的话,需要编写完GM代码后重新编译并且重启进程,工序繁琐且比较耗时.因此就有了想用脚本( ...

  5. awk的常用内置函数的使用【转】

    手把手教你在linux下熟悉使用awk的指令结构 (15) 大家好,今天和大家说一下awk吧.反正正则 早晚也要和大家说,不如一点一点和大家先交代清楚了,省得以后和大家说的时候,大家有懵的感觉... ...

  6. Django-自动HTML转义

    一.自动HTML转义 从模板生成HTML时,总会有变量包含影响最终HTML的字符风险,例如,考虑这个模板的片段: Hello, {{ name }} 起初,这是一种显示用户名的无害方式,但考虑用户输入 ...

  7. 关于一些问题的解决办法[记录]TF400017

    这个问题是今天在改东西的时候,突然断电导致的,google了很久之后,终于找到了办法 方法: 就是删除下面这个文件 -========================================= ...

  8. Motan

    https://github.com/weibocom/motan/wiki/zh_userguide http://www.cnblogs.com/mantu/p/5885996.html(源码分析 ...

  9. Oracle 中count(1) 、count(*) 和count(列名) 函数的区别

    1)count(1)与count(*)比较: 1.如果你的数据表没有主键,那么count(1)比count(*)快2.如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快3. ...

  10. 洛谷P1177快速排序

    传送门 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...