数据结构与算法题目总结(二)

4.归并排序与快速排序的异同点是什么?

    4.1归并排序:

        时间复杂度:O(nlogn)   

        空间复杂度:O(N)    归并排序需要一个与原数组相同长度的数组做辅助来排序

        原理:将待排序列划分为前后两部分,直到子序列的区间长度为1;对前后两部分分别进行排序,再将排好序的两部分合并在一起。

数据结构与算法题目总结(二)_第1张图片

    4.2快速排序:

        思想:快速排序的本质就是把基准数大的都放在基准数的右边,把比基准数小的放在基准数的左边        

数据结构与算法题目总结(二)_第2张图片

    4.3异同点是什么

        同:都使用了分而治之的算法思想:大问题划分为子问题

        异:归并排序是先解决子问题,然后归并起来解决大问题,从下而上。快速排序是从上而下 


5.散列 :

    5.1 散列是什么:

        哈希表,又称为散列

    5.2 散列是用来做什么的?

        O(1)时间查找数据 

    5.3 散列为什么查找数据更快捷?

        我们之前的查找是这样的:从集合中拿出来一个元素,看看是否与我们要找的相等,如果不等,缩小范围,继续查找。

        而哈希表是完全另外一种思路:当我知道key值以后,我就可以直接计算出这个元素在集合中的位置,根本不需要一次又一次的查找!

    5.4 散列表的查找步骤 

        存储记录时,通过散列函数计算出记录的散列地址

        查找记录时,我们通过同样的是散列函数计算记录的散列地址,并按此散列地址访问该记录

    5.5 散列冲突指什么?

        不同的关键字经过散列函数的计算得到了相同的散列地址。

    5.6 散列冲突解决方案:

        方案1:开放寻址法(缺点更费内存,且扩容时需要搬迁数据)

            当冲突发生时,使用某种探测算法在散列表中寻找下一个空的散列地址。

            如下图所示:当我们向模为8的哈希表中插入 26,35,36三个数字。结果如下图所示

            这个时候插入42,那么正常应该在地址为2的位置里,但因为关键字26已经占据了位置,所以就需要解决这个地址冲突的情况,有三种探测方法:1.线性探查法  2.二次探查法 3.双哈希函数探测法

            这里简单说下线性探查法:插入42时,探查到地址2的位置已经被占据,接着下一个地址3,地址4,直到空位置的地址5,所以42应放入地址为5的位置。

数据结构与算法题目总结(二)_第3张图片

        方案2:链地址法

            在哈希表每一个单元中设置链表,某个数据项对的关键字还是像通常一样映射到哈希表的单元中,而数据项本身插入到单元的链表中。

            来一个相同的数据,就将它插入到单元对应的链表中,在来一个相同的,继续给链表中插入。

6. redis zset的实现:

        思路:散列 + 跳表实现。散列用于查找key。跳表用于区间查找

    6.1 跳表(多级链表,以空间换时间,有序)

        如下图:当我们查找元素16的时候,单链表需要比较10次,而加过索引的两级链表只需要比较7次。当数据量增大到一定程度的时候,效率将会有显著的提升。

数据结构与算法题目总结(二)_第4张图片

    6.2 为什么 Redis 会选择跳表?

        Redis 中的有序集合支持的核心操作主要有以下功能

            插入一个数据

            删除一个数据

            查找一个数据

            按照区间查找数据

            迭代输出有序序列


            插入、删除、查找以及迭代输出有序序列这几个操作,红黑树也可以完成,时间复杂度和跳表是一样的。

            但是,按照区间查找数据这个操作,红黑树的效率没有跳表高。跳表可以在 O(logn)O(logn) 时间复杂度定位区间的起点,然后在原始链表中顺序向后查询就可以了,这样非常高效。

            此外,相比于红黑树,跳表还具有代码更容易实现、可读性好、不容易出错、更加灵活等优点,因此 Redis 用跳表来实现有序集合。

你可能感兴趣的:(数据结构与算法题目总结(二))