- 博客(373)
- 资源 (9)
- 收藏
- 关注
原创 golang的channel机制底层实现
1.6 若最后,通道还是没有准备好接收数据(对于非缓存而言就是还没有发送方,也就是c的sendq里没有等待发送的go,对于缓存而言就是buf还是空的),则构建一个sudog,其elem存储接收数据的地址ep,g存储当前go,c存储此通道。1.2 通道还没有准备好接收数据(对于非缓存而言就是还没有发送方,也就是c的sendq里没有等待发送的go,对于缓存而言就是buf还是空的)对于非缓存而言,直接将数据从发送的go要发送的数据地址拷贝至接收地址ep也就是&val;channel主要调用发送和接收两个方法,
2023-07-18 15:31:09
772
1
原创 链表实现排序(归并排序/快速排序)
一分为二时使用快慢指针找到中点区分。目的是使得左边的值都小于pivot,右边的值都不小于pivot 所以用一个索引记录左边的坐标,遍历过程中,每次碰到比pivot小的,都要交换一下,放到左边。题解1:https://leetcode.cn/problems/sort-list/solutions/9318/gui-bing-pai-xu-he-kuai-su-pai-xu-by-a380922457/自底向上的归并排序,先两个两个的 merge,完成一趟后,再 4 个4个的 merge,直到结束。
2023-07-16 22:06:07
1699
原创 C++实现主要排序算法
某一趟如果选出的最小值涉及到与最后a[i]的交换,若最小值之前仍有a[i]一样的值,则交换后,两个一样值的a[i]顺序就不保证,故不稳定;6 快速排序,选出基准p,划分左右两个区间,i/j前后便利后最终i==j,此时就是两个区间分界,将基准与分界a[i]交换,此时有可能就改变顺序,故不稳定;3 希尔排序,间隔d内单次是一个插入排序,d距离直到1才完成排序,但是不同距离排序过程中,相同元素可能在各自插入排序中打乱,故不稳定;,多趟,每趟相邻两两交换,冒泡出最大值到数组最后,相同元素不会交换,故稳定;
2023-06-18 20:37:27
120
原创 Epoll具体底层流程
/就绪socket队列,epoll_wait在有就绪事件后通过socker->sock->sd_data_ready调用注册的回调函数ep_poll_callback,ep_poll_callback函数会将有就绪的epitem放入rdllist;(2)等数据接收完毕,调用socker->sock->sk_data_ready也就sock_def_readable,这个函数可以找到epoll_ctl注册到socker->sock->wq里等待项qq里的注册函数ep_poll_callback;
2023-05-27 15:10:43
1161
原创 回溯算法——GO解决Leetcode
1,46题,全排列var res [][]intfunc permute(nums []int) [][]int { res=nil helper(nums,[]int(nil)) return res}func helper(nums[]int,tmp []int){ if len(tmp)==len(nums){ //不能直接用tmp // 这个 tmp 变量是一个地址引用,结束当前递归,将它加入 res,后续的递归分支还要继
2021-08-29 21:59:06
419
原创 leet-code 所有二叉树路径问题
二叉树路径的问题大致可以分为两类:1、自顶向下:顾名思义,就是从某一个节点(不一定是根节点),从上向下寻找路径,到某一个节点(不一定是叶节点)结束具体题目如下:
2021-06-06 20:55:56
448
原创 centos安装jetbrains projector(解决不能复制问题)
1 安装依赖python3 -m pip install -U pip2 安装yi
2021-05-31 12:51:36
2000
3
原创 设置开机启动
1 以projector为例,脚本[Unit]Description=Jetbrains Projector - Clion [Service]Type=simpleExecStart=/root/.projector/configs/CLion/run.shRestart=always [Install]WantedBy=default.target2cd /etc/systemd/system,新建vim clion.service,将脚本内容填入3.systemct..
2021-05-25 19:19:41
259
原创 golang1.13版本errors新用法
1创建一个被包装的 errorerr1 := errors.New("new error")err2 := fmt.Errorf("err2: [%w]", err1)err3 := fmt.Errorf("err3: [%w]", err2)fmt.Println(err3)2. 拆开一个被包装的 errorerr1 := errors.New("new error")err2 := fmt.Errorf("err2: [%w]", err1)err3 := fmt.Errorf
2021-04-21 17:01:47
799
原创 二分法解决最值的最值化
1.两球之间的磁力,求的是m个球中相邻两球距离的最小值的最大化func maxDistance(position []int, m int) int { /* 二分法,图片可以参考:https://leetcode-cn.com/problems/magnetic-force-between-two-balls/solution/c-er-fen-sou-suo-by-acvv_itdef-og5j/ 0.最小磁力指的是这 m 个球中相邻两球距离的最小值的结论。对于i<j
2021-04-19 22:48:41
304
原创 字典树及GO实现
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。前缀树的3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的所有子节点包含的字符
2021-03-28 14:29:25
338
原创 并查集及GO实现
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集被很多人认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中。具体引入可以参考:说明三种主要操作:Make_Set(x):建立一个新的集合,其唯一
2021-03-27 15:39:23
986
原创 线段树GO实现
var sum []intvar lazyT[]intvar arr[]int//改变了区间中某一个值或某些值时,我们需要沿着线段树向上更新改变值的节点与根节点间的所有值,可以看出这部操作与线段树的高度有关,复杂度为O(logn)func pushUp(idx int){ sum[idx]=sum[idx*2]+sum[idx*2+1]}//buildfunc build(left,right,idx int){ if left==right{ //单节点 sum[idx]=a.
2021-03-21 17:13:09
389
原创 线段树--用于海量数组中高效查询与修改1
经典场景:一个给定较大的数组X:要求1: 可以随时更新某个区间[i,j]内的元素要求2:可以查询火统计某个区间[i,j]内最值/和等。常见做法:对于要求1,遍历区间[i, j],进行元素的更新,时间复杂度 O ( n ) ;对于要求2,遍历区间[i, j],查询最值,时间复杂度 O ( n ) ;如数组元素个数较大时,耗时严重。由此引入线段树,保证对数数据内更新火查询某个区间。线段树定义:线段树是一种利用分治思想处理对一段序列进行大量区间操作(修改、查询)的数据结构。线段
2021-03-21 15:16:52
234
原创 centos下保留python2安装python3
1. 安装依赖环境# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel2.在python官网找到自己需要的python,tar包下载至本地,具体https://www.python.org/ftp/python/,如选择3.5.10# wg...
2021-03-11 15:32:33
197
原创 GO实现leetcode 股票利润最大化问题-动态规划
1 只允许一次交易,一次交易func maxProfit(prices []int) int { /* 动态规划 dp[i][j]代表第i天j状态(j=0表示当天不持有股票,=1则表示持有)下持有现金情况(如果是买入则为负数,卖出则是正数): 转移方程: 1第i天不持有股票,则存在两种情况: 1.1 昨天不持有,当日不做什么 1.2 昨天持有,当日卖出 dp[i][0]=max(dp[i-1][0],dp[i-1][1]+p[i])
2021-01-24 20:06:38
360
转载 借助GO接口实现堆
https://blog.youkuaiyun.com/weixin_40631132/article/details/105208272
2020-12-26 01:35:14
218
原创 常见内排序-go版本实现
1 选择排序表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,O(1)的空间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间,不稳定。举个例子:对于2954816step1:在列表中先选择最大元9并与最后一个数字6交换2654819;step2:在剩余列表选择最大元8并与最后一个数字1交换2654189;step3:在剩下列表选择最大元6并与最后一个数字1交换2154689;s...
2020-12-25 19:26:29
255
原创 leetcode 770 Basic Calculator IV题目解析
func basicCalculatorIV(expression string, evalvars []string, evalints []int) []string { index=0 //must have else commit alwalys fail however exe is right fmt.Println(expression) var res []string str = expression gEvalvars = evalvars gEvalints .
2020-12-18 22:29:39
467
1
原创 堆及堆排序和应用-go实现
1 堆排序//heap/*根据树的性质,树节点前一半一定是分支节点(有孩子),故从这些节点开始调整出初始堆,,len(a)/2-1是第一个非叶子 */ func constructHeap(heap []int) { for i:=len(heap)/2-1;i>=0;i-- { adjustHeap(heap,i,len(heap)) } } /*每次调整使得满足堆定义 */ func adjustHeap(heap []int,start,length int)
2020-12-17 17:41:25
240
原创 centos7安装docker
前提条件目前,CentOS仅发行版本中的内核支持Docker。Docker运行在CentOS7上,要求系统为64位、系统内核版本为3.10以上。Docker运行在CentOS-6.5或更高的版本的CentOS上,要求系统为64位、系统内核版本为2.6.32-431或者更高版本。1 首先查看centos版本及内核测试机器是centos7 且内核版本是3.10以上,故满足要求。2 卸载旧版本(如果以前安装过)yum remove docker docke...
2020-12-14 17:13:00
154
原创 centso离线安装mysql5.7
1 首先从官网下载centso对应的mysql5.7MySQL 5.7 Linux安装包下载:https://downloads.mysql.com/archives/community/根据自己系统位数选择:2 查询并卸载系统自带的Mariadbrpm -qa | grep mariadbrpm -e --nodeps mariadb-5.5.56-2.el7.x86_64其他的类似这样命令删除干净2 创建数据库数据存储目录、日志目录及临时目录 mkdir -
2020-12-10 11:41:11
186
原创 单调栈
单调栈:保持调顺序的栈。单调递增栈:从底到定从小到大排序,解决寻找最近的比本身值小的左或右的元素;具体来说:单调递增栈可以找到左起第一个比当前数字小的元素。比如数组 [2 1 4 6 5],刚开始空栈故2入栈,数字1入栈的时候,发现栈顶元素2比较大,1不能直接入栈否则破坏递增性,先将2移出栈,此时1入栈。那么此时说明2和1都没左起比自身小的数字。然后数字4入栈的时候,栈顶元素1小于4,于是1就是4左起第一个小的数字。此时栈里有1和4,然后数字6入栈的时候,栈顶元素4小于6,于是4就是6左起第
2020-12-06 16:34:00
258
原创 vim在docker中按上下左右键失效出现:error388 couldn‘t find definition
找到vim的vimrc文件vim /etc/vimrc然后在该文档的最后加入:set term=builtin_ansi,然后保存退出
2020-12-01 10:52:46
557
原创 常见GC及golang的垃圾回收
常见的垃圾回收机制有两大种:一 引用计数每个对象维护一个引用计数器,当引用该对象的对象被销毁或者更新的时候,被引用对象的引用计数器自动减 1,当被应用的对象被创建,或者赋值给其他对象时,引用 +1,引用为 0 的时候回收优点:实现简单;渐进式回收;回收及时;缺点:循环引用;维护计数单元较为麻烦二 跟踪回收跟踪回收根据特点又可以分为三大类:2.1 标记-清理内存单元并不会在变成垃圾立刻回收,而是保持不可达状态,直到到达某个阈值或者固定时间长度。这个时候系统会挂起用户程序,也就是
2020-07-25 16:58:15
718
原创 go slice map扩容
slice操作对象是切片对象,当扩容后,新生成一个新的底层数组,返回一个新的切片对象,与旧的切片指向不同底层数组;map操作对象是引用,当扩容后,引用地址不变,这也就是map元素不可寻址原因。...
2020-06-25 18:04:33
884
原创 go saram 消费者调用逻辑
comsumer.goConsumePartition(topic string, partition int32, offset int64)->c.refBrokerConsumer(leader)->c.newBrokerConsumer(broker)->go withRecover(bc.subscriptionConsumer)->bc.fetchNewMessages()->bc.broker.Fetch(request)b
2020-06-17 15:08:57
425
1
原创 kafka controller作用
controller主要依靠ZK完成对集群broker和分区的管理如集群broker信息、分区选举ISR等。ZK主要一二级节点信息如下
2020-06-01 20:35:31
5220
原创 kafka broker常见请求类型分析
请求包括头部和请求体。请求体因请求类型不同而不同,请求头部格式固定包括:api_key:请求类型如producer请求/fetch请求/元数据请求api_version:给定一请求类型的具体版本correlation_id:类似request_id,用于定位问题client_id:发送该请求的客户端ID响应也分为头部和响应体,响应头部格式固定:correlationd_id:请求字段中的correlation_id注:[x]代表是一个数组,数组中每个元素是x一 produce
2020-05-31 15:40:39
500
原创 KAFKA 服务端日志LEO和HW机制带来的问题及其解决方案
一、KAFKA 服务端日志LEO和HW带来的问题KAFKA 服务端日志LEO和HW无论是leader还是follow的HW更新都需要第二轮fetch才能完成,若在第二轮fetch中follow或leader崩溃则有可能带来数据丢失或数据不一致问题。1.1 数据丢失该主题有两个副本,其中A是leader,B是follow。设min.insync.replicas=1 and acks=-1则当生产者发送信息后只要leader A 写入到底层,此时kafka就好通知生产者发送成功。按照现有H
2020-05-24 19:53:33
692
原创 KAFKA 服务端日志LEO和HW说明
KAFKA 服务端一个日志文件包含两个特性:日志末端位移(log-end-offset)和高水印(high-watermask),无论是LEADER还是follow副本均含有这两个特性:LEO:该副本底层log文件下一条要写入的消息的位移,例如LEO=10则当前文件已经写了了10条消息,位移是[0,10)。HW:所有分区已提交的的位移,HW之外consumer无法消费,一般HW<=LEO。一 LEO更新机制1.1 follow的LEO更新机制follow的LEO更新机制包括foll
2020-05-24 16:14:40
732
2
原创 KAFKA 生产者消费者的“事前事后”
一 生产者的“事前事后”---producer拦截器producer拦截器主要实现生产者端定制化功能需求。对于producer,拦截器使得用户可以在消息发送前以及响应回调时有机会对数据做定制化修改。若多个拦截器作用于同一个消息则形成一个拦截链。主要实现方法:onSend(record):该方法运行在用户主线程中也就是send方法中。producer确保在消息被序列化后计算分区前调用。用户可以对消息做任何操作修改。onAcknowledgaement(metadata,exceptio
2020-05-22 22:40:44
295
原创 kafka消费者组重平衡分析
一 概念一个consumer group 通过一定的分配算法来分配消费订阅的topic的所有分区。具体有协调者完成重平滑流程。二 触发条件组成员发送变更,如consumer增加或减少如consumer进程崩溃、consumer进程所在机器宕机、consumer异常比如poll间隔太久;组订阅的topic数变更,如使用基于正则的订阅,当匹配正则的新的topic创建时会触发;组订阅topic的分区数变化,如使用命令增加了topic的分区数。三 分区分配算法range算法round
2020-05-22 20:51:41
608
原创 kafka生产者消费者同步与异步
一 生产者发送的同步与异步生产者发送消息依靠send方法,主要要同步和异步两种:异步发送producer.send(record,callback)callback就是对发送消息后的回调。该方法输入参数是metaData和exception:当消息异步发送成功则exception为空;反之若发送失败则metadata为空exception非空。同步发送producer.send(record).get()通过调用feature.get无限等待。若没有失败则返回对应的metaDat
2020-05-22 11:36:12
4139
1
clang_library
2015-11-28
tags_vim_master
2015-11-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人