字节测开二面查漏补缺

红黑树

原文【数据结构】史上最好理解的红黑树讲解,让你彻底搞懂红黑树-CSDN博客

首先,红黑树是一个二叉搜索树,它在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路径的两倍)。它同时满足以下特性:

  • 节点是红色黑色
  • 根是黑色
  • 叶子节点(外部节点,空节点)都是黑色,这里的叶子节点指的是最底层的空节点(外部节点),下图中的那些null节点才是叶子节点,null节点的父节点在红黑树里不将其看作叶子节点
  • 红色节点的子节点都是黑色
    • 红色节点的父节点都是黑色
    • 从根节点到叶子节点的所有路径上不能有 2 个连续的红色节点
  • 从任一节点到叶子节点的所有路径都包含相同数目的黑色节点


超长不重复数组查找重复元素

  • 使用哈希表: 遍历数组,将每个元素及其出现次数存入哈希表(或字典)中。在遍历过程中,如果发现某个元素在哈希表中已存在,则说明该元素是重复的。这种方法可以在一次遍历中完成,时间复杂度为O(n)。
  • 使用排序: 先对数组进行排序,然后遍历排序后的数组,比较相邻元素是否相同。如果相同,则说明该元素是重复的。这种方法需要先排序,时间复杂度为O(nlogn)。
  • 使用集合: 遍历数组,将元素添加到集合中。如果在添加元素时发现该元素已经在集合中存在,则说明该元素是重复的。这种方法也可以在一次遍历中完成,时间复杂度为O(n)。
  • 使用位图: 如果数组中的元素范围比较小(例如只有0-100之间的整数),可以使用位图(Bitmap)来记录每个元素是否出现过。遍历数组时,根据元素值设置位图中对应的位,如果某个位已经被设置,则说明该元素是重复的。这种方法空间复杂度较低,时间复杂度也为O(n)。
  • 异或运算: 遍历数组,将所有元素进行异或运算。由于x^x=0,重复的元素在异或运算中会抵消掉,最终得到的结果就是数组中唯一不重复的元素。这种方法时间复杂度为O(n),但仅适用于数组中只有一个元素不重复的情况。
  • Floyd's Cycle-Finding Algorithm: 也叫"龟兔赛跑算法",通过让两个指针以不同的速度遍历数组,可以找出数组中的重复元素。这种方法时间复杂度为O(n),但需要对数组有一定了解。

数据库慢查询

慢查询是指在数据库中执行时,消耗的时间超过预定阈值的SQL语句。通常,这些查询会影响系统的整体性能,导致响应时间延长,用户体验下降。

特征

  • 执行时间长:通常定义为超过1秒或其他业务相关的时间。
  • 资源消耗高:可能占用大量CPU、内存或I/O资源。
  • 影响其他事务:可能导致数据库锁等待,影响并发性能。

排查与优化

  • 启用慢查询日志:在数据库配置中启用慢查询日志,设置阈值(如1秒),记录所有超过该时间的查询。

  • 分析慢查询日志:查看慢查询日志,识别执行时间较长的SQL语句。

  • 使用查询优化工具:使用数据库提供的工具(如 MySQL 的 EXPLAIN)分析查询的执行计划,了解查询的执行路径和使用的索引。

  • 检查索引:确认相关表的索引是否合理,必要时创建、修改或删除索引。

  • 查看数据量:检查查询涉及的数据量,分析是否存在大数据集扫描的情况。

  • 评估查询结构:审查查询语句,寻找可优化的地方,例如:

    • 避免使用 SELECT *
    • 避免不必要的子查询和连接
    • 确保使用合适的过滤条件(WHERE 子句)
  • 监控系统资源:监控数据库的CPU、内存、I/O等资源使用情况,判断是否存在资源瓶颈。

  • 进行性能测试:在非生产环境中对优化后的查询进行性能测试,比较执行时间和资源消耗。

  • 考虑数据分区:对于大表,考虑使用分区策略来提升查询效率。

  • 定期维护:定期进行数据库的维护(如重建索引、更新统计信息)以保持性能。


Redis hotkey问题

什么是 Redis 的热键

热键是指在 Redis 中频繁访问的特定键,通常这些键的访问频率远高于其他键。这会导致以下问题:

  • 性能瓶颈:热键造成的高并发访问可能导致 Redis 负载过重,影响整体性能。
  • 内存资源竞争:频繁访问的热键可能导致内存资源的争用,使得其他请求响应变慢。

定位热键

  • 使用监控工具

    • 利用 Redis 自带的 MONITOR 命令实时查看所有请求,识别访问频率较高的键。
    • 使用 Redis 的 SLOWLOG 命令查看慢查询日志,找出性能瓶颈。
  • 分析访问日志

    • 记录访问 Redis 的应用日志,分析日志中哪些键被频繁访问。
  • 使用 Redis 统计信息

    • Redis 提供了 INFO 命令,可以查看键的访问统计信息。
  • 性能监控工具

    • 使用如 RedisInsight、Grafana 等监控工具,监控 Redis 的访问模式和性能指标。

解决热键问题

  • 缓存分散

    • 使用前缀:为热键添加前缀,使其在 Redis 中分散存储,例如,使用用户ID作为前缀。
    • 增加随机性:在键名中增加随机后缀,分散请求。
  • 数据分片

    • 将热数据拆分成多个键,分散访问压力。例如,将用户信息分为多个键存储。
  • 使用过期策略

    • 对热键设置合理的过期时间,避免长期占用内存。
  • 限流

    • 对访问频率进行控制,限制某个键的访问频率,防止过度访问。
  • 使用异步处理

    • 对于高并发的写操作,可以使用异步方式处理,减少对 Redis 的直接访问。
  • 预计算和缓存

    • 对热点数据进行预计算和缓存,将计算结果存储在 Redis 中,减少实时计算的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值