poj3349(hash table)
做的第一道哈希表的题目。速度很慢,跑了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)的更多相关文章
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- 哈希表(Hash Table)
参考: Hash table - Wiki Hash table_百度百科 从头到尾彻底解析Hash表算法 谈谈 Hash Table 我们身边的哈希,最常见的就是perl和python里面的字典了, ...
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
- 几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table
list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的. 如果我自己写,我也会用二叉检索树,它在 ...
- PHP内核探索之变量(3)- hash table
在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量 ...
- php Hash Table(四) Hash Table添加和更新元素
HashTable添加和更新的函数: 有4个主要的函数用于插入和更新HashTable的数据: int zend_hash_add(HashTable *ht, char *arKey, uint n ...
- php Hash Table(一) Hash Table的结构
关于Hash Table专题: 一直想深入理解一下php的hash table的实现,以前一直是星星点点的看看,从未彻底的总结过,那就从这个专题开始吧! 主要想总结几个部分:hashtable结构,h ...
- Hash Table 的实现步骤是什么
什么是HashTable Hash Table 是计算机科学中很重要的一种数据结构,其时间复杂度为O(1),主要是通过把关键字Key 映射到数组中的一个位置来访问记录,所以速度相当快.映射函数称为 H ...
- 纸上谈兵:哈希表(hash table)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! HASH 哈希表(hash table)是从一个集合A到另一个集合B的映射(map ...
随机推荐
- Ubuntu 13.04 主机名的修改
由于某些原因,要修改Ubuntu的主机名,晚上Google了一下,要改的地方为/etc/hostname,即将里面的字符串替换为你要起的主机名即可. sudo vi /etc/hostname 修改即 ...
- HDU 1069 Monkey and Banana(最长递减子序列)
题目链接 题意:摞长方体,给定长方体的长宽高,个数无限制,可随意翻转,要求下面的长方体的长和宽都大于上面的,都不能相等,问最多能摞多高. 题解:个数无限,其实每种形态最多就用一次,把每种形态都单独算一 ...
- 内核工具 – Sparse 简介【转】
转自:http://www.cnblogs.com/wang_yb/p/3575039.html Sparse是内核代码静态分析工具, 能够帮助我们找出代码中的隐患. 主要内容: Sparse 介绍 ...
- Ubuntu server 搭建Git server【转】
转自:http://www.cnblogs.com/candle806/p/4064610.html Ubuntu server 搭建Git server,git相比svn,最主要就是分布式了,每个客 ...
- spin_lock & mutex_lock的区别? 【转】
转自:http://blog.csdn.net/wilsonboliu/article/details/19190861 本文由该问题引入到内核锁的讨论,归纳如下 为什么需要内核锁? 多核处理器下 ...
- Docker基础速成(一)
Docker基础速成(一) 给亲爱的写的docker基础速成,按照步骤操作,实践出真知,希望有提纲挈领之功效 1.docker简介 Docker 轻量级容器,如图,类似于一个个集装箱,把复杂或者零散的 ...
- C 数据结构堆
引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7 ...
- Group Normalization笔记
作者:Yuxin,Wu Kaiming He 机构:Facebook AI Research (FAIR) 摘要:BN是深度学习发展中的一个里程碑技术,它使得各种网络得以训练.然而,在batch维度上 ...
- HTML5学习--SVG全攻略(基础篇)
明天高级篇 一.什么是SVG? SVG 指的是可伸缩矢量图形 (Scalable Vector Graphics),它用来定义用于网络的基于矢量的图形,使用 XML 格式定义图形.SVG 图像在放大或 ...
- SLF4J multiple
"C:\Program Files\Java\jdk1.8.0_65\bin\java" -Didea.launcher.port=7537 "-Didea.launch ...