![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与设计模式
文章平均质量分 75
WULI_LIN
这个作者很懒,什么都没留下…
展开
-
时间轮定时器实现
1 定时器应用场景a. 批量处理定时任务b. 心跳检测c. 和网络事件一起使用2 时间轮2.1 什么是时间轮时间是一种调度模型, 为高效解决调度任务而产生的2.2 为什么要用时间轮在讨论为什么定时器要用时间轮之前, 我们先了解一下几种其他实现方式的调度器a. 有序队列添加/删除任务: 遍历每一个节点, 找到相应的位置插入, 因此时间复杂度为O(n)处理到期任务: 取出最小定时任务为首节点, 因此时间复杂度为O(1)b. 红黑树有序队列的性能瓶颈在于插入任务和删除任务(原创 2021-07-31 16:12:44 · 1503 阅读 · 0 评论 -
KMP字符串匹配算法
引入在字符串匹配时, 如果运用暴力匹配法:text: abababcpattern: ababc暴力匹配法:1.abababcababc2.abababc a 3.abababc ababc而这种匹配的效率并不高, 我们通常更希望的做法是:1.abababcababc2.abababc ababc而如果想像上面那样直接+2去匹配的方式,则可以运用kmp的算法kmp算法原理首先我们得解决一个问题, 就是每次匹配不成功的话, 应该要跳原创 2021-01-20 22:47:36 · 389 阅读 · 2 评论 -
线程池的实现(自动扩容与删减)
在高并发场景、IO密集型时我们往往需要创建多线成去执行相应的任务,但往往频繁地去创建和销毁线程会影响整个系统的性能,因此提前创建好线程池,当有任务时,直接丢进线程池里去执行就可以了,而不用再另外创建线程线程池的实现主要实现思想:首先统一创建多条线程,并等待任务的到来(pthread_cond_wait);当有任务加进任务队列里,便唤醒一条等待的线程(pthread_cond_signal);被唤醒的线程从任务队列里取出一个任务,并执行相应的任务(回调)工作组件(消费者):维护线程队列,执行相应的原创 2021-01-11 21:35:42 · 1277 阅读 · 0 评论 -
B-树学习笔记
1 性质1. 每个结点至多拥有M课子树2. 根结点至少拥有两颗子树3. 除了根结点以外,其余每个分支结点至少拥有M/2课子树4. 所有的叶结点都在同一层上5. 有k课子树的分支结点则存在k-1个关键字,关键字按照递增顺序进行排序6. 关键字数量满足ceil(M/2)-1 <= n <= M-12 插入先裂变再添加叶子结点不满(小于m-1),直接插入如果结点满了(等于m-1),对该结点先进行裂变,这样叶子结点就为不满状态,这时在插入裂变x分裂的父结点,y要分裂的结原创 2020-12-19 22:49:41 · 151 阅读 · 2 评论 -
搞懂红黑树及其应用场景
红黑树1 性质1. 每个结点是红的或黑的2. 根结点是黑的3. 每个叶子结点是黑色的4. 如果一个结点是红的,则它的两个儿子都是黑的(不能有连续两个红色结点)5. 对每个结点,从该节点到其子孙结点的所有路径上的包含相同数目的黑结点2 插入插入结点时默认是插入的红色结点,因为只有插入红色结点,在没调整的情况下,才能保证性质 5(所有路径包含相同数目的黑结点)因为插入的结点为红色,因此如果父结点也为红色,则需要调整调整方法1). 插入结点为根结点 --> 变色2). 插入结点的原创 2020-11-27 23:56:24 · 4673 阅读 · 0 评论 -
二叉树学习笔记
二叉树插入插入值 < 结点值,插入结点的左子树插入值 > 结点值,插入结点的又子树不插入相同的值遍历1 前序遍历根结点 -> 左子树 -> 右子树2 中序遍历左子树 -> 根结点 -> 右子树3 后序遍历左子树 -> 右子树 -> 根结点删除结点1 删除的结点没有左右子树直接删除该结点 if (del_node->entry.left == NULL && del_node-&g原创 2020-11-27 23:43:12 · 255 阅读 · 0 评论 -
快速排序-quick sort
#include <stdio.h>void sort(int *data, int left, int right){ int i, j, key; i = left; j = right; key = data[left]; if (right <= left) return; while (i != j) { while (i < j && key <= data[j]) { j--; } data[i原创 2020-11-03 23:41:23 · 103 阅读 · 0 评论 -
归并排序-gerge sort
#include <stdio.h>#include <stdlib.h>void sort(int *data, int *temp, int start, int middle, int end){ int i, j, k; if (end <= start) return; i = start; j = middle + 1; k = start; while (i <= middle && j <= end)原创 2020-11-03 23:23:16 · 122 阅读 · 0 评论 -
希尔排序-shell sort
希尔排序算法思想: 分组int data[] = {56, 34, 54, 50, 81, 70, 7, 74, 26, 65, 71, 4, 37, 76, 91, 36};第一个循环(分组):初始值 gap = length / 2, 即 gap = 16 / 2 = 8, 先分为8组进行(目的组内排序)gap = gap / 2, 直到 gap < 0 结束, 即 gap = 8 --> 4 --> 2 --> 1 --> 0第二个循环(遍历每个原创 2020-11-02 19:46:13 · 149 阅读 · 0 评论