面试问题

1,golang的内存泄漏,GC

go如果使用一个_来接受一个指针,就会导致GC的时候始终无法回收一块内存空间

2,java HashMap

    Hash其实是一个指针的列表,将hash冲突的部分放在指针后面,逐个往后。

    列表太大了会性能不好,需要增加一个数散列开

    

  1. 开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
  2. 再哈希法
  3. 链地址法
  4. 建立一个公共溢出区

    Java用的链地址法

面试官会问因为你并没有值对象去比较,你是如何确定确定找到值对象的?除非面试者直到HashMap在LinkedList中存储的是键值对,否则他们不可能回答出这一题。

其中一些记得这个重要知识点的面试者会说,找到bucket位置之后,会调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象。完美的答案!

 

 

3,B+树和B树的区别,为什么要用B+树

 

题目1: Mysql数据库用过吧?l里面的索引是基于什么数据结构。

答:主要是基于Hash表和B+树

题目2: 很好请你说一下B+树的实现细节是什么样的?B-树和B+树有什么区别?联合索引在B+树中如何存储?

答: 首先,数据库使用树型结构来增加查询效率,并保持有序。那么,为什么不使用二叉树来实现数据结构呢,二叉树算法时间复杂度是lg(N),查询速度和比较次数都是较小的。

实际上,查询索引操作最耗资源的不在内存中,而是磁盘IO。索引是存在磁盘上的,当数据量比较大的时候,索引的大小可能达到几个G。那么,我们利用索引进行查询的时候,不可能把索引直接加载到内存中,只能一次读取一个磁盘页,一个磁盘页对应着一个节点,一次读取操作时一个磁盘io。

在二叉树查询时,最坏的情况下查找的次数是树的高度,即io次数为树的高度。B-树就是比二叉树“矮胖”的树。

二叉树的特征如下:

1. 根节点至少有两个子女

2. 每个中间节点包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3. 每个叶子节点包含k-1个元素,其中 m/2 <= k <= m

4. 所有叶子节点位于同一层

5. 节点中的元素从小到大排列,正好是孩子节点的值域。(就是孩子节点的元素都比父节点中元素的最小值大,比父节点元素的最大值小)

B-树查询的次数并不比二叉树的次数小,但是相比起磁盘io速度,内存中比较的耗时就不足为提了。所以只要树的高度足够低,io次数少,就可以提升查找性能。而每个节点中有多个元素,都只在内存中操作。

而B+树是基于B-树的,增加了如下规则:

1. 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

所以,B+树对比B-树有如下好处:

io次数少:b+树中间节点只存索引,不存在实际的数据,所以可以存储更多的数据。索引树更加的矮胖,io次数更少。
性能稳定:b+树数据只存在于叶子节点,查询性能稳定
范围查询简单:b+树不需要中序遍历,遍历链表即可。

4,CAP,zookeeper满足了哪两个

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值