• 7、散列表


    一、什么是散列表?

          问题:现在我们需要为一家超市建立一个结账系统,我们应该考虑用哪一种数据结构?

          思考:由于结账系统多用于查询,我们可以考虑使用数组。在数组中需要同时储存商品名和对应的价格,我们可以再数组中内嵌子数组,把一个商品名和对应价格同时保存在一个子数组中,最后对所有数组排序。查询是速度为O(log2n)。

          反思:①数组无法储存具有映射关系的数据;②超市中的商品成千上万,即使查询速度为对数速度,当记录的项目多时查询起来也非常耗时。

          针对反思中的两点,我们想:如果有一种数据结构,能够储存具有映射关系的数据,而且无论项目有多少,其查询数据的速度都是1该有多好。散列表就是实现了这种功能的数据结构。它能够储存具有映射关系的数据,而且查询速度永远是1.

    二、散列函数

          在数组中,利用索引来查找数据这一操作是瞬间完成的事情。散列函数能够把一个数据转化成一个具体的数字,而这个数字就是储存数据的数组中的索引,这样我们就可以把数据保存在数组中索引的位置了。查找数据时只要用散列函数得出索引,查找的速度就永远是1了。

          所以,散列表是散列函数与数组相互配合工作的:散列函数转化数据,数组储存数据。

          这样看来,散列函数必须足够强大,能够把数据转换成互不相同的数字。

    三、散列表与数组、链表

          散列表是我们在数组、链表之后学习的第一种有额外逻辑的数据结构:数组、链表都是把数据直接映射到内存里,而散列表是使用散列函数确定数据的储存位置。

          散列表是一种会被我们广泛引用的数据结构,一般一门语言中通常都提供了散列表的实现,在python中的散列表是字典。

    四、散列表的应用

          1、用于具有映射关系和快速查找的应用,如电话簿、商品价格列表、DNS解析表;

          2、用于防止重复的应用,如投票系统。

    五、冲突

          冲突:给两个键分配的相同的储存位置;

          原因:散列函数不够完美,不能做到对不同数据生成不同的数字;

          解决方法:在分配到相同的同一位置,用链表储存数据。

  • 相关阅读:
    Fast Member
    C++箴言:理解typename的两个含义
    网上资源工具
    WeakReference
    MonoGame教程
    The RAII Programming Idiom
    OpenGL Common Mistakes
    Finalize()、Dispose()、SafeHandle、GC
    Interop with Native Libraries
    C++计算几何库
  • 原文地址:https://www.cnblogs.com/lqxing1994/p/9254429.html
Copyright © 2020-2023  润新知