😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • Go真实面试题汇总系列

    • 《其他篇》
  • 宝典内容

    • 6. Go和java比有什么不同?
    • 17. go 实现不重启热部署
    • 23.了解的gc算法有哪些?
    • 50. 怎么用go实现一个栈
    • 60. Kratos 框架的特性
    • 82. 信令用wss还是ws?
    • 111. 有对项目和系统做性能测试吗?(benchmark 和 pprodf)
    • 140. cgo了解过引入的风险点吗?
    • 142. go使用中遇到的问题
    • 143. go的profile工具
    • 161. Go 性能分析工具
    • 172. go里面比较成熟的日志框架了解过没有
    • 181. golang 性能问题怎么排查
    • 193. RR是如何实现的
    • 194. RR级别下能否读取事务ID靠后且尚未提交的记录?
    • 197. java和golang的一些共同点以及区别
    • 205. client如何实现长连接?
    • 207. Go语言实现set
    • 211. 有缓冲和无缓冲的区别?
    • 213. 怎么做服务注册发现的
    • 214. 服务发现有哪些机制
    • 215. 当go服务部署到线上了,发现有内存泄露,该怎么处理
    • 221. 堆的结构,堆的创建,节点添加与删除
    • 232. 线程yield(),sleep(), wait()的区别
    • 233. 如何让拥有GC的情况下产生OOM
    • 244. go 建堆过程
    • 246. golang的一些常用工具库
    • 247. 谈谈go语言和其他语言的区别
    • 258. go常用的第三方库
    • 270. 网络连接的各层的状态
    • 271. 了解中间件吗?有什么好处?
    • 280. 看过啥底层包?
    • 281. RPC基础
    • 291. 内存对其了解吗?
    • 292. Go中struct组合与Java继承的区别
    • 299. Go依赖管理历史有几次方式
    • 301. 对比下node和go
    • 303. 说说火焰图?如何分析的?
    • 316. 可以从多个角度来讲比如面向对象来说,多态继承等等
    • 318. 从包管理来讲,gomod包括之前的dep等等
    • 320. 用go写rpc框架的具体功能细节
    • 323. CAS
    • 328. GO语言中的协程与Python中的协程的区别?
    • 335. 如果项目里api耗时过久,你会怎么去排查
    • 336. 对比 Go 语言和 Java 语言
    • 342. golang:pprof使用
    • 343. 性能调优怎么做
    • 347. 如何排查线上程序问题
    • 356. java 实例放在哪个区,常量放在哪个区
    • 358. java内存模型,方法区,堆栈的区别
    • 359. go web项目的部署,后台持续运行与优雅退出
    • 360. golang的defer,channel,reflect,多线程 panic recover
    • 361. 使用interface的好处
    • 362. Gin框架的特点和源码问题
    • 363. close-wait作用
    • 372. golang开发用什么框架
    • 378. python、go 语言特点
    • 387. select、poll、epoll说下详情和各自优缺点
    • 388. delete new和malloc free关系
    • 392. 重载和重写的概念辨析?
    • 393. 在继承里,子类能重载父类方法吗?
    • 400. 值溢出(usignedchar最大255)
    • 415. django与其他框架的区别
    • 433. gin框架的路由是怎么处理的?
    • 435. go性能分析工具
    • 438. 比较 gin 框架和其它框架
    • 446. 如果一个包要依赖另一个包,这个时候如何写单元测试
    • 447. micro怎么用
    • 448. micro服务发现
    • 449. 如何通过goclient写代码获取
    • 460. 使用 database/sql 和 使用 gorm 的区别
    • 467. c 与go的区别优劣

😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

244. go 建堆过程


企业题库解析小组

题目来源: 字节跳动

频次:1

# 答案:苦痛律动

堆的概念

  1. 堆是一个完全二叉树 (除了最后一层,其他都是满节点,最后一层先排左节点)
  2. 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。
  3. 完全二叉树适合用数组存储,因为下标为 i 的元素,它的左子树下标为 2i, 右子树下标为 2i+1。父节点就是 i/2 的 overflow。

大顶堆: 堆中每一个节点的值都必须大于等于其子树中每个节点的值。 小顶堆:堆中每一个节点的值都必须小于等于其子树中每个节点的值。

建堆

堆是用数组存储的,而且 0 下标不存,从 1 开始存储,建堆就是在原地通过交换位置,达到建堆的目的。完全二叉树我们知道,如果最后一个元素的下标为 n, 则 1 到 n/2 是非叶子节点,需要自上而下的堆化(和子节点比较),n/2 +1 到 n 是叶子节点,不需要堆化。

type heap struct{
    m []int
    len int //堆中有多少元素
}

func main() {
    m := []int{0,9,3,6,2,1,7} //第0个下标不放目标元素
    h := buildHeap(m) //建堆,返回一个heap结构
    h.Push(50)
    h.Pop()
    fmt.Println(h.m)
}
/**
建堆,就是在原切片上操作,形成堆结构
只要按照顺序,把切片下标为n/2到1的节点依次堆化,最后就会把整个切片堆化
 */
func buildHeap(m []int) *heap{
    n := len(m)-1
    for i:=n/2; i>0; i-- {
        heapf(m, n, i)
    }
    return &heap{m,n}
}
func (h *heap)Push(data int) {
    h.len++
    h.m = append(h.m, data)//向切片尾部插入数据(推断出父节点下标为i/2)
    i := h.len
    for i/2 >0 && h.m[i/2]<h.m[i] { //自下而上的堆化
        h.m[i/2], h.m[i] = h.m[i], h.m[i/2]
        i = i/2
    }
}
/**
弹出堆顶元素,为防止出现数组空洞,需要把最后一个元素放入堆顶,然后从上到下堆化
 */

func (h *heap)Pop() int{
    if h.len < 1 {
        return -1
    }
    out := h.m[1]
    h.m[1] = h.m[h.len] //把最后一个元素给堆顶
    h.len--
    //对堆顶节点进行堆化即可
    heapf(h.m, h.len, 1)
    return out
}
//对下标为i的节点进行堆化, n表示堆的最后一个节点下标
//2i,2i+1
func heapf(m []int, n,i int) {
    for {
        maxPos := i
        if 2*i<= n && m[2*i] > m[i] {
            maxPos = 2*i
        }
        if 2*i+1 <=n && m[2*i+1] > m[maxPos] {
            maxPos = 2*i + 1
        }
        if maxPos == i { //如果i节点位置正确,则退出
            break
        }
        m[i],m[maxPos] = m[maxPos],m[i]
        i = maxPos
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

参考文章 (opens new window)

#

  • 答案:苦痛律动