关于数据结构底层原理的面试题

问题1 HashMap底层实现原理

哈希表底层采用数组+链表结合的方式实现,对于每一个key值,内部采用任意哈希算法根据key值计算出一个整数,然后对数组的长度求余,求余后的结果即为内部数组中的index值。
如果某两个key对应的哈希值对数组求余得到的结果相同,或者两个key对应的哈希值也是相同的,则发生哈希冲突,哈希表会在某个index对应的结构体中使用链表来储存所有index相同的数据,俗称拉链法。
链表长度过长时,内部会将链表转化为红黑树结构,或者扩充来减少哈希冲突。

问题2 List底层实现原理

list被称为动态数组,其内部就是一个数组实现的。这个数组的长度要比实际数据的长度大,如果容纳不下时就会发生扩容。每次添加/删除数据都会导致数组索引需要重新排序,所以List的优缺点和数组基本相同,查找效率很高,添加/删除数据效率低。
LinkedList则相反,底层由双向链表实现,随机访问效率低,添加/删除效率高。

问题3 List的sort函数使用哪种排序方法

Sort()函数采用了内省排序(introsort)。该排序是一种混合排序,当排序元素小于等于16时采用插入排序(insertion sort),接下来会尝试使用快速排序(quicksort),如果分区数超过2*LogN,其中N是输入数组的范围,则使用堆排序算法(heapsort),否则使用快速排序。
分区数是快速排序时递归产生的区间;
输入数组的范围的意义目前还不确定;
官方文档
关于自省排序,这里有篇更详细的文章。自省排序介绍

问题4 lua中table的sort函数使用哪种排序方法

table使用的是快速排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值