哈希、排列组合

109 阅读3分钟

一、哈希:

哈希又称作散列,通常包括散列函数,散列表,散列值.

1.散列函数:

将任何长度的输入转换成固定长度的输出的方法

2.散列值:

又称哈希值,通过哈希函数计算得出来的固定长度的值

3.散列表:

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构,本质上是一个数组,这个数组的每个元素被称为一个桶或槽(bucket/slot)。每个桶可以存储一个或多个键-值对。哈希表通过哈希函数将键映射到特定的桶,从而快速地查找、插入和删除数据。也就是说,它通过计算一个关于键值的函数(散列函数),将所需查询的数据映射到表中一个位置来访问记录(键值对)(位置就是通过见键名关键字与散列函数计算出的散列值对数组长度取余计算出来的)。这加快了查找速度。

(1)存储数据:

哈希表就是根据key值来通过哈希函数计算得到一个值,这个值就是用来确定这个Entry(键值对)要存放在哈希表中的位置的,实际上这个值就是一个下标值,来确定放在数组的哪个位置上。

(2)哈希冲突:

由于输入是无限大的,输出的哈希值是有固定长度的,所以两个或多过个不同键名通过散列函数计算出来的散列值可能是相同的,这时候就会出现冲突问题.

解决:两种主要的方法,一个是开放寻址法,一个是拉链法。

1.开放寻址法:

位置被占了,那就另外再找个位置不就得了,怎么找其他的位置呢?这里其实也有很多的实现,我们说个最基本的就是既然当前位置被占用了,我们就看看该位置的后一个位置是否可用,也就是1的位置被占用了,我们就看看2的位置,如果没有被占用,那就放到这里呗,当然,也有可能2的位置也被占用了,那咱就继续往下找,看看3的位置,一次类推,直到找到空位置。

2.拉链法

比如数组中1的位置发生了冲突,存放的不单单是之前的那个Entry了,此时的Entry还额外的保存了一个next指针,这个指针指向数组外的另外一个位置,将李四安排在这里,然后张三那个Entry中的next指针就指向李四的这个位置,也就是保存的这个位置的内存地址,如果还有冲突,那就把又冲突的那个Entry放在一个新位置上,然后李四的Entry中的next指向它,这样就形成了一个链表。

(3)查询数据:

比如我们现在要通过学号来查找学生的姓名,怎么操作呢?我们首先通过学号利用哈希函数得出位置,然后我们就去位置拿数据啊,拿到这个Entry之后我们得看看这个Entry的key是不是我们的学号,如果这不是我们要的key啊,然后根据这个Entry的next知道下一个位置,在比较key,好成功找到目标学生。

二、排列组合:

排列: 5个元素中选出3个元素进行排列,总共有A53A_5^3种结果:5 * 4 * 3 = 60 种结果

组合: 5个元素中选出3个元素进行排列,总共有C53C_5^3种结果:5 * 4 * 3 / 3 * 2 * 1 = 10 种结果