POJ3349总结(第一次用hash解决问题)
2017-09-11 14:01
232 查看
POJ3349(第一次用hash解决问题)
解题思路
1.题目意思比较简单,就是给出一组雪花的数据,然后判断这组雪花里边有没有相同的雪花。也就是判断是否存在两个数组,其所有元素都相同。2.1暴力破解的思路当然很简单了,每输入一个雪花数据,都将其与已输入数据进行比较;如果存在有相等的,那么就输出“twin snowflakes fount”;否则就继续输入。
2.2第二步中的比较过程则是将两个数组排序后比较对应位。
3.上述思路的代码交上去是time limit exceeded。
4.1这个题目利用hash则会大大提高效率
4.2首先计算一个雪花的hash值,然后将这个雪花放在hash链表的相应位置。如果之前已有相同hash值得雪花存在,那么再把当前雪花与所有已存在的同hash值雪花进行比较。如果没有相同hash值雪花,则说明目前没有与该雪花信息相同的。
4.3上述的hash函数是自定义的,主要目的是将大量的雪花先分堆,然后再进行比较。(因为大量的排序和比较是很耗费时间的,所以hash函数的计算最好是简单却又能将数据分开的)
注意点
1.结构体的定义中。如果当前结构体内部的变量有该结构体类型的指针、或引用了其他结构体,那么被引用的内容需要提前定义或声明。2.在比较过程中会使用到链表,这里一定要注意逻辑明晰。如下代码,写错的话有可能会出现当前结点最后会和自己进行比较等问题。
while(p!=NULL) { //printf("%d%d%d%d%d%d\n",p->info[0],p->info[1],p->info[2],p->info[3],p->info[4],p->info[5]); for(i=0;i<6;i++) { if(p->info[i]!=a->info[i]) { break; } } if(i==6) { return true; } pre=p; p=p->next; } pre->next=a;
3.hash计算的时候,取模后计算再取模比较好。防止计算后数过大产生溢出。
int toHash(p_Flake a) { int sum=0; for(int i=0;i<6;i++) { sum+=(a->info[i])%100000; } return sum%100000; }
代码
#include<stdio.h>
#include<stdlib.h>
typedef struct SnowFlake{
int info[6];
SnowFlake* next;
}*p_Flake;
#define max 100000
p_Flake hashArray[100000]={NULL};
int toHash(p_Flake a);
bool insertToHash(p_Flake a, int aHash);
void sort(p_Flake a);
int main()
{
int N=0;
scanf("%d",&N);
int flag=0;
for(int k=0;k<N;k++)
{
p_Flake a=NULL;
a=(p_Flake)malloc(sizeof(SnowFlake));
a->next=NULL;
scanf("%d%d%d%d%d%d",a->info,a->info+1,a->info+2,a->info+3,a->info+4,a->info+5);
if(flag==0)
{
if(insertToHash(a,toHash(a))==true)
{
flag=1;
}
}
}
if(flag==1)
{
printf("Twin snowflakes found.\n");
}
else
{
printf("No two snowflakes are alike.\n");
}
return 0;
}
void sort(p_Flake a)
{
for(int i=0;i<6;i++)
{
for(int j=0;j<6-i-1;j++)
{
if(a->info[j+1]<a->info[j])
{
int swap=a->info[j+1];
a->info[j+1]=a->info[j];
a->info[j]=swap;
}
}
}
}
bool insertToHash(p_Flake a, int aHash)
{
int i=0;
sort(a);
if(hashArray[aHash]==NULL)
{
hashArray[aHash]=a;
return false;
}
p_Flake pre=NULL;
p_Flake p=hashArray[aHash];
while(p!=NULL)
{
for(i=0;i<6;i++)
{
if(p->info[i]!=a->info[i])
{
break;
}
}
if(i==6)
{
return true;
}
pre=p;
p=p->next;
}
pre->next=a;
r
4000
eturn false;
}
int toHash(p_Flake a) { int sum=0; for(int i=0;i<6;i++) { sum+=(a->info[i])%100000; } return sum%100000; }
相关文章推荐
- ASP.NET 状态服务 及 session丢失问题解决方案总结
- 解决Win7中第一次HttpWebRequest连接缓慢、超时等问题
- Cloudera Manager5安装总结遇到问题及解决办法
- 各种问题解决方案总结【记录】(持续更新)
- 每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享
- 解决Glide加载圆形图片,第一次只显示点位图的问题
- 中文乱码问题解决方法总结
- clistctrl知识点总结、文件打开弹框以及一些小问题的解决
- IE6-IE9兼容性问题列表及解决办法总结
- Struts1小案例问题教训总结(含中文乱码问题及解决)
- 习惯的养成—在解决问题的过程中提炼需要总结地地方(Linux 输入框架问题)
- 解决Eclipse闪退问题的方法总结
- 小型网站编写经验总结、出现的问题及解决办法总汇
- mysql数据乱码问题原因及解决(总结篇)
- com/android/dx/command/dexer/Main:Unsupported major.minor version 52.0 问题的解决方法总结
- log4j2的详细使用及问题解决[总结]
- 近期问题解决方案总结
- LoadRunner出现error问题及解决方法总结[转载]
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- 长连接心跳问题解决总结