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 ...
随机推荐
- [bzoj1095][ZJOI2007]Hide 捉迷藏——线段树+括号序列
题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了 ...
- 莫队-小Z的袜子
----普通莫队 首先清楚概率怎么求假设我们要求从区间l到r中拿出一对袜子的概率sum[i]为第i种袜子在l到r中的数量 $$\frac{\sum_{i=l}^{r} {[sum[i] \times ...
- Linux基础-awk使用
打印uid在30~40范围内的用户名:awk -F: '$3>=30&&$3<040{print $1}' passwd 打印第5-10行的行号和用户名:awk -F: ' ...
- AutoCAD DevTV-AUTOCAD二次开发资源合集
Webcast Language Date AutoCAD .Net - Session 2 English 13-Sep-12 AutoCAD .Net - Session 1 English 6- ...
- Centos6.5下搭建nagios详解
一.LAMP环境部署 1.安装php 1.安装yum源 rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-releas ...
- 【codeforces】【比赛题解】#872 CF Round #440 (Div.2)
链接. [A]寻找漂亮数字 题意: 给定了两列非零数字.我们说一个数是漂亮的,当它的十进制表达中有至少一个数从数列一中取出,至少有一个数从数列二中取出.最小的漂亮数字是多少? 输入: 第一行两个数\( ...
- 牛x的JavaScript编辑器你知道几个
英文:Martin Heller 译文:葡萄城控件 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群343599877,我们一起学前端! 对于JavaScript程序员来说,目前有很 ...
- 十七、springboot配置FastJson为Spring Boot默认JSON解析框架
前提 springboot默认自带json解析框架,默认使用jackson,如果使用fastjson,可以按照下列方式配置使用 1.引入fastjson依赖库: maven: <dependen ...
- centos7 部署 seafile
=============================================== 2018/5/13_第1次修改 ccb_warlock == ...
- Java 并发--线程创建
随着处理器的多核化,为提高处理器的资源利用率应用程序的并发变应运而生了.现在的操作系统是多任务操作系统,多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的内存空间 ...