数组和链表的区别

什么样的“东西”可以称之为哈希表?其实就是经常想不起来却刻在 DNA 里的知识点
数据结构三要素:
1,数据的逻辑结构:逻辑结构顾名思义就是逻辑上的结构,比如我们知道一棵二叉树的非叶子节点会有左右与左右两个子树的树根相连。
2,数据的物理结构:物理结构就是数据结构真正的存储方式,二叉树我们一般通过二叉链表存取,但是也能用数组存取。这就是说一个逻辑结构可以对应不同的物理结构。
3,数据的运算:就是可有对这个数据结构进行哪些操作,比如可以对二叉树进行遍历操作,这就是一种运算。
把任意结构,任意长度的输入,快速的映射成一个固定长度的输出,这个过程就叫哈希,实现这个功能的东西就叫哈希函数。
哈希函数需要满足两个性质:
对于相同的输入,必须有相同的输出;
对于不同的输入,允许有相同的输出。

哈希表是解决查找问题的,hashcode值就是你要找的数据所在的位置(下标),那个位置的值是value

数组:数组就是一块连续的内存空间。这个空间可以放在栈上,可以放在堆上。因为知道元素的大小,再根据下标可以计算到元素在这块连续的内存中的位置。接着你就可以将你的元素保存到这块连续的内存的某个位置。这块连续的内存不可能无限的大,所以要根据实际的情况来决定数组需要多大。并且数组进行扩充的话,有可能会出现内存拷贝的现象。。因为你没办法知道你申请的那块连续的内存空间的后面的内存有没有人使用。
哈希表(HashSet):哈希表也称散列表。原理就是通过哈希函数(下面使用hash()代替)计算元素的哈希值。计算出来的哈希值是32位的。当然,我们可以把这32位的哈希值看成一个无符号的32位整形(下面使用uint32)。最后,我们再创建一个key类型的数组(假设大小为8)。这时候,假设我们要添加一个元素,我们就使用 hash(key)%8 计算出元素应该存储在数组中的位置(hash(key)%8的范围是0-7,不会使数组越界)。这时,key就与数组之间建立了一个映射关系。当然,不同的key计算(hash(key)%8)出来的结果(数组的下标)有可能是一样的。例如先前这个位置已经有元素存储了,现在又有个元素映射到这个位置,我们怎么办?这种情况我们称为哈希冲突,解决的方式有2种。 第1种为链式存储法,也就是数组的每个元素都是一个链表,来记录映射到该下标的所有元素。 第2种为二度哈希,也就是使用哈希后加上一定的计算,在当前的位置下再计算另一个位置出来。当然,无论哪种,接下来的查找都是线性的。哈希表一般都是HashSet,可以看到只有key,一般都用于存储元素,并且可以快速的查找元素在集合中是否存在。字典(Dictionary):字典也是散列表的一种,跟上面说的哈希表唯一不同的就是。哈希表使用hash(key)%8得到数组存储位置后,它存储的是key。。而字典存储的是value,仅此区别而已。所以字典是Dictionary。。他的作用就是可以根据key快速的查找到value。

https://zhuanlan.zhihu.com/p/78107140
https://zhuanlan.zhihu.com/p/52440208

你可能感兴趣的:(数组和链表的区别)