查找算法(7)--Hash search--哈希查找

1.哈希查找
  (1)什么是哈希表(Hash)
   咱们使用一个下标范围比较大的数组来存储元素。能够设计一个函数(哈希函数, 也叫作散列函数),使得每一个元素的关键字都与一个函数值(即数组下标)相对应,因而用这个数组单元来存储这个元素;也能够简单的理解为,按照关键字为每个元素"分类",而后将这个元素存储在相应"类"所对应的地方。可是,不可以保证每一个元素的关键字与函数值是一一对应的,所以极有可能出现对于不一样的元素,却计算出了相同的函数值,这样就产生了"冲突",换句话说,就是把不一样的元素分在了相同的"类"之中。后面咱们将看到一种解决"冲突"的简便作法。
   总的来讲,"直接定址"与"解决冲突"是哈希表的两大特色。
  (2)什么是哈希函数
   [1]哈希函数的规则是:经过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则之后查找的时间复杂度越小,空间复杂度越高。
   [2]算法思想:哈希的思路很简单,若是全部的键都是整数,那么就可使用一个简单的无序数组来实现:将键做为索引,值即为其对应的值,这样就能够快速访问任意键的值。这是对于简单的键的状况,咱们将其扩展到能够处理更加复杂的类型的键。
   [3]算法流程:
   1)用给定的哈希函数构造哈希表;
   2)根据选择的冲突处理方法解决地址冲突;
     常见的解决冲突的方法:拉链法和线性探测法。
   3)在哈希表的基础上执行哈希查找。
   哈希表是一个在时间和空间上作出权衡的经典例子。若是没有内存限制,那么能够直接将键做为数组的索引。那么全部的查找时间复杂度为O(1);若是没有时间限制,那么咱们可使用无序数组并进行顺序查找,这样只须要不多的内存。哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。只须要调整哈希函数算法便可在时间和空间上作出取舍。
  (3)复杂度分析:
  单纯论查找复杂度:对于无冲突的Hash表而言,查找复杂度为O(1)(注意,在查找以前咱们须要构建相应的Hash表)。
  使用Hash,咱们付出了什么?
  咱们在实际编程中存储一个大规模的数据,最早想到的存储结构可能就是map,也就是咱们常说的KV pair,常常使用java的博友可能更有这种体会。使用map的好处就是,咱们在后续处理数据处理时,能够根据数据的key快速的查找到对应的value值。map的本质就是Hash表,那咱们在获取了超高查找效率的基础上,咱们付出了什么?
  Hash是一种典型以空间换时间的算法,好比原来一个长度为100的数组,对其查找,只须要遍历且匹配相应记录便可,从空间复杂度上来看,假如数组存储的是byte类型数据,那么该数组占用100byte空间。如今咱们采用Hash算法,咱们前面说的Hash必须有一个规则,约束键与存储位置的关系,那么就须要一个固定长度的hash表,此时,仍然是100byte的数组,假设咱们须要的100byte用来记录键与位置的关系,那么总的空间为200byte,并且用于记录规则的表大小会根据规则,大小多是不定的。
 java

相关文章
相关标签/搜索