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. 百科知识 kux文件如何打开

    即使是官方自带的浏览器也无法打开   你可以直接复制文件名   然后在百度里搜即可   你自己下载的东西还是能转码的      

  2. spring 拦截器拦截点的配置

    实用正则org.springframework.aop.support.RegexpMethodPointcutAdvisor 然后 <property name="advice&qu ...

  3. javascript之Ajax获取和设置标头

    XMLHttpRequest对象中与标头有关的方法: setRequestHeader(<header>,<value>)--用指定值设置标头. getResponseHead ...

  4. flex 节点删除

    <mx:Script>        <![CDATA[            protected function btn1_clickHandler(evt:MouseEvent ...

  5. c#高级编程笔记----委托

    因为定义委托基本上是定义一个新类,所以可以在定义类的任何相同地方定义委托,也就是说,可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在名称空间中把委托定义为顶层对象.根据定义的可见性,和委托 ...

  6. docker安全最佳实践概述

    /************************************************* * Author : Samson * Date : 08/07/2015 * Test plat ...

  7. TI C66x DSP 四种内存保护问题 -之- 针对CPU訪问外存(DDR3 or MSM)时的内存保护问题 - 举例

    在代码维护中遇到过这种问题,CPU訪问了corePac的外部内存空间0x75510C55地址,即CPU向corePac的L2内存控制器发起了对该内存的訪问,然后L2内存控制器将该请求发给corePac ...

  8. Fckeditor常见漏洞的挖掘与利用整理汇总

    查看编辑器版本号 FCKeditor/_whatsnew.html ------------------------------------------------------------- 2. V ...

  9. caffeModels--models-caffes-大全

    caffe的伯克利主页:http://caffe.berkeleyvision.org/caffe的github主页:https://github.com/BVLC/caffe caffe的model ...

  10. Mvc创建并注册防盗链

    创建CustomHandler.JpgHandler public class JpgHandler : IHttpHandler { public void ProcessRequest(HttpC ...