字节后端一面面经

布隆过滤器

在这里插入图片描述
在这里插入图片描述
PS:使用多个哈希函数:减少哈希冲突,降低判断数据是否存在的误判率

os调度算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

索引(结构、回表、下推、索引覆盖)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Redis实现分布式锁的方式和Zookeeper,两种方式对比、优缺点

redis

在这里插入图片描述
在这里插入图片描述

Zookeeper

在这里插入图片描述
在这里插入图片描述

讲一下缓存击穿,实际生产环境中会有什么情况造成缓存击穿?

在这里插入图片描述
在这里插入图片描述

讲一下nginx除了轮询还有什么方法?轮询和最小连接数分别用在什么地方,最小连接数的连接具体是什么?

在这里插入图片描述最小连接数指的是后端服务器当前正在处理的活跃连接数,包括正在进行的请求。Nginx 会选择连接数最少的服务器来处理新请求,以确保负载均衡。

讲一下HTTP里面长连接和短连接,分别会在什么场景使用

长连接通常用于需要频繁通信的应用场景,如即时通讯、在线游戏等。 短连接是指在每次通信结束后立即关闭连接,下次通信时需要重新建立连接。 短连接在网络通信中的优点是避免了长时间的连接占用,可以更好地控制网络资源的使用情况。 短连接通常用于数据传输不频繁的应用场景,如HTTP请求、文件下载等。

讲一下Redis的Zset表,你说底层用到了跳表,那么他和红黑树的区别在哪里呢?你说跳表用了索引实现,那如果我插入一个数据后会导致索引不可用吗?

在这里插入图片描述
在这里插入图片描述

Redis 的 Zset(有序集合)

Zset 是 Redis 提供的一种数据结构,允许存储唯一的元素,每个元素都有一个关联的分数(score),根据分数进行排序。它支持高效的范围查询和排序操作。

跳表与红黑树的区别

1. 数据结构
  • 跳表:是一种概率性数据结构,由多个层级的链表组成。每一层都是一份有序链表,底层包含所有元素,随着层级的增加,元素数量逐渐减少。
  • 红黑树:是一种自平衡的二叉搜索树,通过颜色标记节点来保持树的平衡,确保操作的时间复杂度为 O(log n)。
2. 性能
  • 跳表
    • 平均时间复杂度为 O(log n) 的插入、删除和查找。
    • 对于简单的实现,跳表的常数因子较小,性能较好。
  • 红黑树
    • 在最坏情况下,所有操作的时间复杂度也是 O(log n),但由于树的结构,常数因子可能较大。
3. 实现复杂性
  • 跳表:相对简单,容易实现。
  • 红黑树:实现复杂,需要保持树的平衡,涉及旋转和颜色调整。

在这里插入图片描述
在这里插入图片描述

课程表

https://leetcode.cn/problems/course-schedule/

func canFinish(numCourses int, prerequisites [][]int) bool {
    book := make([]int, numCourses)
    mp := make([][]int, numCourses)
    for _,v :=  range prerequisites{
        mp[v[1]] = append(mp[v[1]], v[0])
        book[v[0]]++
    }
    ans := 0
    for i:=0;i<numCourses;i++{
        if book[i]==0{
            find(mp, book, i, &ans)
        }
    }
    return ans==numCourses
}

func find(mp [][]int, book []int, x int, ans *int){
    if book[x]==0{
        *ans++
    }
    book[x]--
    for _,v := range mp[x]{
        book[v]--
        if book[v]==0{
            find(mp, book, v, ans)
        }
    }
}

二叉搜索树转换为双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&&tqId=11179&qru=/ta/coding-interviews/question-ranking

package main
import (
    . "nc_tools"
    "fmt"
)
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 
 * @param pRootOfTree TreeNode类 
 * @return TreeNode类
*/
func Convert( pRootOfTree *TreeNode ) *TreeNode {                                                                                   
    if pRootOfTree==nil{
        return nil
    }
    now := pRootOfTree
    l := Convert(pRootOfTree.Left)
    r := Convert(pRootOfTree.Right)
    now.Left = nil
    now.Right = nil
    var root *TreeNode
    if l!=nil{
        root = l
        for l.Right!=nil{
            tmp := l.Right
            tmp.Left = l
            l = tmp
        }
        l.Right = now
        now.Left = l
    }else{
        root = now
    }
    now.Right = r
    if r!=nil{
        r.Left = now
    }
    for r!=nil && r.Right!=nil{
        r.Right.Left = r
        r = r.Right
    }
    return root
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值