zoukankan      html  css  js  c++  java
  • P1 哈希表和哈希函数介绍

       

    哈希表   

           什么是哈希表(hash function)?给定表M,若存在函数h(key),使得对任意给定的关键字值key,代入函数后能得到包含该key的记录在表中的地址,则称表M为哈希表(hash table)。函数h(key)为哈希函数或者散列函数。哈希函数的好坏会直接影响哈希表的优劣。

          散列表是由哈希函数和数组共同构建的一种数据结构,元素由键和值组成。散列表中的一个位置称为槽位(slot)或者(bucket),用于保存键值对。由哈希函数映射的数组下标称为散列地址(桶号),决定了给定的键存于散列表的哪个桶中。如果不同的key映射到了相同的数组下标,则发生了哈希碰撞(hash collision)。数组中的元素可以是一个链表或者一棵红黑树等数据结构,链表或者红黑树用来解决哈希碰撞。散列表所拥有的桶数被称为散列表的容量(capacity)。 举个例子,我们要在哈希表中执行插入操作:

            图中,0-5标记部分即代表哈希表,如果不同的 key 映射到了同一数组下标,就将其放入对应数组下标的单链表中。例如,令关键字 key=kobe,则通过哈希函数f(key)得到其数组下标为1,故把 kobe 放在数组下标为1的桶中。

    四种数据结构

           为了便于理解散列表,下面粗略地介绍下四类数据结构在新增,查找等基础操作中的执行性能。

           数组:存储区间连续,占用内存严重,寻址容易,插入删除困难;对于指定下标的查找,复杂度为O(1);对于给定值进行查找,需要遍历数组,复杂度为O(n),对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)。

           线性链表:存储区间散列,占用内存比较宽松,寻址困难,插入容易。对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)。

           二叉树:对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)。

           哈希表(Hash table,也叫散列表):相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,复杂度为O(1),接下来我们就来看看哈希表是如何实现达到惊艳的常数阶O(1)的。

     

  • 相关阅读:
    使用jmeter进行性能测试-Jmeter教程及技巧汇总 (转)
    Linux防火墙(Iptables)的开启与关闭
    解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
    Linux如何修改文件/文件夹内所有文件的权限
    php抽象类的简单应用
    php接口和多态的概念以及简单应用
    关于php中数据访问的几点补充
    php中重写和final关键字的使用
    php中static静态关键字的使用
    php对象引用和析构函数的关系
  • 原文地址:https://www.cnblogs.com/east7/p/12594212.html
Copyright © 2011-2022 走看看