自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 leetcode—二叉树的最近公共祖先

解法思路:1.利用后序遍历逐步根节点遍历2.遍历时当前节点存在两种情况: a.当前节点的左右子树中包含目标节点,则当前节点就是最近的公共祖先节点b.当前节点是目标节点之一,且当前节点的子节点中包含了目标节点,那公共祖先节点就是该节点解法一:递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeN...

2021-01-19 17:30:59 268

原创 leetcode—二叉树中的最大路径和

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} *.

2021-01-18 20:01:01 306

原创 leetcode-k个一组翻转链表

之前在做这道题时在评论里发现了一道大神的做法,觉得很精妙,特此记录一下/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x

2021-01-12 19:30:37 277

原创 redis集合

Redis集合底层实现是哈希表或整数数组,如下图所示127.0.0.1:6379> SADD names "lxx" "xuming"(integer) 2127.0.0.1:6379> object encoding names"hashtable"127.0.0.1:6379> SADD ages 11 12 13(integer) 3127.0.0.1:6379> smembers ages1) "11"2) "12"3) "13"127.0.0

2020-12-30 17:52:46 207

原创 redis—skiplist

跳表数据结构:跳表节点/* ZSETs use a specialized version of Skiplists *//* * 跳跃表节点 */typedef struct zskiplistNode { // 成员对象 robj *obj; // 分值 double score; // 后退指针 struct zskiplistNode *backward; // 层 struct zskiplistLevel

2020-12-21 11:10:26 134

原创 oslo_service

Service类:class Services(object): def __init__(self, restart_method='reload'): if restart_method not in _LAUNCHER_RESTART_METHODS: raise ValueError(_("Invalid restart_method: %s") % restart_method) self.restart_method = r

2020-12-17 11:24:03 442

原创 oslo_cache解析

oslo_cache主要依赖于dogpile.cache库oslo.cache缓存机制的核心实现都定义在oslo_cache.core模块中,而缓存机制的实现主要依赖于以下几个方法:create_region(function=function_key_generator):创建缓存区,该方法主要调用了dogpile.cache模块的make_region(function_key_generator=function)方法创建了一个CacheRegion对象。 configure_cache_r

2020-12-11 17:55:12 386

原创 redis—rehash

int dictRehash(dict *d, int n) { // 只可以在 rehash 进行中时执行 if (!dictIsRehashing(d)) return 0; // 进行 N 步迁移 // T = O(N) while(n--) { dictEntry *de, *nextde; /* Check if we already rehashed the whole table... */ // .

2020-12-10 23:06:51 162

原创 redis源码阅读—SDS空间预分配策略和惰性删除策略

备注:文中redis源码版本为redis3.0该段摘自于《redis设计与实现》空间预分配用于优化 SDS 的字符串增长操作: 当 SDS 的 API 对一个 SDS 进行修改, 并且需要对 SDS 进行空间扩展的时候, 程序不仅会为 SDS 分配修改所必须要的空间, 还会为 SDS 分配额外的未使用空间。其中, 额外分配的未使用空间数量由以下公式决定:如果对 SDS 进行修改之后, SDS 的长度(也即是len属性的值)将小于1MB, 那么程序分配和len属性同样大小的未使用...

2020-12-10 11:47:54 1288

原创 redis源码阅读—SDS阅读札记

阅读SDS数据结构实现时,发现如下代码struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));

2020-12-09 19:37:31 162

原创 python下判断一个集合是否为另一个集合的子集的两种方法

文章概要:1.判断集合子集的两种方法2.python中issubset函数的源码实现通常判断集合的子集一般都是使用issubset,但是今天在看到一段代码:判断一个权限列表是否为另一个权限列表的子集时看到用到了相减的方法,感觉很有意思,所以做个记录x = {3, 4}y = {3, 4, 5, 6}if 0 == len(x - y): print "true"else: print "False"if x.issubset(y): print "tr

2020-12-02 17:52:13 10935 3

原创 从keystone的dependency模块源码解析看依赖注入技术

在keystone中可以经常看到controllers.py文件下有如下装饰器的使用:@dependency.requires(‘name’)@dependency.requires('assignment_api', 'catalog_api', 'identity_api', 'resource_api', 'token_provider_api', 'trust_api')class Auth(controller.V3Controller):

2020-12-01 20:51:54 402

原创 oslo_messaging源码阅读(2)—RPCServer

大概的调用流程图,还有很多细节并未在图中画出,后续针对各个细节介绍1.dispatcher2.GreenThreadPoolExecutor未完待续。。。。。。。

2020-11-24 17:42:30 232

原创 oslo_messaging源码阅读(1)—RPCClient

本文主要分析使用oslo_messaging时,RPCClient的获取及发送消息流程还需要补充的地方:1.setevedore加载自定义插件方法2.具体的driver发送消息send流程这里只是简单给出了一个大致流程,还有很多地方需要补充未完待续。。。。。。。...

2020-11-18 14:45:34 730

原创 每日一题之跳跃游戏

leetcode55.跳跃游戏Answers 1:class Solution {public: bool canJump(vector<int>& nums) { //题解思路: // 遍历数组,但是遍历的范围是由数组位置上的值决定的 //使用一个值ret不断的记录更新当前可跳跃的最远距离,在这段距离内通过当前位置和该位置上标示 //的值进行判断是否可以到达数组的末尾 int le.

2020-11-18 00:20:39 382

原创 个人练习之二叉树的前序遍历

leet_code.二叉树的前序遍历Answer 1:使用栈/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), l

2020-11-17 00:39:14 292

原创 个人练习之二叉树的中序遍历

leet_code94.二叉树的中序遍历Answer 1:非递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x),

2020-11-17 00:23:01 142

原创 个人练习之二叉树的层序遍历

leet_code94.二叉树的层序遍历Answer 1:使用队列class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; if(!root) return result; queue<TreeNode*> q1;

2020-11-16 23:15:25 114

原创 浅析平衡搜索树之——红黑树

红黑树概念红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。特性如下:1. 每个节点,不是红色就是黑色的2. 根节点是黑色的3. 如果一个节点是红色的,则它的两个子节点是黑色的4. 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目...

2018-05-19 10:49:45 409

原创 Linux下的load average

在Linux中,当我们使用top命令或uptime命令时,都会发现一个这样的字段:load averageload average后面三个数字分别代表不同时间段即一分钟、五分钟和十五分钟的系统平均负载。当然我们还可以在/proc下查看:cat /proc/loadavg第四个值的分子是正在运行的进程数,分母为总进程数;第五个值是最近运行的进程id;什么是系统平均负载?Linux下,系统平均负载指的...

2018-05-18 17:08:13 7509 1

原创 Linux命令——iostat

iostat命令用于汇报CPU的使用情况以及设备、分区和网络文件系统的IO统计信息。iostat的命令格式:参数含义:-c 显示CPU使用情况-d 显示磁盘使用情况-k 以 KB 为单位显示-m 以 M 为单位显示-N 显示磁盘阵列(LVM) 信息-n 显示NFS 使用情况-p[磁盘] 显示磁盘和分区的情况-t 显示终端和CPU的信息-x 显示详细信息-V 显示版本信息iostat的使用:在命令行...

2018-05-18 15:19:15 281

原创 Linux软件包管理工具rpm与yum

RPMRPM是”Redhat Package Manager”的缩写,是由Redhat公司提供的软件包管理。RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的Linux 主机的一套管理程序。linux系统中存在着一个关于RPM的数据库,它记录了安装的包以及包与包之间依赖相关性(类似于在windows下安装某个软件时,会提醒我们安装一个其他的插件)。RPM包是预先在linux机器上编译好并...

2018-05-17 16:10:29 392

原创 插入排序——基本插入排序与希尔排序

插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。基本插入排序思路:①先将第一个元素看作是有序区间,第二个元素开始后的元素看作未排序列;②从第二个元素开始遍历,先让待排数据与前面的有序区间的最后一个数据进行比较,         ...

2018-05-15 10:22:46 1038

原创 进程间通信之——信号量(一)(system V)

system v信号量又被称为system v信号量集。它的本质就是一个计数器,用来为多个进程共享的数据结构提供受控访问。()信号量支持的操作有:使用最广泛的信号量为二元信号量,它控制单个资源,对于这种信号量而言,它只有两种合法值: 0 和 1 ,对应一个可用的资源。若当前有资源可用,则与之对应的二值信号量的值为 1 ;若资源已被占用,则与之对应的二值信号量的值为 0 。当进程申请资源时,如果当前...

2018-05-10 15:38:17 8526

原创 模拟实现atoi

atoi函数原型:int atoi(const char *nptr);函数功能:atoi 是把字符串转换成整型数的一个函数,atoi函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束符('\0')才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 np...

2018-05-06 08:55:09 375

原创 进程间通信之——共享内存

共享内存是所有IPC方式中最快的一种,原因在于共享内存一旦映射到进程地址空间,进程间数据的传递就不需要涉及内核。对于管道、FIFO和消息队列,两个进程之间通过这三种方式进行通信,则内核就扮演着“中转站”的角色。——发送消息一方,通过系统调用(write或msgsnd)将消息从用户层拷贝到内核层,由内核暂时保存这份信息;——接受消息的一方,通过系统调用(read或msgrcv)将消息从内核层提取到用...

2018-05-05 10:34:57 2819

原创 浅析二叉平衡树之AVL树

在前面的文章中介绍了二叉搜索树,尽管它可以缩短查找的速率,但是在数据有序或者接近有序的情况下,二叉搜索树就会退化成一棵单支树,查找的效率就会变得低下。因此,就有两位伟大的数学家发明了一种新的数据结构——AVL树,解决了二叉搜索树的一些不足。什么是AVL树?(概念)一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:1、它的左右子树都是AVL树2、左子树和右子树高度之差(简称平衡因子)的绝对值不...

2018-05-01 16:20:33 337

原创 Linux下的top命令

Linux的top命令会显示Linux的进程,它提供了一个运行中系统的实时动态图,默认情况下,它显示在服务器上CPU占用率最高的任务,并且每5秒更新一次视图。本文主要解释一下top命令后显示的CPU动态图各字段含义,便于更好观察系统的运行状况。我们先使用top 命令看一下:接下来我们分别看一下这些信息:第一行:第二行:第三行:在详细解释一下第

2018-04-22 09:29:55 614

原创 搜索之二叉搜索树

本文主要讲一下二叉搜索树的相关操作——插入、删除和查找。概念:二叉搜索树又称二叉排序树,它或者是一颗空树,或者是一颗具有以下性质的树。性质:①若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;           ②若它的右子树不为空,则右子树上所有节点的值都大于根节点的值;           ③它的左右子树也分别为二叉搜索树;由于二叉搜索树的插入和查找操作相较于删

2018-04-20 23:29:33 315 1

原创 简单了解ELF文件类型

本文主要介绍一下ELF文件的相关构成,若有不当之处还请指正。   什么是ELF      ELF根据它的英文名称Executable and Linkable Format又叫做可执行与可链接格式,因此,ELF其实是一种Linux下的文件格式。  ELF文件类型    ①可重定位文件(Relocatable File)    ②可执行文件(Executable File)

2018-04-19 11:03:49 933 1

原创 二叉树的基本操作

本篇着重介绍二叉树的一些基本操作,实现二叉树的一些基本接口。二叉树的基本数据成员template&lt;class T&gt;struct BinaryTreeNode{    BinaryTreeNode&lt;T&gt; * _left;    BinaryTreeNode&lt;T&gt; * _right;    T _data;    BinaryTreeNode(cons...

2018-04-12 10:29:23 428

原创 Linux下的命令——du与df

本片着重讲解这两个命令的用法。du——查看文件和目录磁盘使用的空间命令格式:du 选项 文件du命令有以下常见的几个选项:-a 显示目录中个别文件的大小;-b 显示目录或文件大小时,以byte为单位;-c 除了显示个别目录或文件大小,还显示所有目录或文件的总和;-h 以K、M、G为单位,提高信息的可读性-s 显示个别目录大小时并不含子目录大小测试一下:显示文件或目录所占空间显示指定文件所占大小显示...

2018-03-31 10:23:01 708

原创 硬链接与软链接的联系与区别

       文件在 Linux 下被分为两部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使...

2018-03-30 20:42:51 467

原创 Linux下fork()与vfork()及其之间的差异

       我们知道fork与vfork函数的作用是都能创建一个新进程,那他们有什么区别呢!本文重点介绍fork与vfork函数及它们之间的差异。|fork函数原型:pid_t fork(void);//pid_t为无符号整型函数功能:creates  a new process by duplicating the calling process.//一个现有进程调用fork创建一个新进程参数...

2018-03-26 21:52:12 412

原创 Linux下的僵尸进程与孤儿进程

什么是僵尸进程(zombie)    僵尸进程指:一个进程使用fork()创建子进程,如果子进程退出,而父进程并没有调用wait()或waitpid()获取子进程的状态信息,那么子进程的某些信息如进程描述符等仍然保存在系统中。这种进程称为僵尸进程。先看一个例子:看一下运行结果:僵尸进程的危害       僵尸进程会在系统中保留某些信息如进程描述符、进程id退出状态等,例如系统中可用的进程id是有限...

2018-03-23 20:46:31 541

原创 Linux下文件与目录管理

      在Linux中流传着这样一句话“Linux中一切皆文件”,足以看出文件的重要性,因此,我们首先了解一些Linux下文件的一些基本信息。键入一条命令:ls -l(该命令会列出当前目录下除隐藏文件外的所有文件和目录的详细信息),如下:我们详细来看一下每个部分的含义:文件类型有七种:d 目录文件。L 符号链接(指向另一个文件,类似于瘟下的快捷方式)。s 套接字文件。b 块设备文件,二进制文件...

2018-03-23 15:00:31 379

原创 初识Linux——目录介绍

        我们在命令窗口下键入该命令:ls / ,该命令可以查看Linux系统下的目录结构,如下:接下来依次讨论下这些目录的含义。/bin : 包含了引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。这些命令都是二进制文件的可执行程序(bin是binary的简称),多是系统中重要的系统文件;/boot :存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件;/d...

2018-03-21 21:56:24 276

原创 结构体的内存对齐

       首先,先看一段代码:(windows下32位)struct s1{ int a; char b; double c;};struct s2{ char a; double b; int c;};我们看看这两个结构体大小为多少?我们可以发现这两个结构体的大小不仅不是13,而且还不相同!造成这种结果的原因就是接下来我们要探讨的——内存对齐。内存对齐的原因:①平台原因...

2018-03-13 23:28:13 537

原创 详解KMP算法

今天整理一下关于KMP算法的一些理解,如果有什么不对的地方还请大家指正!      它的作用我简单的介绍一下:      关于KMP算法,我们首先要明白几个概念:      ① 字符串前缀、最长字符串前缀      ②字符串后缀、最长字符串后缀      ③公共字符串      现在解释一下:假设有一个字符串:abababaa      字符串前缀:除了最后一个

2017-11-30 23:03:29 1268 1

原创 通过菱形继承剖析虚继承解决二义性和数据冗余问题

什么是菱形继承?    假设有一个类A,它有两个子类,分别为类B和类C,再有一个类D又继承了B类和C类;如图:类似于这种,有子类对象包含多份父类对象的继承模型称为菱形继承。上述菱形继承体系中,类D多重继承了类B和类C,因此,类D含有两份基类A的成员;此种继承方式会造成两个问题:二义性和数据冗余。先看一段代码:#includeusing namespace std;

2017-11-05 17:39:50 827

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除