- 博客(180)
- 收藏
- 关注
原创 限流算法
我们知道,限流算法最简单的就是计数器法,当时间间隔超过设定的k秒后,就拒绝请求,简单的伪代码就是://k为设定的时间间隔if(now < (start_time + k)){ // k 秒内小于阈值 if(capacity < ioslevel) capacity++; else reject ;}else{ start_time = now; capacity = 0;}但是这样的话,就会导致:假设时
2021-01-03 21:45:05 302
原创 leetcode------分割回文串
解题思路:这个简单的方法就是,用回溯,一个个的遍历。每一次从下一个遍历之前,都需要判断当前子串是不是回文串,这里的回文串检查可以用动态规划储存起来,加快速度:dp[i][j]是不是回文串,判断s[i] == s[j] && ( j -i< 3 || dp[i+1][j-1])class Solution {public: bool IsHUIWEN(string s) { int l = 0; int r = s...
2020-12-31 14:45:24 311
原创 Libevent---数据结构
1. 事件处理对象--event Libevent中事件处理对象是event结构类型。event结构体封装了句柄、事件类型、回调函数,以及其他必要的标志和数据。struct event { // 事件回调结构 struct event_callback ev_evcallback; /* for managing timeouts */ //如果是超时事件,则表明是小根堆还是通用超时队列 union { TAILQ_ENTRY(even..
2020-12-30 10:11:36 333
原创 Libevent--事件处理
以I/O事件为例 Libevent源码版本2.1.111. 注册事件 应用程序调用event_add函数将其添加到注册事件队列中,并将对应的事件注册到事件多路分发器上。intevmap_io_add_(struct event_base *base, evutil_socket_t fd, struct event *ev){ /* 获得event_base的后端I/O复用机制实例 */ const struct eventop *evsel = base-&g...
2020-12-30 10:05:58 642
原创 Libevent--信号事件
对于信号事件的监听,比较不同的是,不是每一个信号有一个event,然后放进内核中去监听。而是对于所有信号,共用一个信号事件event去监听,当有信号来临时,使用管道将信号写进去,libevent通过这个event来监听这个管道,然后当这个管道有数据读的时候,这个event的回调函数就是遍历管道中的信号,然后分别将该信号的事件处理器添加到激活队列中。 ...
2020-12-30 10:00:44 657
原创 Libevent--通知
我们可能考虑到主线程正在阻塞dispatch上,由于没有任何事件就绪,因此dispatch会阻塞到设置的超时时间才会返回;为了能让dispatch在需要返回的时候立刻返回,Libevent采用了和信号处理相同的方式:定义一个内部事件专门用来唤醒主线程,其实就是添加这个内部事件,然后唤醒的方式就是往内部事件监听的管道上写数据。1. event_base中的数据 与事件event一样,event_base中也会存在这样一个内部事件用来进行唤醒,以及一些其他的数据成员,如下所示:st...
2020-12-30 09:52:58 372
原创 Libevent--Timeout
超时事件,在libevent中或许收到了更多的关照,这里使用了两种数据来处理,第一个就是小根堆,第二个就是不同相对超时时间的队列common_timeout。1.为什么要使用两种不同的数据结构呢? 用于超时管理的min_heap,在执行主循环的过程中,它每次都会去检查min_heap的堆顶event是否超时,如果超时的话就进行相应的处理并且从min_heap中移除这个event,然后调整整个堆,直到堆顶event未超时则停止检查。这样每次删除堆顶超时的event时间复杂度只需要O...
2020-12-30 09:43:22 648
原创 最长连续序列
这道题,我想最简单的做法就是先排序,然后顺序记录最长子序列。这样基本不需要辅助空间。如果要实现时间复杂度为O(n)的方法,那么就得用空间来换时间,所以得找一种数据结构来存储,并且很快知道相邻关系。可以使用hash表或者set来存储,这样当一个数num存进去,我就能判断num-1 和num+1在不在里面了。从而我们可以使用set去完成,假设num-1在里面,那么就不应该从num开始计数,从而继续向前检查,直到num-1不在里面,那这样就能将子序列遍历完,并且是最长的。code:class Solut.
2020-12-27 09:58:50 177
原创 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。解题思路:使用动态规划,可以看出,昨天的状态是和今天的状态是有关的上面是截取的leetcode的题解思路,就是今天有股票的收益或者今天没有股票的收益,明显没有股票的收益就是昨天没有股票的收益+今天卖出股票的收益的最大;同理今天持有股票的收益。mark:注意二维数组的最后一维
2020-12-26 15:18:17 144
原创 填充每个节点的下一个右侧节点指针 II-----------------leetcode
给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。解题思路:这一题使用多余的辅助空间就...
2020-12-24 10:48:17 101
原创 leetcode----------填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的...
2020-12-23 11:08:08 183 1
原创 leetcode-----------不同的子序列
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)题目数据保证答案符合 32 位带符号整数范围输入:s = “rabbbit”, t = “rabbit”输出:3解释:如下图所示, 有 3 种可以从 s 中得到 “rabbit” 的方案。(上箭头符号 ^ 表示选取的字母)rabbbit
2020-12-22 09:58:27 167
原创 有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / /-10 5解题思路:我想到的是每一次分治,然后分支的中间节点是根节点,左右分别是左右子树。所以
2020-12-21 09:57:17 329
原创 复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。示例 1:输入:s = “25525511135”输出:[“255.255.11.135”,“25
2020-12-18 14:37:37 271
原创 分割链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5思路:刚开始的思路就是使用两个队列,一个保存小于x的,另一个保存大于或等于x的;然后再重新链接一边。/** * Definition for singly-.
2020-12-08 10:18:25 158
原创 简化路径
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..)表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。..
2020-12-02 10:44:57 262
原创 leetcode-----颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]注:不使用排序算法,仅使用一遍遍历,和常数空间来进行分类我的思路...
2020-04-20 14:47:42 174
原创 leetcode----数青蛙
题目:给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。注意:要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有...
2020-04-19 15:01:34 377
原创 leetcode---打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (...
2020-04-13 23:09:00 189
原创 除数博弈
爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 。 用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家...
2020-04-12 23:34:33 161
原创 内存分配------------伙伴系统
首先(Buddy)伙伴的定义:两个块大小相同 两个块地址连续 两个块必须是同一个大块中分离出来的适用条件:伙伴系统一般使用于大内存块的分配,并且是2的幂次算法方式:申请:从维护的数据结构中寻找合适所要求大小的块,如果满足,并且此块的剩余部分大于一半,那么就将剩下一半分割出来,供以后调用释放:将此块释放,并且搜索此伙伴块是否也是空闲的,如果是,就合并,然后将合并后的块继续判...
2020-03-27 00:01:33 817
原创 leetcode-------编辑距离
解法是参考的别人的题解:class Solution {public: int minDistance(string word1, string word2) { int n1 = word1.size(); int n2 = word2.size(); vector<vector<int>> dp...
2020-03-25 12:22:21 108
原创 最长递增子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。输入: [1,3,6,7,9,4,10,5,6]输出: 6这一题,我刚开始得思路就是暴力法:创建一个数组,用来记录它此时所在得最长长度,这个最长长度就是由从前一位开始,向后遍历,计算最...
2020-03-16 00:02:20 218
原创 基于时间轮的定时器
这里关于时间轮的介绍,我觉得这篇博客介绍的很清晰:时间轮算法 总结: 就是实现一个时钟,首先时钟有N个槽,并且以si时间滴答一次,那么对于一个相对时间t来说,它需要滴答t/si次,才能执行,那么时钟需要到达(cur+t/si)%N,才能执行这个定时器,但是有的...
2020-03-13 23:33:27 239
原创 linux服务器编程处理非活动连接
这篇是基于linux高性能服务器编程:书中说:我们可以利用定时器来处理非活动连接,服务器通常要定期处理非活动连接:给客户端发一个重连请求,或者关闭它,或者其他。linux内核中提供了对连接是否处于活动状态的定期检查机制,我们可以通过socket选项KEEPLIVE来激活它,不过使用这种方式将使得应用程序对连接的管理变得复杂。因此,我们可以考虑在应用层实现类似于KEEPLIVE的机制,以管理所有...
2020-03-06 17:17:32 366
原创 I\O复用,同时处理tcp和udp
这里的实现,是看的高性能服务器编程,里面的实现就是将tcp_socket和udp_socket挂到epoll_event里面,然后当epoll_wait有事件时,从而分别判断fd是tcp_socket还是udp_socket,然后分别进行accept和recvfrom,将得到的连接挂到epoll_event里面。当然如果要处理多个tcp连接,就得创建多个tcp_socket,然后挂到epoll_e...
2020-03-03 15:33:05 244
原创 leetcode------------正则表达式匹配
给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素说明:s可能为空,且只包含从a-z的小写字母。 p可能为空,且只包含从a-z的小写字母,以及字符.和*示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹...
2020-02-18 12:58:51 365
原创 红黑树
红黑树得定义: 其中,条件(1)和(2)意味着红节点均为内部节点,且其父节点及左、右孩子必然存在。另 外,条件(3)意味着红节点之父必为黑色,因此树中任一通路都不含相邻的红节点。 由此可知,在从根节点通往任一节点的沿途,黑节点都不少于红节点。除去根节点本身,沿途所经黑节点的总数称作该节点的黑深度(black depth),根节点的黑深度为0,其余依此...
2020-02-17 16:16:04 749
原创 B-树和B+树
在如今,随着数据库存储量越来越大,实践证明,分级存储才是行之有效的方法。在由内存与外存(磁盘)组成的二级存储系统中, 数据全集往往存放于外存中,计算过程中则可将内存作为外存的高速缓存,存放最常用数据项的 复本。借助高效的调度算法,如此便可将内存的“高速度”与外存的“大容量”结合起来。 两个相邻存储级别之间的数据传输,统称I/O操作。各级存储器的访问速度相差悬殊,故应 尽可能地减少I...
2020-02-16 17:06:50 198
原创 STL中的空间配置器关于free_list的节点的union使用
配置器中free_lists的结构如下:union obj{ union obj* free_list_link; char client_data[1];}因为为了维护链表。每个节点即需要用指针来指向实际区块,同时还要链接着下一个空闲节点。从而每个节点就需要额外的指针来指向下一个空闲节点,这就造成了额外负担。但是在实际赋值时,你只会二选一,要么表示实际区块,要么就表示...
2020-02-12 22:25:39 746 1
原创 重建二叉树
我看剑指offer上写的代码很长,于是我就没看,我就根据书中的两张图,其实有那两张图就够了,这两张图就表示的二叉树的结构关系 我们根据这张图,就可以知道,当输入一个数组,在前序遍历中,第一个节点肯定是根节点,那么在后序遍历中,在root节点前的肯定是左子树,root节点后肯定是...
2020-02-10 17:33:17 115
原创 多重继承与虚拟继承(二)
多重继承首先给出多重继承的例子: #include <iostream>using namespace std;class Point2d{public: Point2d(); ~Point2d(); //.....
2020-02-09 19:55:53 372
原创 算法题-------关于单调栈的应用
在关于一行有高度的数字中,比如需要统计能看到的数字等等时,利用这种单调栈的数据结构就可以很好的解决问题;比如现在有一行数据是2 6 5 4 3 7 1,且这是每个人的身高,每个人向右看,那么就统计每个人能看到的头顶的数量;解法一就是,在每一个人处开始,向右遍历,比较身高,那么这个时间复杂度就为O(n^2);如果利用单调栈,那么就可以实现O(n)的时间复杂度;此时使...
2020-02-08 16:07:33 387
原创 算法题-------压缩算法
题目:小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?输入描述:输入第一行包...
2020-02-05 22:23:34 818
原创 单例模式
单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;并且不允许用户自行创建和赋值;其特点:全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private) 线程安全 禁止赋值和拷贝 用户通过接口获取实例:使用 static 类成员函数其中有两种实现方式:懒汉...
2020-02-03 22:54:58 91
原创 c++---------虚函数及继承(一)
1.class的内存布局(无虚函数&继承版)首先,需要弄清楚一件事情,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 我们这里指的类的大小,其实指的是类的对象所占的大小。因此,如果用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。关于类/对象大小的计算首先,类大小的计算遵循结构体的对齐原则 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普...
2020-01-11 21:50:25 564
原创 epoll的(LT)条件触发和(ET)边缘触发
下面是二者的定义:条件触发(LT):只要输入缓冲有数据就会一直通知该事件边缘触发(ET):输入缓冲收到数据时仅注册1次该事件,即使输入缓冲中还留有数据,也不会再进行注册从而我要说明的是,为什么要强调边缘触发要使用非阻塞IO;因为在服务器端当epoll_wait监听到有客户端fd可读写时,那么就只会返回这一次,但是并不知道此fd有多少数据可读的,如果一直读到没有数据时,那么就会使得服...
2020-01-04 23:15:20 417
原创 深度探索C++--------关于对象及构造函数语意学
c++对象模型每一个class产生出一堆指向virtual functions 的指针,放在表格之中,称为虚函数表。 每一个class object 被安插一个指针,指向相关的virtual table。通常这个指针被称为vptr。 而在虚拟继承中,base class 不管在继承中被派生多少次,永远只存在一个实例。 对象如果要完成多态,那么必须是指针或者是引用。class ...
2020-01-04 20:52:11 95
原创 关于epoll的实现--简单概要
上篇讨论select时,我们总结到:总结:从上面看,在第一次所有监听都没有事件时,调用 select 需要把进程挂到所有监听的文件描述符一次 有事件到来时,不知道是哪些文件描述符有数据可以读写,需要把所有的文件描述符都轮询一遍才能知道 可以从流程图中看出,需要进行bitmap的用户态到内核态的多次拷贝,以及对此集合的操作 在没有超出时间限制时,就会进行死循环,一次次的监听,此时...
2020-01-02 23:14:35 332
原创 select多路复用的原理和简单查看内核源码
写这篇文章,需要感谢这位老哥提供的资源,好让我较为轻易的了解了select的实现原理和以此带来的弊处select用法&原理详解(源码剖析)首先,了解一下为什么要在服务器端使用多路复用:当服务器出现要与多个客户端进行连接时,那么有下面几种办法: 1.多进程当监听的时候来了一个新的请求时,一旦建立了一个连接,就会有一个已连接 Socket,这时候你可以创建一个子进程,然...
2019-12-08 17:15:53 537
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人