腾讯面试题

  1. 一条SQL语句执行得很慢的原因有哪些?
  • 1、大多数情况是正常的,只是偶尔会出现很慢的情况。
  • 2、在数据量不变的情况下,这条SQL语句一直以来都执行的很慢。

针对偶尔很慢的情况

  • 1、数据库在刷新脏页(flush)
    当我们要往数据库插入一条数据、或者要更新一条数据的时候,我们知道数据库会在内存中把对应字段的数据更新了,但是更新之后,这些更新的字段并不会马上同步持久化到磁盘中去,而是把这些更新的记录写入到 redo log 日记中去,等到空闲的时候,在通过 redo log 里的日记把最新的数据同步到磁盘中去。
    当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。

  • 表锁和行锁

一直都这么慢的情况

  • 索引
  • 字段没有索引
  • 字段有索引,但却没有用索引
  • 函数操作导致没有用上索引
  • 全表扫描
  1. 为什么有了二查找查找树/平衡树还需要红黑树

二叉查找树的缺点
二叉查找树,相信大家都接触过,二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大.
在这里插入图片描述
基于二叉查找树的这种特点,我们在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点。n 个节点的二叉查找树,正常的情况下,查找的时间复杂度为 O(logn).
之所以说是正常情况下,是因为二叉查找树有可能出现一种极端的情况
在这里插入图片描述
这种情况也是满足二叉查找树的条件,然而,此时的二叉查找树已经近似退化为一条链表,这样的二叉查找树的查找时间复杂度顿时变成了 O(n),可想而知,我们必须不能让这种情况发生,为了解决这个问题,于是我们引申出了平衡二叉树.
平衡二叉树
平衡二叉树就是为了解决二叉查找树退化成一颗链表而诞生了,平衡树具有如下特点
1、具有二叉查找树的全部特性。
2、每个节点的左子树和右子树的高度差至多等于1。
例如:图一就是一颗平衡树了,而图二则不是(节点右边标的是这个节点的高度)
在这里插入图片描述
对于图二,因为节点9的左孩子高度为2,而右孩子高度为0。他们之间的差值超过1了。
于是,通过平衡树,我们解决了二叉查找树的缺点。对于有 n 个节点的平衡树,最坏的查找时间复杂度也为 O(logn)。
为什么有了平衡树还需要红黑树?
虽然平衡树解决了二叉查找树退化为近似链表的缺点,能够把查找时间控制在 O(logn),不过却不是最佳的,因为平衡树要求每个节点的左子树和右子树的高度差至多等于1,这个要求实在是太严了,导致每次进行插入/删除节点的时候,几乎都会破坏平衡树的第二个规则,进而我们都需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。
显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树,红黑树具有如下特点:
1、具有二叉查找树的特点。
2、根节点是黑色的;
3、每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存数据。
4、任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的。
5、每个节点,从该节点到达其可达的叶子节点是所有路径,都包含相同数目的黑色节点。
在这里插入图片描述
正是由于红黑树的这种特点,使得它能够在最坏情况下,也能在 O(logn) 的时间复杂度查找到某个节点。不过,与平衡树不同的是,红黑树在插入、删除等操作,不会像平衡树那样,频繁着破坏红黑树的规则,所以不需要频繁着调整,这也是我们为什么大多数情况下使用红黑树的原因。
不过,如果你要说,单单在查找方面的效率的话,平衡树比红黑树快。
所以,我们也可以说,红黑树是一种不大严格的平衡树。也可以说是一个折中发方案
平衡树是为了解决二叉查找树退化为链表的情况,而红黑树是为了解决平衡树在插入、删除等操作需要频繁调整的情况。

红黑树有哪些应用场景?
集合容器的hashMap,TreeMap。
epoll在内核中的实现,用红黑树管理事件块
linux内核的可扩展I/O事件通知机制,应用于高性能网络程序场景,在内核cache中用红黑树储存事件块,保证较快的查询速度。
nginx中,用红黑树进行超时管理
Nginx为网页服务器,在进行超时管理时,通过红黑树存储超时时间对象,每次找到key最小的节点,然后进行判断是否超时,超时就处理,直到取出的未超时的事件。
Java的TreeMap实现
TreeMap是Java中key-value的集合,根据key值的自然顺序进行排序,或者依据比较函数。

构建一棵节点个数为 n 的红黑树,时间复杂度是多少?

红黑树与哈希表在不同应该场景的选择?

红黑树有哪些性质?

红黑树各种操作的时间复杂度是多少?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值