查找 --- 哈希优化

<传送门>

【题目大意】

每片雪花都有6条arm,每条arm都有自己的长度,现在给你n个雪花,判断其中有没有同构的雪花。

同构的含义:每片雪花都可以旋转,而且可以前后翻转,只要满足6条arm相等且一一对应就是同构。

【题目分析】

哈希表拉链法,如果没找到和当前雪花相同的雪花则将该雪花存入哈希表,等待下次查找,如果找到相同的雪花则输出。

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;

typedef struct node
{
int num[6];
node *next;
node()
{
for (int i = 0; i < 6; i++)
{
num[i] = -1;
}
next = NULL;
}
}Node;

int main()
{
int n, sum, num[6];
Node nodes[10000];
bool flag = false;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
sum = 0;
for (int j = 0; j < 6; j++)
{
scanf("%d", &num[j]);
sum += num[j];
}
if (!flag)
{
sort(num, num + 6);
Node *pnode = &nodes[sum % 10000];
while(pnode->next != NULL && !flag)
{
pnode = pnode->next;
for (int j = 0; j < 6; j++)
{
if (pnode->num[j] != num[j])
{
break;
}
else
{
if (pnode->num[j] == num[j] && j == 5)
{
flag = true;
}
}
}
}
Node *newnode = new Node;
for (int j = 0; j < 6; j++)
{
newnode->num[j] = num[j];
}
pnode->next = newnode;
}
}
if (flag)
{
printf("Twin snowflakes found.\n");
}
else
{
printf("No two snowflakes are alike.\n");
}
return 0;
}

其实这题暴力也能过,而且超简单。

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct Node
{
int a,b,c,d,e,f;
};
Node node[100010];
int a[6];
bool cmp(Node x,Node y)
{
if(x.a!=y.a)
return x.a<y.a;
else if(x.b!=y.b)
return x.b<y.b;
else if(x.c!=y.c)
return x.c<y.c;
else if(x.d!=y.d)
return x.d<y.d;
else if(x.e!=y.e)
return x.e<y.e;
else return x.f<y.f;
}

int main()
{
int T;
int i,j,k;
scanf("%d",&T);
for(i=0;i<T;i++)
{
for(j=0;j<6;j++)
{
scanf("%d",&a[j]);
}
sort(a,a+6);
node[i].a=a[0];
node[i].b=a[1];
node[i].c=a[2];
node[i].d=a[3];
node[i].e=a[4];
node[i].f=a[5];
}
sort(node,node+T,cmp);
bool flag=0;
for(i=0;i<T-1;i++)
{
if(node[i].a==node[i+1].a&&node[i].b==node[i+1].b&&node[i].c==node[i+1].c&&node[i].d==node[i+1].d&&node[i].e==node[i+1].e&&node[i].f==node[i+1].f)
{
printf("Twin snowflakes found.\n");
flag=1;
break;
}
}
if(!flag)
printf("No two snowflakes are alike.\n");
return 0;
}

查找 --- 哈希优化

时间: 2024-09-30 07:30:08

查找 --- 哈希优化的相关文章

POJ2002 二分查找&amp;哈希

问题重述: 给定整数n,以及n个点的坐标xi, yi.求这n个点可以组成的正方形的数目(每个点可重复使用). 分析: 根据正方形的性质,给定两个点就能确定可能构成的两个正方形的另外两个顶点.因此,只需要遍历所有点中的两个顶点,计算出可构成正方形的另外两个顶点的坐标,再在已知点中查找这两个点是否存在即可算出正方形数目. AC代码: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #inclu

查找--------哈希表的原理

这段时间 在 准备软件设计师考试    目的是想复习一下  自己以前没怎么学的知识    在这个过程中  有了很大的收获  对以前不太懂得东西  在复习的过程中  有了很大程度的提高 比如在复习 程序语言的时候    对编译程序的处理过程和文法分析 有了全新的了解 作为一个半路出家  没学过程序语言这门课的我来说   有一种醍醐灌顶的感觉   以前在看 javaweb技术内幕是 对里面提的javac 的编译原理  看的真的是 云里雾里   哈哈哈   想想 也是醉了  最基础的程序语言 都没有看

顺序表查找算法及其优化

顺序查找算法实现如下: var arr = [5, 2, 4, 3, 1] , sequentialSearch = function(arr, val) { var i = 0 , len = arr.length; for ( ; i < len; i++) { // 比较一次 if (arr[i] === val) { // 比较二次 return i; } } return i; // 返回len,则说明查找失败 } 这里并不是足够完美, 因为每次循环时都需要对i是否越界, 即是否小于l

成正态分布的查找算法(优化二分法)

  在一个有序静态表中查找某个数值,其表中概率呈现正态分布,但是数据的中心却不是在数据的中点取得,如何得到最优算法.代码如下://判断是否在这个区间函数 bool check(int number) void callfunction(int min,int max) {  int temp=0;//中间变量  bool flag=check(max);     while(flag)  {   min=max;   max=2*min;  }  while(min<max)  {   temp

数据结构—散列表查找(哈希)

顺序表查找某个关键字的记录时,要从表头开始,挨个的比较a[i]与key的值时"="还是"≠",直到相等才返回i,表示查找成功,例如我们可以通过a[i]与key相比结果的 大或者小来进行折半查找到序列的下标:再通过顺序存储的存储位置计算法:LOC (ai)=LOC(a1)+(i-1)×c,得到内存地址,此时发现为了查找到结果,""比较"都是不可避免的,但是真的有必要吗?能否直接通过关键字Key找到记录的内存地址呢?答案是有的! 散列表概念

查找——图文翔解HashTree(哈希树)

引 在各种数据结构(线性表.树等)中,记录在结构中的相对位置是随机的.因此在机构中查找记录的时需要进行一系列和关键字的比较.这一类的查找方法建立在"比较"的基础上.查找的效率依赖于查找过程中所进行的比较次数. 之前我们介绍的各种基于比较的树查找算法,这些查找算法的效率都将随着数据记录数的增长而下降.仅仅是有的比较慢(时间复杂度为O(n)),有的比较快(时间复杂度是O(logn))而已.这些查找算法的平均查找长度是在一种比较理想的情况下获得的.在实际应用当中,对数据结构中数据的频繁增加和

linux内核哈希查找(1)

在内核中,查找是必不可少的,比如说内核管理这么多用户进程,现在要快速定位某一个进程,这儿需要查找,还有,一个进程的地址空间中有多个虚存区,内核要快速定位进程地址空间的某个虚存区,这儿也需要查找,等等.其中用的最多就是基于树的查找-------->红黑树.和基于计算的查找------->哈希查找.两者的查找的效率高,而且适应内核的情况,而基于线性表的查找-------->二分查找,尽管效率高但不能适应内核里面的情况,现在版本的内核几乎不可能使用数组管理一些数据,这太原始了.而二分查找必须使

[Codevs 1230]元素查找(手写哈希表)

题目连接:http://codevs.cn/problem/1230/ 说白了就是要我们自己手写一个哈希表的数据结构来实现添加和查找功能,map也能直接过(我第一次写就是用map骗AC的) 提一下个人理解的哈希表的实现(下面说的是线性寻址法),如果有误还请各位大神不吝指教 用一个数组模拟哈希表,函数f(x)=数字x在哈希表中出现的下标的最小可能值,一般f(x)=x mod t,t就是哈希表的长度 下面就是一个哈希表的示例,如果遍历哈希表时指针走出了哈希表的终点,就进入起点重新遍历 对于每次向哈希

9-12-哈希查找表/散列表-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 哈希查找表/散列表 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包