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. 今天遇到一个git码云同步的问题

    一开始是因为eclipse编码不同意导致乱码,所以我和师弟就想统一都用UTF-8的,师弟统一好了,让我pull一下,pull的时候有冲突,因为我和师弟都修改了其中一个文件,然后我这边就删除了那个文件再 ...

  2. 我的Android进阶之旅------&gt;Android中android:windowSoftInputMode的使用方法

    面试题:怎样在显示某个Activity时马上弹出软键盘? 答案:在AndroidManifest.xml文件里设置<activity>标签的android:windowSoftInputM ...

  3. qt的下载链接

    http://download.qt.io/archive/qt/5.8/5.8.0/ http://download.qt.io/archive/qt/ http://download.qt.io ...

  4. JavaScript事件在WebKit中的处理流程研究

    本文主要探讨了JavaScript事件在WebKit中的注冊和触发机制. JS事件有两种注冊方式: 通过DOM节点的属性加入或者通过node.addEventListener()函数注冊: 通过DOM ...

  5. 升级svn 到1.7

    sudo yum update sudo yum groupinstall "Development tools" sudo yum groupinstall "Addi ...

  6. ACM-BFS之Open the Lock——hdu1195(双向BFS)

    这道题的0基础版本号,暴力BFS及题目详情请戳:http://blog.csdn.net/lttree/article/details/24658031 上回书说道,要用双向BFS来尝试一下. 最终A ...

  7. 初识kbmmw 中的smartbind功能

    关于kbmmw smartbind 的开发原因及思路,大家可以参见官方的博客说明和红鱼儿的翻译. 今天我就实例操作一下,给大家演示一下具体实现. 我们新建一个工程 放几个基本的控件 在单元里面加上引用 ...

  8. 九度OJ 1135:字符串排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1559 解决:807 题目描述: 先输入你要输入的字符串的个数.然后换行输入该组字符串.每个字符串以回车结束,每个字符串少于一百个字符. 如 ...

  9. parameters arguments 形式参数 实际参数

    parameter和argument的区别 – 笑遍世界 http://smilejay.com/2011/11/parameter_argument/ https://en.wikipedia.or ...

  10. Hadoop实战-MapReduce之max、min、avg统计(六)

    1.数据准备: Mike,35 Steven,40 Ken,28 Cindy,32 2.预期结果 Max 40 Min 28 Avg      33 3.MapReduce代码如下 import ja ...