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的取余 ...
随机推荐
- ZYThumbnailTableView---堪比一个小型阅读App
Demo github地址: https://github.com/liuzhiyi1992/ZYThumbnailTableView 原文地址:http://zyden.vicp.cc/zythum ...
- ubuntu 下的中文输入法的安装和配置- ibus
ibus输入法 Chinese语言包安装 首先需要给Ubuntu16.04安装Chinese语言包支持. 如上图点击其中的Install/Remove Languages…,这个对话框是通过syst ...
- GreenPlum 安装方法详解
一.安装环境准备 1.磁盘环境准备 磁盘分区典型配置如下: 文件系统 文件格式 大小 / ext3 50GB,Linux系统的根目录,所有的目录都挂在这个目录下面,建议大小为 ...
- linux下安装jdk(转载)
http://blog.csdn.net/hzqnju/article/details/6779556 http://blog.csdn.net/gxy3509394/article/details/ ...
- oracle 10g 数据库与客户端冲突导致实例创建无监听问题
同事在oracle 10g上创建一个实例,快结束时弹出一个错误,提示监听失败之类.查看服务,并无生成监听服务.于是删除重来,一连试了好几次,都是如此. 这真是令人心烦意乱.提示里面有说到端口1521, ...
- 【LeetCode】Search in Rotated Sorted Array II(转)
原文链接 http://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/ http://blog.csdn.net/linhuan ...
- Chain of Responsibility Pattern
1.Chain of Responsibility模式:将可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求(可能需要提供一个默认处理所有请求的类,例如MFC中的Cwin ...
- wifi 协议栈的历史的总结
google 了一下找到下面的网页关于wifi 协议栈的说明 https://www.lifewire.com/wireless-standards-802-11a-802-11b-g-n-and-8 ...
- Python序列——字符串
字符串 1 string模块预定义字符串 2 普通字符串与Unicode字符串 3 只适用于字符串的操作 4 原始字符串 5 Unicode字符串操作符 内建函数 1 标准类型函数与序列操作函数 2 ...
- extjs grid renderer参数用法
今天在导出EXT的二维时老是报错,追进去看是renderer : function(value)的参数不对,经过一番研究,未免以后遇到再次浪费时间,记录一下. var cm = new Ext.gri ...