PTA 电话聊天狂人(25 分)

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。

输入格式:

输入首先给出正整数N(≤10​5​​),为通话记录条数。随后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 哈希查找 除留取余法的更多相关文章

  1. poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accep ...

  2. 数据结构与算法之PHP查找算法(哈希查找)

    一.哈希查找的定义 提起哈希,我第一印象就是PHP里的关联数组,它是由一组key/value的键值对组成的集合,应用了散列技术. 哈希表的定义如下: 哈希表(Hash table,也叫散列表),是根据 ...

  3. 由HashMap哈希算法引出的求余%和与运算&转换问题

    1.引出问题 在前面讲解HashMap 的源码实现时,有如下几点: ①.初始容量为 1<<4,也就是24 = 16 ②.负载因子是0.75,当存入HashMap的元素占比超过整个容量的75 ...

  4. java学习--高效的除模取余运算(n-1)&hash

    没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存中进行计算,然后 ...

  5. python数据结构与算法 29-1 哈希查找

    ).称为哈希查找. 要做到这种性能,我们要知道元素的可能位置.假设每一个元素就在他应该在的位置上,那么要查找的时候仅仅须要一次比較得到有没有的答案,但以下将会看到.不是这么回事. 到10. water ...

  6. python 哈希查找

    import random INDEXBOX= #哈希表元素个数 MAXNUM= #数据个数 class Node: #声明链表结构 def __init__(self,val): self.val= ...

  7. PKU 2002 Squares(二维点哈希+平方求余法+链地址法)

    题目大意:原题链接 给定平面上的N个点,求出这些点一共可以构成多少个正方形. 解题思路: 若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标.对于特定 ...

  8. hash 哈希查找复杂度为什么这么低?

    hash 哈希查找复杂度为什么这么低? (2017-06-23 21:20:36) 转载▼   分类: c from: 作者:jillzhang 出处:http://jillzhang.cnblogs ...

  9. 高效取余运算(n-1)&hash原理探讨

    Java的HashMap源码中用到的(n-1)&hash这样的运算,查找发现这是一种高效的求余数的办法,但其中的原理是什么呢为什么可以这么做呢? 先上结论:假设被除数是x,对于除数是2n的取余 ...

随机推荐

  1. 在A页面刷新父框架中的B页面.(window.parent.?.location="")

    window.parent.leftFrame.location='left.jsp?menuid='+menu.id+'&menuname='+menu.title;

  2. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  3. mysql创建还原点

    set autocommit = 0;   insert into t1(name) values ("user1"); savepoint p1;   insert into t ...

  4. 数据挖掘 与 Web开发何去何从

    (0)引子 以下以现实生活中的一个实例引出本博客的探究点.或许类似的情况正发生在你的身边. 小弟工作5年了,近期有点迷茫. 上一份工作在一家比較大的门户站点做web开发和移动互联网数据挖掘(人手比較紧 ...

  5. JAVA传输概念

    1.VO(View Object):视图对象,用于展示在前台界面. 2.DTO(Data Transfer Object):数据传输对象,泛指用于展示层与服务层之间的数据传输对象. 3. DTO和VO ...

  6. YUV格式

    http://blog.csdn.net/u011270282/article/details/50696616 http://blog.csdn.net/acs713/article/details ...

  7. kubernetes对象之secrets

    系列目录 Secrets是Kubernetes中一种对象类型,用来保存密码.私钥.口令等敏感信息.与直接将敏感信息嵌入image.pod相比,Secrets更安全.更灵活,用户对敏感信息的控制力更强. ...

  8. kubernetes之计算机资源管理

    系列目录 当你编排一个pod的时候,你也可以可选地指定每个容器需要多少CPU和多少内存(RAM).当容器请求特定的资源时,调度器可以更好地根据资源请求来确定把pod调度到哪个节点上.当容器请求限制特定 ...

  9. mysql_num_rows

    mysql记录总条数 $sql3 = "select * from inviter where tuijianren = '$session' "; $res3 = mysql_q ...

  10. Oracle中Hint深入理解

    Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...