数据结构之哈希表--预习篇

数据结构实验:哈希表

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

题目描述

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

输入

单组数据,第一行数字n(1<=n<=100000)。

接下来有n个数字,每个数字不超过100000000

输出

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

示例输入

3
1 1 2

示例输出

1 2

首先声明本渣还没学会哈希,这篇就当哈希的预习篇吧 写的不好大家见谅

首先说一下我最初的思路,因为要统计出现次数,所以第一反应是对于每一个数字对应一个键值,我们建这么一个数组 h[10000000] 比如对于输入这么一串数字1 2 2 4 9 其中1对应h[1] 2对应h[2] 4对应h[4] 总结一下就是i 对应 h[i], 每扫到一个数字i ,h[i]++,那么最终就会统计完所有数字出现的数字  but,当我提交了之后意料之中的没有过,怎么回事?超内存了,是的我们可以看到每一个数字的范围是在一亿以内,就意味着我们需要声明一个一亿大小的h[],但实际上只有10000个数字,会有大量的空间用不到,怎么办呢?书上说可以对一个大的素数取余,但那样的话就会产生冲突了,不难想象吧,比如还是上面那串数字,假设h[]大小为5(对5取余),那么数字4
和数字9都会对应同一个键值 h[4]

怎么办?书上说要将hash表的每一个位置做成一个链表(原谅我 我没看懂,暑假我要好好学数据结构!)难道就不能做了吗,网上看到某大牛的解法(大牛好像都不爱写解题报告,意识流选手orz),看了半天终于算是看出点道道来了 在说之前,先讲两个函数(STL模板里面的)我也是现学的,一个是upper_bound(a,a+n,a[i]) 他返回容器里面第一个大于a[i]的元素的下标,另一个是lower_bound(a,a+n,a[i])
返回容器里面第一个大于等于a[i]的元素的下标 还是看上面的那串数字(已sort) 1 2 2 4 9 upper 返回值依次是1 3 3 4 5(注意最后一个,数组会越界) lower的返回值依次是0
1 1 3 4 然后另upper-lower 得到 1 2 2 1 1 仔细观察 他们是不是正是对应位置数字出现的次数?这算不算也是一种哈希?这样 有多少个数字我们就可以只声明多大的数组就可以了。

数据结构之哈希表--预习篇,布布扣,bubuko.com

时间: 2024-08-26 07:46:21

数据结构之哈希表--预习篇的相关文章

【算法与数据结构】哈希表-链地址法

哈希表的链地址法来解决冲突问题 将所有关键字为同义词的记录存储在同一个线性链表中,假设某哈希函数产生的哈希地址在区间[0, m - 1]上,则设立一个至振兴向量 Chain  ChainHash[m]; 数据结构 //链表结点 typedef struct _tagNode { int data; //元素值(关键字) struct _tagNode* next; //下一个结点 }Node, *PNode; //哈希表结点 typedef struct _tagHashTable { //这里

浅谈算法和数据结构: 十一 哈希表

在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是他们在平均以及最差情况下的时间复杂度: 可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度. 那么有没有查找效率更高的数据结构呢,答案就是本文接下来要介绍了散列表,也叫哈希表(Hash Table) 什么是哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 哈希的思路很简单

数据结构 之 哈希表

1.什么是哈希表? 哈希表是一种数据结构,它可以提供快速的插入和删除操作.如果存储在哈希表中的数据较好的满足了哈希表的要求,那么在哈希表中执行插入和操作只需要接近常量的时间,即时间复杂度为o(1),但哈希表也不是十全十美的,它也存在着缺点,这都会在下面慢慢谈到. 2.哈希表的存储方式 哈希表是通过数组来存储数据的,但数据并不是直接放入数组中(直接放入就是数组存储啦!).说到这里就需要谈到哈希化,而哈希表的核心部分,我认为就是哈希化了:简而言之,将数据插入哈希表中的数组的相应位置的规则,就是哈希化

浅谈数据结构:哈希表

一.  基本概念 哈希表(hash table )是一种根据关键字直接访问内存存储位置的数据结构,通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数 二.哈希表的构造方法 假设要存储的数据元素个数是n,设置一个长度为m(m > n)的连续存储单元,分别以每个数据元素的关键字Ki(0<=i<=n-1)为自变量,通过哈希函数hash(Ki),把Ki映射为内存单元的某个地址hash(Ki),并将数据元素存储在内存单元中 从数学的角度看,哈

【经典数据结构】哈希表

哈希表的基本概念 哈希表,也叫散列表,它是基于快速存取的角度设计的,是一种典型的“空间换时间”的做法.哈希表是普通数组的一种推广,因为数组可以直接寻址,故可在O(1)时间内访问数组的任意元素. 哈希表是根据关键字(Key Value)而直接进行访问的数据结构.也就是说,它将关键字通过某种规则映射到数组中的某个位置,以加快查找的速度.这个映射规则称为哈希函数(散列函数),存放记录的数组称为哈希表.哈希表建立了关键字和存储地址之间的一种直接映射关系. 若多个不同的关键字通过哈希函数计算得到相同的数组

数据结构是哈希表(hashTable)

哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构.也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度.这个映射函数称为哈希函数(也称为散列函数),映射过程称为哈希化,存放记录的数组叫做散列表.比如我们可以用下面的方法将关键字映射成数组的下标:arrayIndex = hugeNumber % arraySize. 哈希化之后难免会产生一个问题,那就是对不同的关键字,可能得到同一个散列地址,即同一个数组下标,这种现象称为冲突,那么我们该如何去处理冲

程序员,你应该知道的数据结构之哈希表

哈希表简介 哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1),因为哈希表的查找速度非常快,所以在很多程序中都有使用哈希表,例如拼音检查器. 哈希表也有自己的缺点,哈希表是基于数组的,我们知道数组创建后扩容成本比较高,所以当哈希表被填满时,性能下降的比较严重. 哈希表采用的是一种转换思想,其中一个中要的概念是如何将键或者关键字转换成数组下标?在哈希表中,这个过程有哈希函数来完成,但是并不是每个键或者关键字都需

数据结构【哈希表】

哈希表(Hash Table)基本概念 哈希表(Hash Table)是一种根据关键字(Key value)直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种映射对应关系,这个映射函数叫做散列函数,存放数据的数组叫做散列表. 哈希函数构造方法 哈希表的构造方法是: 假设要存储的数据元素个数为n,设置一个长度为m(m≥n)的连续存储单元,分别以每个数据元素的关键字 Ki(0<= i <=n-1) 为自变量,通过哈希函数 hash(Ki) 把 Ki 映射

【数据结构】哈希表的线性探测算法

构造哈希表常用的方法是: 除留余数法--取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址.HashKey= Key % P. 直接定址法--取关键字的某个线性函数为散列地址HashKey= Key 或 HashKey= A*Key + BA.B为常数. 我在这里主要使用一下除留余数法Hash(key) =Key%P,(P这里是哈希表的长度)p最好是素数考虑降低哈希冲突的原因,我并没有在这上面过于追究此处哈希表长度10,见线性探测图. 哈希表经常遇到的一个问题就是哈希冲突. 哈希冲突