总结哈希链表储存冲突

本文探讨了在哈希表中使用链表处理冲突的问题,详细解析了一次因忽视细节导致错误的经历,强调了在处理多个结果时找到最小值的重要性。内容包括数据结构实验、时间限制和内存限制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 出错原因:      这个题寒假的时候做过,当时用的线性探测再散列处理的冲突,这次用链表做,花了好长时间老是WA,原因是出在了没有注意细节上,题目上要求的多个结果时输出最小的注意到。

 

 

***************************************************我是华丽的分割线************************************************************

数据结构实验:哈希表

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

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

输入

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

输出

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

示例输入

3
1 1 2

示例输出

1 2
代码(链表):

#include<stdio.h>

#include<stdlib.h>

struct node

{

    int data;

    int cs;

    int zf;

    struct node*next;

}*H[100005],*p,*q;

int main()

{

    int a,n,m,i,zf,qy,bs,flag;

    scanf("%d",&n);

    for(i=0;i<n;i++)

    {

        zf=1;

        scanf("%d",&a);

        if(a<0)//可能出现负数

        {

            zf=-1;

        }

        a=a*zf;

        qy=a%100000;

        bs=a/100000;

        if(H[qy]==NULL)

        {

            H[qy]=(struct node *)malloc(sizeof(struct node));

            H[qy]->next=NULL;

        }

        p=H[qy];

        if(H[qy]->next!=NULL)

        {

            p=p->next;

            if(p->data==bs && p->zf==zf)

            p->cs++;

        }

        if(p->data!=bs || p->zf!=zf)

        {

            while(p->next!=NULL)

            {

                p=p->next;

            }

            q=(struct node *)malloc(sizeof(struct node));

            q->data=bs;

            q->zf=zf;

            q->cs=1;

            q->next=NULL;

            p->next=q;

            p=q;

        }

 

    }

    int max[2]={0};

    for(i=0;i<100005;i++)

    {

        if(H[i]!=NULL)

        {

        p=H[i];

        while(p->next!=NULL)

        {

            p=p->next;

            if(p->cs>max[0])

            {

                max[0]=p->cs;

                max[1]=(p->data*100000+i)*(p->zf);

            }

            if(p->cs==max[0])

            {

                if(max[1]>(p->data*100000+i)*(p->zf))

                    max[1]=(p->data*100000+i)*(p->zf);

            }

        }

        }

    }

    printf("%d %d",max[1],max[0]);

    return 0;

}

 

 

***************************************************我要分割!!!!!*****************************************************************
 代码(普通哈希):
#include<stdio.h>
int k[110002][4]={0};
int main()
{
    int a,b,d,e,bj,zf;
    int c;
    int max [4]={-1};
    scanf("%d",&a);
    for(b=0;b<a;b++)
    {
        zf=1;
        scanf("%d",&c);
        if(c<0)
            {
                zf=-1;
                c=c*zf;
            }
        d=c%100000;
        bj=d;
        e=c/100000;
        while(k[d][0]!=0 && (e!=k[d][1] || zf!=k[d][3]))
            d++;
            k[d][0]++;
            k[d][1]=e;
            k[d][2]=bj;
            k[d][3]=zf;
        if(k[d][0]>max[0])
        {
            max[0]=k[d][0];
            max[1]=k[d][1];
            max[2]=k[d][2];
            max[3]=k[d][3];
        }
    }
    printf("%d %d",(max[1]*100000+max[2])*max[3],max[0]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值