PTA 哈希查找 除留取余法
PTA 电话聊天狂人(25 分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
思路分析:
本题要找通话次数最多的号码,如果这样的号码不唯一,就找最小的号码,想到用哈希表进行存储。
代码如下:
//本题采用除留取余法构造哈希函数,使用分离链表法解决冲突 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream> using namespace std;
#define KEYLENGTH 11 /* 关键词字符串的最大长度 */
typedef char ElementType[KEYLENGTH+]; /* 关键词类型用字符串 */
typedef int Index; /* 散列地址类型 */ #define MAXTABLESIZE 1000000 typedef struct LNode *PtrToLNode;
struct LNode
{
ElementType Data;
PtrToLNode Next;
int cnt;
};
typedef PtrToLNode Position;
typedef PtrToLNode List; typedef struct TblNode *HashTable; /* 散列表类型 */
struct TblNode /* 散列表结点定义 */
{
int TableSize; /* 表的最大长度 */
List Heads; /* 指向链表头结点的数组 */
}; Index Hash(int k, int TableSize ) //哈希函数
{
return k%TableSize; //除留取余法
} int nextPrime(int n) //选取一个产生冲突较少的素数,作为表长
{
int j=n%?n+:n+;
while(j<=MAXTABLESIZE)
{
int i=;
for(i=; i*i<=j; i++)
{
if(!(j%i))
break;
}
if(i*i>j)
return j;
else
j+=; //素数每次加2,减少循环次数
}
}
Position Find(HashTable h,ElementType key,Index k)
{
Position p=h->Heads[k].Next;
while(p&&strcmp(key,p->Data))
{
p=p->Next;
}
return p;
}
void insert(HashTable h,ElementType key)
{
int sum=;
for(int i=; i<; i++)
{
sum=sum*+(key[i]-''); //以第七位到第11位的元素进行哈希
}
Index k=Hash(sum,h->TableSize);
Position p=Find(h,key,k);
if(!p)
{
//使用头插法,提高算法效率
Position newPtr=(Position)malloc(sizeof(LNode));
strcpy(newPtr->Data,key);
newPtr->Next=NULL;
newPtr->cnt=;
newPtr->Next=h->Heads[k].Next;
h->Heads[k].Next=newPtr; }
else
p->cnt++;
}
HashTable BuildTable(int m)
{ HashTable h;
h=(HashTable)malloc(sizeof(TblNode));
//cout<<"111111111111"<<endl;
h->TableSize=nextPrime(m);
h->Heads=(List)malloc(sizeof(LNode)*h->TableSize); for(int i=; i<h->TableSize; i++)
{
h->Heads[i].Next=NULL;
h->Heads[i].cnt=;
}
return h;
} int main()
{
int n,m;
scanf("%d",&n);
m=*n;
ElementType key;
HashTable h=BuildTable(m);
while(m--)
{
scanf("%s",key);
insert(h,key);
}
//cout<<"111111111111"<<endl;
int maxnum=;
int ans=;
for(int i=; i<h->TableSize; i++)
{
Position p=h->Heads[i].Next;
while(p)
{
if(p->cnt>maxnum)
{
maxnum=p->cnt;
strcpy(key,p->Data);
ans=;
}
else if(p->cnt==maxnum)
{
ans++;
if(strcmp(key,p->Data)>)
strcpy(key,p->Data);
}
p=p->Next;
}
//cout<<"111111111111"<<endl;
}
//cout<<"111111111111"<<endl;
printf("%s %d",key,maxnum);
if(ans>)
printf(" %d",ans);
printf("\n");
return ;
} /*
4
13005711862 13588625832
13005711862 13088625832
13588625832 18087925832
13005711862 13588625832 */
坚持不懈地努力才能成为大神!
PTA 哈希查找 除留取余法的更多相关文章
- poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 30529 Accep ...
- 数据结构与算法之PHP查找算法(哈希查找)
一.哈希查找的定义 提起哈希,我第一印象就是PHP里的关联数组,它是由一组key/value的键值对组成的集合,应用了散列技术. 哈希表的定义如下: 哈希表(Hash table,也叫散列表),是根据 ...
- 由HashMap哈希算法引出的求余%和与运算&转换问题
1.引出问题 在前面讲解HashMap 的源码实现时,有如下几点: ①.初始容量为 1<<4,也就是24 = 16 ②.负载因子是0.75,当存入HashMap的元素占比超过整个容量的75 ...
- java学习--高效的除模取余运算(n-1)&hash
没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存中进行计算,然后 ...
- python数据结构与算法 29-1 哈希查找
).称为哈希查找. 要做到这种性能,我们要知道元素的可能位置.假设每一个元素就在他应该在的位置上,那么要查找的时候仅仅须要一次比較得到有没有的答案,但以下将会看到.不是这么回事. 到10. water ...
- python 哈希查找
import random INDEXBOX= #哈希表元素个数 MAXNUM= #数据个数 class Node: #声明链表结构 def __init__(self,val): self.val= ...
- PKU 2002 Squares(二维点哈希+平方求余法+链地址法)
题目大意:原题链接 给定平面上的N个点,求出这些点一共可以构成多少个正方形. 解题思路: 若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标.对于特定 ...
- hash 哈希查找复杂度为什么这么低?
hash 哈希查找复杂度为什么这么低? (2017-06-23 21:20:36) 转载▼ 分类: c from: 作者:jillzhang 出处:http://jillzhang.cnblogs ...
- 高效取余运算(n-1)&hash原理探讨
Java的HashMap源码中用到的(n-1)&hash这样的运算,查找发现这是一种高效的求余数的办法,但其中的原理是什么呢为什么可以这么做呢? 先上结论:假设被除数是x,对于除数是2n的取余 ...
随机推荐
- Kick the ball!(dfs)湖南省赛第十届
Problem K: Kick the ball! Time Limit: 1 Sec Memory Limit: 128 MB Special Judge Submit: 109 Solved ...
- D3.js 制作中国地图 .net 公共基础类
D3.js 制作中国地图 from: http://d3.decembercafe.org/pages/map/index.html GeoJSON is a format for encoding ...
- WPF03(样式)
说起样式,大家第一反应肯定是css,好的,先上一段代码. 1 html{border:0;} 2 ul,form{margin:0; padding:0} 3 body,div,th,td,li,dd ...
- Django1.11.4中文文档
Django管理站点¶ 自动管理界面是Django最强大的部分之一.它从您的模型中读取元数据,以提供一个快速,以模型为中心的界面,让受信任的用户可以管理您网站上的内容.管理员建议的使用仅限于组织的内部 ...
- RabbitMQ的工作模式
简单模式: # #########################基于简单模式的 生产者 ######################### #!/usr/bin/env python import ...
- Android对apk源代码的改动--反编译+源代码改动+又一次打包+签名【附HelloWorld的改动实例】
最近遇到了须要改动apk源代码的问题,于是上网查了下相关资料.编写了HelloWorld进行改动看看可行性,经过实验证明此方案可行,而且后来也成功用这种方法对目标apk进行了改动,仅仅只是须要改动的部 ...
- kubernetes集群管理命令(二)
系列目录 上一节我们介绍了一些基本的命令,这一节我们介绍一些更为复杂的命令. pod排序 使用kubectl get pod获取pod资源默认是以名称排序的,有些时候我们可能希望按其它顺序排序.比如说 ...
- Redis 3.2.4编译安装
1. 下载安装包 wget url tar zxvf redis-3.2.4.tar.gz 2. 编译安装 cd redis-3.2.4/src/ sudo make && make ...
- Java类加载器( 死磕 6)
[正文]Java类加载器( CLassLoader )死磕 6: 自定义网络类加载器 本小节目录 6.1. 自定义网络类加载器的类设计 6.2. 文件传输Server端的源码 6.3. 文件传输C ...
- 可以执行全文搜索的原因 Elasticsearch full-text search Kibana RESTful API with JSON over HTTP elasticsearch_action es 模糊查询
https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html Elasticsearch is a ...