`
yzmduncan
  • 浏览: 330338 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

哈希表在查找中凸显的作用

阅读更多

    哈希表是存储的是键值对,给出一个键值,哈希表可以在O(1)的时间复杂度查询。也就是说,它通过把关键码值映射到一个表中的一个位置来记录,加快查找速度。这个函数叫散列函数,存放记录的数组叫散列数组。

    构造查询效率高的散列表基于以下两个方面:构造散列函数的方法和处理冲突的方法。

    构造散列函数,即哈希函数,好的哈希函数,能使冲突和空间降低。一般有直接寻址法,折叠法,除留余数法。在ACM中,见到的字符串hash函数ELFHash。一般采用除留余数法。

    处理冲突的方法也有很多:线性探测,链地址法等等。一般采用链地址法。

    在ACM中只要设计大规模(10,000以上)的查找问题,首先应该想到hash。

    例如POJ2503,给出一串单词+对应的英文,任意给出一个单词,要你查出它的英文。

输入:

dog ogday
cat atcay
pig igpay
froot ootfray
loops oopslay

atcay
ittenkay
oopslay

 

输出:

cat
eh
loops

    输入的有10W对,要是每次都从这10W的数据线性比较O(n),每次查询一个单词需要20*100000。查询多个单词,显然效率太低。还可以想到用二分,将输入的数据按照单词排序,查询就只需要log2(n),每次查询一个单词需要20*25。

    还可以将单词hash,哈希函数采用ELFHash,冲突处理采用链表法,这样,对于要查询的单词,先hash,再在hash表中查看,匹配是否相等。只需要O(1)。

从上面的三种算法来看,时间复杂度由O(n)-->O(log2n)-->O(1),可见二分查找还是很牛B的,但hash更强。

 

    对于POJ2002,给出n个点的坐标(n=1000,-20000<=x,y<=20000),现在要判断这些点能构成多少个正方形。

    首先是如何判断几个点能否构成正方形:从n个点中任意选取两点,求出另外两点的坐标,看另外两点是否在那n个点中。

 

 

 

     枚举每两个点(O(n*n)),根据两点算出另外两点,判断这两点是否在集合中。现在问题转化为:如何判断某点是否在输入的集合中。这个问题与2002类似,这里就不再赘述。

 

    对于POJ3349,每片雪花有6个数组成,在这6个树中,可以从任意一个数开始,顺时针或者逆时针走一遍,认为也是相同的雪花。现在给出n片雪花,判断这n片雪花中是否有相同的两片。n=100,000。

    最简单的就是枚举每两片雪花,判断他们是否相同。时间复杂度为O(n*n),显然效果不理想。有没有更好的算法呢?

    hash:每读进一片雪花,将雪花hash,判断hash表里是否有相同的hash值,有相同的hash值,从链表中一一取出并判断是否同构,是同构得出结果。然后将该雪花加入到表中,所有雪花读完也没有发现相同的,则得出结果。

 

    对于POJ3274,每头牛有一个特征值n,将n表示成K位二进制形式,第i位上的数为1代表该牛拥有特征i,现在有一排牛,要求出连续的牛,满足这些牛的K个特征个数都相同,求出满足要求的最长的牛序列。n=100,000

    很直接的想法就是枚举所有的牛,求和,判断每个属性是否相等,复杂度为O(n*n)。

    将数据处理:

//对于SAMPLE的数据的处理  
//前导零        000     000  
//7---->111---->111---->000  
//6---->110---->221---->110(*)  
//7---->111---->332---->110  
//2---->010---->342---->120  
//1---->001---->343---->010  
//4---->100---->443---->110(*)  
//2---->010---->453---->120  
//443 - 221 = 222说明在这个范围内3中特色都有相同的个数2  
//每个2进制结果所有位减去他们当中的任意位,上面例子取减去最右边那一位  
//这样将问题转化为判重,,只要找两位他们是相同的并且距离是最远的即可(加*为答案),用HASH来解决是O(NK) 

   对于POJ2151,也是类似的。

   可见,遇到这类题意简单并且没有好的算法时,用hash往往能达到好的效果。

 

 

  • 大小: 15.8 KB
分享到:
评论

相关推荐

    tongxunlu.rar_个人通讯录

    在数组或哈希表中,可以使用二分查找或哈希函数加速查找过程。查找操作的效率直接影响到用户体验,因此在设计时需要权衡时间和空间复杂度。 修改和删除联系人信息则涉及到对已有数据结构的更新。在C++中,找到特定...

    article

    综上所述,哈希函数及其支撑的哈希表在数据结构和算法设计中占据着不可替代的地位,尤其在NOIP竞赛等场景下,其重要性更为凸显。深入理解和掌握哈希函数的工作机制,不仅能够提升解决问题的能力,还能激发对算法设计...

    内容分析工具数据结构888

    在内容分析中,常用的数据结构包括数组、链表、栈、队列、树、图、哈希表等。 1. **数组**:数组是最基础的数据结构,它允许快速访问任何位置的元素。在内容分析中,可以用于存储词汇表,便于快速查找和统计特定...

    数据结构课件(包含复习内容)

    哈希表提供快速的查找和插入,堆(如最小堆和最大堆)用于优先级队列,B树和B+树适用于大文件索引,Trie树则在字符串查找中表现出色。 此外,还有动态规划、贪心算法和回溯等数据结构相关的算法思想,它们在解决...

    2005信息学国家集训队论文集

    例如,二叉搜索树在搜索和排序中的高效性,图论在解决网络路径问题中的独特作用,哈希表在快速查找中的优势等。 此外,论文集可能会涉及计算机网络、操作系统、数据库管理、编译原理等计算机科学的基础理论。这些...

    数据结构与算法实验报告和实验源代码

    哈希表通过散列函数实现快速查找,但可能产生冲突。 接下来,我们探讨算法。算法是解决问题的步骤或过程,通常涉及排序、查找、图论、动态规划等领域。例如,冒泡排序、选择排序、插入排序、快速排序和归并排序是...

    数据结构的2021年.zip

    在2021年的学习和研究中,数据结构的重要性得到了进一步的凸显,成为了IT行业的主要努力方向之一。这个名为"数据结构的2021年.zip"的压缩包文件,可能是为了解析这一年度内数据结构领域的关键进展和重点内容。 在...

    互联网服务标识解析映射缓存机制设计.pdf

    在缓存系统中,哈希表的每个桶中通常会存储一个链表结构,以解决哈希冲突的问题。当新数据进入系统时,根据预设的哈希算法分配到相应的哈希桶,并置于链表末尾。当需要查找数据时,可以通过哈希算法直接定位到包含所...

    1.0_开篇_数据结构在学什么1

    例如,当我们使用哈希表时,可以实现近乎常数时间的查找,但需要额外的内存空间;而二叉搜索树虽然查找效率较高,但插入和删除操作可能会影响其平衡性,需要通过平衡算法来维护。 在信息化社会中,数据的处理和分析...

    c#和数据结构的综合学习资料

    这些数据结构在不同应用场景中发挥着重要作用,例如,数组适合快速访问数据,而链表则更适合插入和删除操作。 #### 四、C#中的数据结构实现 在C#中,可以通过.NET Framework提供的集合类来实现各种数据结构,这些...

    数据结构与算法 JavaScript 描述. 章节练习.zip

    数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于JavaScript这样的动态脚本语言,它在Web开发中的地位日益凸显。本章将重点探讨在JavaScript中如何实现和应用...

    对等网络研究综述 清华大学

    为了解决早期对等网络中存在的可扩展性和性能问题,研究人员提出了分布式哈希表(DHT)。DHT是一种分布式数据结构,能够在大规模的P2P网络中实现高效的数据存储和检索。 - **关键技术**:一致性哈希算法、节点定位...

    open_chord

    而 DHT 通过构建一个有序的节点结构(例如环状结构),确保了数据能够被准确地定位,并且与之关联的唯一键类似于传统的哈希表中的键值对。这一特性使得 DHT 成为了可靠、负载均衡且可扩展的数据存储机制的基础。 ##...

    配置文件V2.0版本,主要使用C语言实现

    在这个"配置文件V2.0版本"中,主要采用了C语言来实现,这凸显了对效率和资源管理的重视,因为C语言以其高效和灵活性著称,特别适合于处理这种底层和系统级的任务。 描述中提到的`main.c`是C语言项目中的主入口文件...

    教育科研-学习工具-P2P网络中的实时媒体分发.zip

    2. DHT(Distributed Hash Table)分布式哈希表:用于节点间的信息查找和路由,提高数据检索效率。 3. Superpeers:在P2P网络中设置超级节点,协助管理和协调普通节点的通信,减轻全局路由压力。 4. 分片和码率...

    学生成绩档案管理系统(C语言实现)

    对于大规模数据,还可以考虑使用哈希表来提高查询效率。 5. **排序与统计**:对学生成绩进行排序(如按总分或单科成绩),并计算平均分、最高分和最低分等统计信息,是系统的基本功能。C语言的排序算法(如冒泡排序...

    递归构建一整棵树

    在填充节点信息的过程中,创建了一个`meta`哈希表用于存放节点的额外信息,如标题`title`、图标`icon`等。之后,调用自身`formatData`方法,但传入的是当前节点的`FunctionId`和同样的`functions`列表。这样,通过...

    tongxunlu.rar_管理系统

    在实现上,"通讯录.c"的代码可能包括了数据结构的设计(如链表或哈希表来存储联系人信息),用户交互界面的编程,以及上述各项功能的算法实现。例如,为了实现快速查询,系统可能会使用哈希表来存储联系人信息,通过...

    基于海量内存的大数据挖掘技术new.zip

    传统的数据结构如数组、链表等在处理大规模数据时效率较低,因此需要设计适应大数据场景的新型数据结构,例如B树、B+树、哈希表等,这些数据结构能有效支持快速查找、插入和删除操作,同时尽量减少内存空间的浪费。...

Global site tag (gtag.js) - Google Analytics