问题分析

在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 哈希算法相关推荐

  1. ELFhash - 优秀的字符串哈希算法

    原 ELFhash - 优秀的字符串哈希算法 分类:算法杂论算法精讲数据结构 (1424)  (2) 1.字符串哈希: 我们先从字符串哈希说起 在很多的情况下,我们有可能会获得大量的字符串,每个字符串 ...

  2. 哈希分布与一致性哈希算法简介

    前言 在我们的日常web应用开发当中memcached可以算作是当今的标准开发配置了.相信memcache的基本原理大家也都了解过了,memcache虽然是分布式的应用服务,但分布的原则是由clien ...

  3. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

  4. 一致性hash算法虚拟节点_一致性哈希算法——虚拟节点

    一致性哈希算法--虚拟节点 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是 ...

  5. 感知哈希算法——找出相似的图片

    参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格 ...

  6. 用拉链法实现哈希算法的运算

    package lirui.find;import java.util.LinkedList;/*** Created by lirui on 14-8-13.* 用拉链法实现哈希算法的运算*/ pu ...

  7. 五分钟带你了解哈希算法

    导读: 当新人在学区块链技术的时候,都会听到哈希和哈希算法,这似乎是无处不在的安全性保证.例如比特币或者以太坊这种运行去中心化网络和共识的机器,都会有上万个节点通过P2P连接,并且需要"无需 ...

  8. 一次失败的面试,复习一次一致性哈希算法

    来自公众号:孤独烟 本文故事绝对真实,如有雷同,绝对不是巧合! 于是呢,烟哥提前十分钟在公司里头找了一个厕所的坑位,然后进去随手一锁门-.(以下省略10000字)- 唉- 我竟然又带薪上厕所了,而且上 ...

  9. 一致性哈希算法的理解

    关于一致性哈希算法,网上有很多博文都有讲解.推荐2个. http://blog.codinglabs.org/articles/consistent-hashing.html http://blog. ...

最新文章

  1. axure动态登录和html5,Axure8原型设计实战案例:如何实现登录功能?
  2. js6的未来(二)函数增强
  3. Spring mvc集成log4j2
  4. python序列类型-Python序列类型
  5. python 字典键值重复_浅谈python字典多键值及重复键值的使用
  6. 人类资产数字化是大势所趋
  7. pricing data of Service order is copied from BP master data
  8. MFC学习中遇到的小问题和解决方案
  9. Linux kill 杀死指定进程
  10. Linux下的定时器
  11. 打印机计算机故障或繁忙,为什么打印机可以通过电脑打印可不能扫描呢
  12. CLion 中使用 clang-format
  13. 关于C#的数据绑定,存取数据库实例详解 (三)
  14. 无声也能语音识别?微软这个黑科技有点厉害
  15. java byte转十六进制_Python 十六进制hexbytesstr之间的转换和Bcc码的生成
  16. Eclipse上索爱手机开发平台的配置
  17. Prolog 语言入门教程(转)
  18. 国家c语言计算机二级,国家计算机二级考试 C语言基本知识.pdf
  19. 关于chm电子书无法显示网页的解决方
  20. AJP:斯坦福加速智能神经调控疗法治疗难治性抑郁症

热门文章

  1. mvc源码解读(10)-ParameterDescriptor方法Action方法的参数描述对象
  2. 【初学】部署架构相关的一些知识
  3. ComfortTypingPro快速录入工具
  4. Hadoop问题解决记录
  5. Intellij IDEA 自定义方法注释/方法模板
  6. android支付平台,android移动支付
  7. python爬取某人所有微博_Python爬取博客的所有文章并存为带目录的word文档(实例67)
  8. 彻底理解被称为二叉树神级遍历的莫里斯(Morris)算法
  9. openresty + nginx-http-sysguard 调研使用
  10. 如何通过js调用接口