数组
- 数组进行插入操作时,效率比较低
- 数据进行查找操作的效率
(1)如果基于索引进行查找操作效率非常高
(2)基于内容去查找(比如name=’why’)- 数组进行删除操作,效率也不高
哈希表
哈希表通常是基于数组进行实现的,但是相对于数组,它有很多的优势
- 它可以提供非常快的插入-删除-查找操作
- 无论多少数据,插入和删除值需要接近常量的时间:即O(1)的时间级。实际上,只需要几个机器指令即可完成
- 哈希表的速度比树还要快,基本可以瞬间查找到想要的元素
- 哈希表相对于树来说编码要容易很多
哈希表相对于数组的一些不足:
- 哈希表中的数据是没有顺序的,所以不能以一种固定的方式(比如从小到大)来遍历其中的元素
- 通常情况下,哈希表中的Key是不允许重复的,不能放置相同的key,用于保存不同的元素.
那么哈希表到底是什么呢?
它的结构就是数组,但是它神奇的地方在于对下标值的一种变化,这种变化我们可以称之为哈希函数,通过哈希函数可以获取到HashCode.
通过以下案例来认识哈希表!
案例一
案例介绍:假如一家公司由1000个员工,现在我们需要将这些员工的信息使用某种数据结构保存起来,你会采用什么数据结构呢?
方案一:数组
一种方案是按照顺序将所有员工依次存入一个长度尾1000的数组中。每个员工的信息都保存在数组的某个位置上。
但是我们要查看某个员工的信息怎么办?一个个找吗?不太好找
- 数组最大的优势是什么?通过下标去获取信息。
所以为了可以通过数组快速定位到某个员工,最好给员工信息中添加一个员工编号(工号),而编号对应的就是员工的下标值。
当查找某个员工的信息时,可以通过员工编号定位到员工的信息位置.
方案二:链表
链表对应插入和删除数据有一定的优势
但是对于获取员工的信息,每次都必须从头遍历到尾,这种方式显然不是特别适合我们这里
最终方案:
这样看最终方案似乎就是数组了。但是数组还是有缺点,什么缺点呢?
假如我想查看以下hurry这位员工的信息,但是我不知道hurry的员工编号,你怎么办呢?
当然,你说我可以问他,但是你每查找一个员工都是问一下这个员工的编号吗?不合适
线性查找?效率非常低。
能不能有一种方法,让hurry的名字和它的员工编号产生直接的关系呢?
也就是通过hurry这个名字,我就能获取到它的索引值,而再通过索引值我就能获取到hurry的信息呢?
这样的方案已经存在了,就是使用哈希函数,让某个key的信息和索引值对应起来
案例二
案例介绍:选择一个数据结构,保存联系人和电话
方案一:数组
使用数组来存储联系人和电话不是非常合适。
因为如果需要查询某个联系人,就需要从数组中一个个取出数据和查询的联系人比较。效率非常的低
方案二:链表
链表和数组一样,效率非常低
方案三:
有没有一种方案,可以将联系人和数组的下标值对应呢?
那么我们就可以让联系人的名字作为下标值,来获取这个联系人对应的电话
但是联系人的名字(字符串)可以作为下标值吗?当然不可以
所以你需要一种方案将字符串转成下标值,就是哈希函数。
案例三
案例介绍:使用一种数据结构存储单词信息,比如有50000个单词。找到单词后每个单词有自己的翻译&读音&应用等等
方案一:数组?
这个案例更加明显能感受到数组的缺陷
我拿到一个单词Python,我想知道这个单词的翻译&读音&应用。怎么可以从数组中查到这个单词的位置呢?
线性查找?50000词比较?Python -> 1000/Swift -> 2000/Go -> 3000…
如果你使用数组来实现这个功能,效率会非常非常低
方案二:链表?
不用考虑了
方案三:
有没有一种方案,可以将单词转成数组的下标值呢?
如果单词转成数组的下标,那么以后我们要查找某个单词的信息,直接按照下标值一步即可访问到想要的元素