POJ3349 哈希算法
问题分析
在n (n<100000)个雪花中判断是否存在两片完全相同的雪花,每片雪花有6个角,每个角的长度限制为1000000
雪花相等的条件为, 雪花6个角的长度按顺序相等(这个顺序即可以是顺时针的也可以是逆时针的)
在n个雪花中,查找两片是否相等的雪花,采用暴力解法其,各个元素逐个比较的话,则其时间复杂度为n的平方,由于n可能会很大提交时肯定超时,所以选择采用哈希方法来查找两个判断两个元素是否相等,
算法流程:
1 建立一个雪花的节点node,并且获取其6个角的长度,当拥有相同的hash值的雪花时,即产生冲突时,采用开放地址发,即用链表存放拥有相同哈希值的雪花节点,该链表的头节点存放在哈希数组中
2 判断拥有哈希值的雪花是否相等。
poj 3349
哈希算法
用G++编译提交通过,但用C++编译提交时会超时
*/
#include<iostream>
#include <algorithm>
#include <cstdio>
const long maxn=100000;
const long mtemp=100000;
/*
每片雪花的具体长度,并且是一个链表
*/
typedef struct node
{
long data[6];
node *next;
}node;
/*
存放雪花的初始地址
*/
typedef struct hnode
{
int elCount;
node *head;
}HeadNode;
/*
全局变量
*/
HeadNode *snows=new HeadNode[maxn];
/*
比较两片雪花是否相等
*/
bool CompareArray( long *d1, long *d2,const long len)
{
int i,j,count,t;
bool flag=false;
count=0;
/*
从数组的头开始判断两个数组是否相等,即两片雪花是否相等
依次以d1数组的第 i(0<=i>=5)个元素作为头依次和d2数组的元素作比较,
只有各个元素都相等时才证明两片雪花相等。
*/
while(count<len)
{
i=count;
for(j=0;j<len;j++)
{
if(d1[i]==d2[j])
{
i++;
if(i>=len)i=0;
}else
{
break;
}
}
if(j>=len)
{
flag=true;
}
if(flag==true)break;
count++;
}
/*
从数组的末尾开始判断两个数组是否相等
*/
if(flag==false)
{
count=len-1;
while(count>=0)
{
i=count;
for(j=0;j<len;j++)
{
if(d1[i]==d2[j])
{
i--;
if(i<0)i=len-1;
}else
{
break;
}
}
if(j>=len)
{
flag=true;
}
if(flag==true)break;
count--;
}
}
return flag;
}
int main(void)
{
long n,c,k,key,index;
int i,j;
long *a;
bool isHasSameSnowFlake;
node *t,*headtemp;
std::cin>>n;
c=getchar();
isHasSameSnowFlake=false;
for(i=0;i<n;i++)
{
//a=new long[6];
t=new node();
t->next=NULL;
key=0;
for(j=0;j<6;j++)
{
k=0;
c='0';
while(c!='\n'&&c!=' ')
{
k=k*10+c-'0';
c=getchar();
}
t->data[j]=k;
key+=k;
}
//qsort(a,6,sizeof(long),Compare);
if(isHasSameSnowFlake==false)
{
index=key%mtemp; //取当前输入的雪花的hash值,通过求6个角的长度的和,然后对mtemp相除取余数,即为其hash值
if(snows[index].elCount>0) //判断已经输入的雪花中是否已经存在拥有相同hash值的雪花
{
headtemp=snows[index].head->next;
while(headtemp!=NULL)
{ //判断拥有相同hash值的雪花是否是两片相同的雪花
isHasSameSnowFlake=CompareArray(headtemp->data,t->data,6);
if(isHasSameSnowFlake==true) break;
headtemp=headtemp->next;
}
if(isHasSameSnowFlake==false)
{
t->next=snows[index].head->next;
snows[index].head->next=t;
snows[index].elCount++;
}
/*t->next=snows[index].head->next;
snows[index].head->next=t;*/
}else
{
snows[index].elCount++;
snows[index].head=new node();
snows[index].head->next=t;
}
}
}
if(isHasSameSnowFlake==false){
std::cout<<"No two snowflakes are alike."<<std::endl;
}else{
std::cout<<"Twin snowflakes found."<<std::endl;
}
return 0;
}
转载于:https://www.cnblogs.com/smile2you/archive/2010/01/26/1656905.html
POJ3349 哈希算法相关推荐
- ELFhash - 优秀的字符串哈希算法
原 ELFhash - 优秀的字符串哈希算法 分类:算法杂论算法精讲数据结构 (1424) (2) 1.字符串哈希: 我们先从字符串哈希说起 在很多的情况下,我们有可能会获得大量的字符串,每个字符串 ...
- 哈希分布与一致性哈希算法简介
前言 在我们的日常web应用开发当中memcached可以算作是当今的标准开发配置了.相信memcache的基本原理大家也都了解过了,memcache虽然是分布式的应用服务,但分布的原则是由clien ...
- 一致性哈希算法以及其PHP实现
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...
- 一致性hash算法虚拟节点_一致性哈希算法——虚拟节点
一致性哈希算法--虚拟节点 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是 ...
- 感知哈希算法——找出相似的图片
参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格 ...
- 用拉链法实现哈希算法的运算
package lirui.find;import java.util.LinkedList;/*** Created by lirui on 14-8-13.* 用拉链法实现哈希算法的运算*/ pu ...
- 五分钟带你了解哈希算法
导读: 当新人在学区块链技术的时候,都会听到哈希和哈希算法,这似乎是无处不在的安全性保证.例如比特币或者以太坊这种运行去中心化网络和共识的机器,都会有上万个节点通过P2P连接,并且需要"无需 ...
- 一次失败的面试,复习一次一致性哈希算法
来自公众号:孤独烟 本文故事绝对真实,如有雷同,绝对不是巧合! 于是呢,烟哥提前十分钟在公司里头找了一个厕所的坑位,然后进去随手一锁门-.(以下省略10000字)- 唉- 我竟然又带薪上厕所了,而且上 ...
- 一致性哈希算法的理解
关于一致性哈希算法,网上有很多博文都有讲解.推荐2个. http://blog.codinglabs.org/articles/consistent-hashing.html http://blog. ...
最新文章
- axure动态登录和html5,Axure8原型设计实战案例:如何实现登录功能?
- js6的未来(二)函数增强
- Spring mvc集成log4j2
- python序列类型-Python序列类型
- python 字典键值重复_浅谈python字典多键值及重复键值的使用
- 人类资产数字化是大势所趋
- pricing data of Service order is copied from BP master data
- MFC学习中遇到的小问题和解决方案
- Linux kill 杀死指定进程
- Linux下的定时器
- 打印机计算机故障或繁忙,为什么打印机可以通过电脑打印可不能扫描呢
- CLion 中使用 clang-format
- 关于C#的数据绑定,存取数据库实例详解 (三)
- 无声也能语音识别?微软这个黑科技有点厉害
- java byte转十六进制_Python 十六进制hexbytesstr之间的转换和Bcc码的生成
- Eclipse上索爱手机开发平台的配置
- Prolog 语言入门教程(转)
- 国家c语言计算机二级,国家计算机二级考试 C语言基本知识.pdf
- 关于chm电子书无法显示网页的解决方
- AJP:斯坦福加速智能神经调控疗法治疗难治性抑郁症
热门文章
- mvc源码解读(10)-ParameterDescriptor方法Action方法的参数描述对象
- 【初学】部署架构相关的一些知识
- ComfortTypingPro快速录入工具
- Hadoop问题解决记录
- Intellij IDEA 自定义方法注释/方法模板
- android支付平台,android移动支付
- python爬取某人所有微博_Python爬取博客的所有文章并存为带目录的word文档(实例67)
- 彻底理解被称为二叉树神级遍历的莫里斯(Morris)算法
- openresty + nginx-http-sysguard 调研使用
- 如何通过js调用接口