SDUT1480数据结构实验:哈希表(链地址法处理)

来源:互联网 发布:混沌遗传算法 编辑:程序博客网 时间:2024/06/04 00:58

数据结构实验:哈希表
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss
Problem Description

在n个数中,找出出现次数最多那个数字,并且输出出现的次数。如果有多个结果,输出数字最小的那一个。
Input

单组数据,第一行数字n(1<=n<=100000)。
接下来有n个数字,每个数字不超过100000000
Output

出现次数最多的数字和次数。
Example Input

3
1 1 2
Example Output

1 2
Hint

Author

cz

PS:
通过不断地将大于100000的数,与100000取余,规整到一个个链表之中,以减少查找次数,提高查找效率。

比如 我现在有 2,100002,100000002,这三个数字,那么对100000取余后都为2,这时我们就有一个head[2]的链表,存储顺序为head[2] -> 2 -> 100002 -> 100000002;即将取余为2的数字本身,全部存放在head[2]的next值域中,层层叠加。

AC Code:

#include<bits/stdc++.h>using namespace std;struct node{    int data;//数据本身,key值;    int cnt;//计数器;    node *next;}*head[100101];int key,n,Max = 0, num = 0;//Max为当前最大数字出现的数量,num为最大数;void clean()//清空,初始化;{    for(int i=0; i<100000; i++)    {        head[i]=(struct node *)malloc(sizeof(struct node));        head[i]->next=NULL;    }//初始化链表的头}void creat(int key){    int y = key %100000;    node *p, *q;    p = head[y] -> next;    q = head[y];    while(p != NULL)    {        if(p -> data == key)//相同就+1;        {            p -> cnt++;            if(Max < p -> cnt)//记录个数            {                Max = p -> cnt;                num = p-> data;            }            else if(Max == p-> cnt)//如果个数相同,比较大小,根据题意要小的            {                if(num > p-> data)                {                    num = p->data;                }            }            break;        }        q = p;        p = p -> next;//循环查找,到NULL若是还没有找到,执行下面的if    }    if(p == NULL)//没找到就说明还没有,那就直接赋值呗;    {        node *r;        r = new node;        r -> data = key;        r -> cnt = 1;        if(Max < r -> cnt)//赋值时也别忘了比较        {            Max = r->cnt;            num = r->data;        }        else if(Max == r -> cnt)        {            if(num > r -> data)            {                num = r -> data;            }        }        q -> next = r;//接到链表后边        r -> next = NULL;    }}int main(){    clean();    cin>>n;    for(int i = 0; i < n; i++)    {        cin>>key;        creat(key);    }    cout<<num<<" "<<Max<<endl;    return 0;}
原创粉丝点击