从数组底层原理再看HashTable

1,990 阅读2分钟

前言

JSArray有两种模式,一种是快速的,底层原理使用数组存储,增删元素操作需要不断的扩容、减容和调整元素的位置,查找用的是索引直接定位;一种是慢速的,使用用哈希表;

什么是HashTable?

存储结构

  1. 数据结构可以归结为两类:连续的的存储结构和不联系的存储结构,其代表分别为数组和链表;
  2. 数组实现:堆栈,队列;
  3. 链表实现:树,图;
  4. 数组:连续的存储结构,在数据的查找和修改上具有很好的优点,很方便,时间复杂度很小。但是在数据的增添和删除上则显得很麻烦,空间复杂度很大。
  5. 链表:而非连续,非顺序的存储结构,和数组相反,数据的增添和删除容易,空间复杂度很小,查找和修改复杂,时间复杂度很大。

HashTable诞生原因

那么有没有一种数据结构能折衷一下数组和链表的优缺点呢?那就是——哈希表,既满足了数据的查找和修改很容易,同时又不占用很多空间的特点。

  1. 哈希表是基于哈希函数的,哈希表中的元素是有哈希函数确定的;
  2. 哈希表作为一种数据结构,我们用哈希表来存储数据,在保存的时候存入的是一个<key—value>的结构,value由哈希函数作用于key上得到;
  3. 哈希冲突:当你用hash函数作用在两个互不相同的key上,得到的value值相等。

HashTable组成

哈希表是由数组+链表构成的

hashTable应用

  1. 相似性搜索
      1. 文档相似性搜索的哈希函数:Simhash
      1. 图片相似性搜索的哈希函数是感知哈希(Perceptual Hashing)