- 博客(44)
- 收藏
- 关注
原创 Raft-领导者选举
本文主要分析了raft算法领导者选举的原理和NuRaft库关于这部分的源码分析。源码分析这里主要探讨了Pre Vote阶段的原因,以及选举大体上的流程。还有很多细节上的点需要再研究。
2025-07-12 21:29:23
1244
原创 Clickhouse诊断工具之chdig
本文初步介绍了chdig的开发动机,安装部署以及基本功能的使用。这个工具功能还是很强大的(主要是实时性的诊断),后续可以基于这个功能做一些前端的可视化的东西。
2025-07-09 00:43:31
749
原创 Clickhouse源码分析-TTL执行流程
如果没有ttl_only_drop_parts的配置,过期数据的删除(这里是删除,是将过期的数据从这个part删除,并将过期的数据构成一个part,这个过期的part标记为inactive,没过期的变为新part)会在TTL Merge任务中进行。示例如下,ttl_only_drop_parts = 0:插入数据:SELECT。
2025-06-30 23:28:47
960
2
原创 Clickhouse-keeper源码分析:TCP连接处理流程
TCPServer::run() [Net\src\TCPServer.cpp] 做了什么。可以看到主要就是监听连接,如果连接被接受,就执行_pDispatcher->enqueue(ss)。我们在创建TCPServer的时候,没有指定filter,所以_pConnectionFilter为nullptr。先看一下:SocketImpl::poll((const Poco::Timespan& timeout, int mode)
2025-06-26 01:09:28
1110
原创 Clickhouse源码分析-Replicated Database创建流程
DDL: 这里需要你提前启动1个clickhouse,1个clickhouse-keeper。断点:前台线程调用栈:后台线程调用栈: 可以看到前台线程执行成功后直接返回给客户端:主要看一下initializeReplication:再看一下recoverLostReplica:这一部分为了构建依赖:执行创建表语句:未完待续......不显示源码的问题:info source查看:解决:/home/user/clickhouse/src为调试的Clickhouse的源码路径
2025-06-19 22:46:02
832
原创 linux内核调试
是 QEMU 提供的一个用于模拟 x86 架构(如 x86_64 或 i386)计算机系统的可执行程序。简单来说:它可以在你的电脑上虚拟出一个完整的 x86 电脑,用来运行操作系统、测试内核、开发系统级软件等。它把很多常用的 Linux 命令(比如 ls、cp、mv、sh、mount 等)集成到一个单一的可执行文件里。没有根文件系统,内核是“裸”的,无法完成完整的系统启动和运行;根文件系统为系统提供了完整的用户空间环境。BusyBox 是一个非常轻量级的多合一工具箱,常被称为“Linux 的瑞士军刀”。
2025-06-18 23:37:43
938
原创 linux内核-写时复制之实验+源码分析
相信大家都听过大名鼎鼎的copy on write技术,并且学习过原理。但是可能对于代码中具体的发生场景,脑海中可能没有实体的映射。下面使用1个例子说明copy on write的发生时间。
2025-06-17 22:37:57
331
原创 linux内核编译+问题记录
之后重新编译,重新make modules_install。make modules_install 时出现以下问题。如何解决:在编译前执行以下命令。
2025-06-12 00:01:51
621
1
原创 1456. 定长子串中元音的最大数目(原始暴力匹配法以及滑动窗口法)
向右滑动一格后(即i++后),考虑。(表示移进来的一格),2.采用滑动窗口方法。综上,可概括为上式。
2023-06-18 15:59:26
232
原创 virtual修饰类的成员函数/析构函数
不加virtual: 只释放基类内存,执行基类语义加 virtual: 释放派生类和基类内存,并且先执行派生类重写的语义。
2023-06-12 16:17:11
490
原创 leetcode11. 盛最多水的容器(还在用暴力解法?)
因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;因此,每轮向内移动短板,所有消去的状态都 不会导致面积最大值丢失。这种解决方法只考虑了n种情况,其余情况如何能直接排除呢?可容纳水的高度由两个板子之中的短板决定。在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽。而所有消去状态的面积一定都小于当前面积(即。就是记录下两两之间的容量结果,并记录下最大值。至此可能有同学会有疑问,在暴力解下会有。但是时间复杂度达到了。
2023-06-12 11:04:19
101
原创 leetcode443. 压缩字符串
特别地,为了达到 O(1)空间复杂度,我们需要自行实现将数字转化为字符串写入到原字符串的功能。位于某一段连续相同子串的最右侧。该子串对应的字符即为读指针。为了实现原地压缩,我们可以使用双指针分别标志我们在字符串中读。移动到某一段连续相同子串的最右侧,我们就在写指针。指向的字符不同于下一个字符时,我们就认为读指针。记录该子串的最左侧的位置,这样子串长度即为。处依次写入该子串对应的字符和子串长度即可。位于字符串的末尾,或读指针。写入原字符串中,然后再将其。在实际代码中,当读指针。
2023-06-11 17:07:49
254
原创 leetcode238. 除自身以外数组的乘积(偶遇无符号数的陷阱)
对于数组 L,L[0] 应该是 1,因为第一个元素的左边没有元素。对于其他元素:L[i] = L[i-1] * nums[i-1]。其他元素:R[i] = R[i+1] * nums[i+1]。此时可以发现j变为一个异常大的数,这会导致当前循环会无限进行,因为当j变为0后经过j–又会变成一个超级大的数。当 R 和 L 数组填充完成,我们只需要在输入数组上迭代,且索引 i 处的值为:L[i] * R[i]。之前在学计组的时候虽然已经知道会有这种情况的发生,但是一直没注意,今天真的是给我上了一课。
2023-06-11 15:54:28
123
原创 leetcode151.反转字符串中的单词
原因:start遍历的是原字符串的位置,它开头可能有多个空字符,中间也可能有多个空字符如果直接加start则不满足题目的要求,而使用。
2023-06-11 14:58:20
383
原创 多重定义全局符号的问题(与链接中符号解析有关)
先看一个例子:输出:当在main函数中引用p函数进行输出的时候为什么会出现这种输出结果呢?原因如下:1.先明白链接时符号的类型。(1)模块内部定义的全局符号,可以被其他模块引用的符号例如:不带static关键字的c函数和全局变量(2)外部定义的全局符号,可以在本模块中使用的符号例如:有extern引用的符号(3)模块中的局部符号例如:模块中带static的c函数和局部变量2.其次明白什么是强符号什么是弱符号。注:强弱只针对全局符号...
2022-04-17 21:30:26
983
原创 合并两个单链表
1.以下是基于带头结点的单链表的合并(并且两个链表都是有序的链表)p1 ,p2两个指针分别指向两个链表的第一个元素申请head结点作为新链表的头结点,申请pre指针指向头结点 第一次: 对p1,p2指针指向位置的元素进行比对,将较小的元素挂在head结点之后,调整更小的元素的对应结点的指针,调整pre指针,以便之后将元素依次挂在后面。之后重复此操作第二次:重复第一次的操作...
2022-02-16 19:29:44
13617
1
原创 单链表的所有操作
1.结构体定义typedef struct LNode{ int data; LNode* next;}*LinkList,LNode;LinkList 强调它是一个单链表,LNode强调是一个结点 。以下是带头结点的单链表的所有操作2.基本操作2.1 初始化//带头结点的初始化bool InitList(LinkList& L) { L = (LNode*)malloc(sizeof(LNode)); if (L == NULL) { ...
2022-02-16 01:11:29
375
原创 二叉树的非递遍历
一.前序非递归遍历1.前序非递归遍历原理二叉树的非递归遍历需要借助栈来实现,将根节点压栈,再出栈顶元素,再将这个元素的左右孩子压栈(次序,右孩子先进入,左孩子后进入),重复上述操作,直至遍历结束。2.图解3.代码实现定义栈结构,操作://链栈结构typedef struct SNode { struct TNode * node; struct SNode* next;}*Link...
2022-02-12 16:01:35
1018
原创 详解二叉排序树非递归与递归建立和插入
1.非递归建立先看一下一个结点是如何插入如图:p指针用来查找要插入的位置,q指针记录插入位置的父节点,之后用于连接孩子结点第一次比较后调整p,q第二次比较第三次第四次,插入对应的关键字对应排序树的结构体:typedef int ElemType;typedef struct BSTNode { ElemType key; struct BSTNode *lchild, *rchild;}*BSTree,BSTNode;非...
2022-02-09 19:03:52
4213
1
原创 详解线索二叉树
1.了解线索二叉树之前要知道为什么需要线索二叉树typedef struct BiTNode{ // Node structure ElemType data; // node data struct BiTNode *lchild; // left child struct BiTNode *rchild; // right child}BiTNode, *BiTree;//线索二叉树的定义普通的链式存储的二叉树只有数据域,左,右孩子
2022-02-09 01:08:56
1635
原创 深度刨析多维数组与指针
1.多维数组数组名就为首元素地址当定义如下数组后:int arr[2][3][2] = { 1 }; //这里初始化只有第一个元素为1,其余为0逻辑上可以理解为一个空间矩阵,实际也只是内存中线性存储而我们知道数组名就是首元素地址,所以arr[1] 可以理解为:* (arr+1),arr[1]就是第二个元素的地址(即维护了6-11元素) for (i = 0; i < 2; i++) { printf("arr[%d] :%p \n",i, arr[i.
2022-02-08 15:50:41
580
原创 利用栈实现括号匹配问题
1.原理步骤从头开始扫描字符串,如果是左括号,入栈 如果是右括号,检查栈是否为空,如果为空,说明没有左括号与当前的右括号相匹配。如果栈不为空且栈顶元素与当前符号相匹配,继续检查下一元素 重复以上过程,直至扫描完最后一个元素 检查栈是否为空,如果不为空,说明栈中还存有左括号没有与之对应的右括号相匹配。如果为空,说明匹配成功2.代码实现#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define MaxSize 50typed
2022-02-07 00:20:28
4823
2
原创 java String、 StringBuffer和StringBuilder的比较
1.不同1)StringBuilder和StringBuffer非常类似 均代表可变的字符序列,且方法也一样2) String:不可变字符序列, 效率低,但是复用率高。3) StringBuffer:可变字符序列、效率较高(增删)、线程安全, 看源码4)StringBuilder:可变字符序列、效率最高、线程不安全5) String使用注意说明: string s="a"; //创建了一个字符串 s += "b"; //实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符 串s+
2022-02-05 17:59:21
440
原创 详解kmp算法
1.朴素模式匹配1.1基本思想:从主串test 和子串pattern 的第一个字符开始,将两字符串的字符一一比对,如果出现某个字符不匹配,主串回溯到第二个字符,子串回溯到第一个字符再进行一一比对。如果出现某个字符不匹配,主串回溯到第三个字符,子串回溯到第一个字符再进行一一比对…循环一直到子串字符全部匹配成功。1.2例如:第一次:不匹配第二次:主串从第2个字符,模式串从头开始,直到b与c不匹配第三次:主串从第3个位置开始,模式串从头开始,a与c...
2022-02-05 13:31:53
7293
原创 详解折半查找
1.顺序查找顺序查找是从线性表的一端,依次对比 每个元素,直到找到要查找的元素,或者没有找到。代码实现:int SqSearch(int arr[],int length,int x) { for (int i = 0; i < length; i++) { if (arr[i] == x) { return i; //找到返回元素的下标 } } return -1; //没找到返回一个-1}2.折半查找折半查找又称二分查找,它仅适用于有序的顺序表。
2022-02-01 20:57:02
3180
原创 使用java集合,冒泡排序法实现book类按价格进行排序
1.代码实现package list;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class test2 { public static void main(String[] args) { List list=new ArrayList(); list.add(new Book("三国",67.2)); lis
2022-02-01 19:47:06
1585
1
原创 c语言柔性数组
1.柔性数组柔性数组, 也叫0长度数组struct S{ int data; int arr[0]; //0长数组};2.柔性数组的特点结构体中的柔性数组前必须至少有一个成员 sizedof这种结构不包括柔性数组的大小 包含柔性数组的结构开辟空间时需要用 malloc()函数 动态开辟3.柔性数组与传统动态增加大小区别3.1传统动态分配定义:struct S2{ int data; int* point;}; S1*...
2022-02-01 13:23:32
1279
原创 对称矩阵的压缩
1.定义若一个方阵A [1...n] [1...n]中的一个任意元素都有a [ i,j ] =a [ j,i ] (1<=i,j<=n),则称其为对称矩阵。对于一个n阶方阵,可以划分为三个区域,即上三角区,主对角线,下三角区。2.压缩原因因为对称矩阵上三角区和下三角区对应的元素相同,如果都存储会造成空间的极大浪费,因此只需要把下三角区(或上三角区)和对角线上的元素进行存储即可。3.实现原理对于方阵A [1...n] [1...n]下三角区和主对角线每行元素为(且i>.
2022-01-31 22:25:25
1942
原创 c语言memcpy()函数与memmove()函数区别与模拟实现
1.memcpy()1.1简介头文件:#include <string.h>memcpy() 用来复制内存数据,其原型为: void * memcpy ( void * dest, const void * src, size_t num );memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上。因为传过来的参数用void*接收,所以它并不关心类型参数,可以传递任何类型,之后逐字节地进行复制,...
2022-01-30 00:32:43
299
原创 详解基数排序
1.基数排序基数排序是一种特殊的排序方式,不是基于比较进行排序,而是基于关键字的各个位置大小进行"分配"和"收集"两种操作对关键字序列进行排序的一种排序方式。基数排序可以分为:最高位优先(MSD)和最低位优先(LSD)2.基数排序原理1.观察排序字段最大的数字,它有几位决定了需要分配和收集的次数2.按照元素每一位的大小分配入对应容器(如数组,链表,队列等)3.按照容器的次序依次收集数据4.重复前两步,直至每一位都分配,收集完毕例如:3.代码实现本算法使用链表作
2022-01-28 17:52:36
3228
原创 详解归并排序
1.归并排序归并排序使用了分治和递归的思想,将具有n的元素的无序序列划分为n个每个含有一个元素的序列,再将n个有序序列采用二路归并等合并方法进行合并排序成一个有序的序列。2.归并实现步骤2.1.划分划分左半部分后,合并排序左半部分 2.1.1递归划分左半部分如图:从中间划分,之后再从左半部分划分,递归划分左边部分...... 直至划分为一个子序列2.1.2合并左半部分的子序列,后面同理2.1.划分右半部分后,合并排序右...
2022-01-27 16:54:45
996
原创 链式队列的定义与实现
1.链式队列链式队列是一种同时带有队头指针和队尾指针的单链表,头指针指向队头结点,尾指针指向队尾结点。如图:2.队列的存储结构类型可以描述为:typedef struct Node{ int data; struct Node* next;}LinkNode;typedef struct Queue{ LinkNode* rear; //头指针 LinkNode* front; //尾指针 int count; //用于记录队列的元素个数}LinkQueue;
2022-01-27 00:09:02
4403
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅