自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构与算法之美(四)

一,拓扑排序如果 a 先于 b 执行,也就是说 b 依赖于 a,那么就在顶点 a 和顶点 b 之间,构建一条从 a 指向 b 的边。而且,这个图不仅要是有向图,还要是一个有向无环图,也就是不能存在像 a->b->c->a 这样的循环依赖关系。因为图中一旦出现环,拓扑排序就无法工作了。实际上,拓扑排序本身就是基于有向无环图的一个算法。public class Graph ...

2020-05-28 21:59:30 1277

原创 Redis设计与实现(一)对象

Redis对象系统中包含字符串对象、列表对象、哈希对象、集合对象、有序集合对象。实现了基于引用计数的内存回收机制。一,对象的类型与编码Redis使用对象来表示数据库中的键和值。/* * Redis 对象 */ typedef struct redisObject { // 类型 unsigned type:4; // 编码方式 unsigned encoding:4; // LRU 时间(相对于 server.lr

2020-05-28 20:17:27 232

原创 Redis设计与实现(一)数据结构

1,简单动态字符串(SDS)redis的字符串不是直接用c语言的字符串,而是用了一种称为简单动态字符串(SDS)的抽象类型,并将其作为默认字符串。redis中包含字符串值的键值对在底层都是由SDS实现的。(1)SDS定义/* * 保存字符串对象的结构 */struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间 char buf[];};

2020-05-23 11:24:54 219

原创 C/C++知识点总结(四)

一,用C++设计一个不能被继承的类首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。可是这个类的构造函数和析构函数都是私有函数了,怎样才能得到该类的实例呢?可以通过定义静态来创...

2020-01-11 17:58:40 327

原创 C/C++知识点总结(三)指针问题

一,C++内存泄漏、野指针和空指针(1)避免内存泄露在C/C++中,通过动态内存分配函数(如malloc系统函数)或者new运算符分配的动态内存在使用完之后需要手动释放。否则会造成内存泄露。即使在malloc/new后显示调用了free/delete释放内存,但是由于异常可能会导致释放内存的free/delete语句得不到执行,也会发生内存泄露。(2)不要使用野指针野指针也叫悬...

2020-01-11 17:11:50 1641 1

原创 C/C++知识点总结(二)

一、关键字1,volatile作用Volatile关键词的第一个特性:易变性。所谓的易变性,在汇编层面反映出来,就是两条语句,下一条语句不会直接使用上一条语句对应的volatile变量的寄存器内容,而是重新从内存中读取。Volatile关键词的第二个特性:“不可优化”特性。volatile告诉编译器,不要对我这个变量进行各种激进的优化,甚至将变量直接消除,保证程序员写在代码中的指令,一...

2020-01-07 23:26:18 625

原创 数据结构与算法之美(三)

一,红黑树平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。最先被发明的平衡二叉查找树是AVL 树,它严格符合我刚讲到的平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。但是很多平衡二叉查找树其实并没有严格符合上面的定义(树中任意一个节点的左右子树的高度相差不能大于 1),比如我们下面要讲的红黑树,它从根节点到各个叶...

2019-12-23 21:01:54 284

原创 数据结构与算法之美(二)

一,二分查找二分查找的非递归实现public int bsearch(int[] a, int n, int value) { int low = 0; int high = n - 1; while (low <= high) { int mid = (low + high) / 2; if (a[mid] == value) { re...

2019-12-02 21:25:06 712

原创 数据结构与算法之美(一)

一,数组数组删除元素时可以记录被删除的数据,等数组内存空间不够时一次性删除,这样减少了因删除导致的数据搬移。数组为什么从0开始数组越界:int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i] = 0; ...

2019-12-02 21:24:56 1551

原创 SQL基础篇(一)

一,了解SQL我们可以把 SQL 语言按照功能划分成以下的 4 个部分:DDL,英文叫做 Data Definition Language,也就是数据定义语言,它用来定义我们的数据库对象,包括数据库、数据表和列。通过使用 DDL,我们可以创建,删除和修改数据库和表结构。 DML,英文叫做 Data Manipulation Language,数据操作语言,我们用它操作和数据库相关的记录,...

2019-12-02 21:23:40 2023

原创 SQL基础篇(二)

一,存储过程存储过程是程序化的 SQL,可以直接操作底层数据表,相比于面向集合的操作方式,能够实现一些更复杂的数据处理。存储过程可以说是由 SQL 语句和流控制语句构成的语句集合,它和我们之前学到的函数一样,可以接收输入参数,也可以返回输出参数给调用者,返回计算结果。1,定义一个存储过程:CREATE PROCEDURE 存储过程名称([参数列表])BEGIN 需要执行的语...

2019-11-28 23:55:03 262

原创 极客时间Linux操作系统(二)内存管理

一,内存管理1,操作系统的内存管理分为三部分:物理内存的管理 虚拟内存的管理 虚拟地址和物理地址如何映射2,虚拟空间分为两部分:内核空间 用户空间Text segment存放二进制可执行代码的位置 data segment存放静态常量 bss segment存放未初始化的静态变量 堆动态内存分配,往高地址增长 memory mapping segment:文件映射...

2019-10-20 19:52:23 642 1

原创 gdb调试总结

一,gdb调试基础(1)用gdb编译程序时,首先在编译程序时加-ggcc test.c -o gdb_test -g(2)运行程序gdb + 编译后的文件名 在命令行中先输入gdb,按回车,再输入file + 编译后的文件(3)run命令就可以将程序运行起来了,简写 r(4)断点可以对某一行进行打断点 例:对程序的第三行进行打断点 b 3 多个文件,可以对某个文件的某...

2019-10-14 10:46:09 309

原创 C/C++知识点总结(一)

1.struct和class的区别C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。struct能包含成员函数吗? 能!struct能继承吗? 能!!struct能实现多态吗? 能!!!最本质的一个区别就是默认的访问控制,体现在两个方面:1)默认的继承访问权限。struct是public的,clas...

2019-10-11 15:04:14 173

原创 玩转算法面试(八)栈,队列,优先队列

一,栈150. 逆波兰表达式求值根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]输出: ...

2019-09-29 18:05:12 191

原创 (六)单例模式

单例模式的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。实现单例模式的思路是:一个类只有一个实例对象。在C++中一般是将构造函数、拷贝构造函数以及赋值操作符函数声明为private级别,从而阻止用户实例化一个类。那么,如何才能获得该类的对象呢?需要类提供一个 p...

2019-09-25 22:24:23 89

原创 (五)观察者模式

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监视某一个主题对象。这个主题对象的状态变化时,会通知所有的观察者对象,使他们能够自动更新自己的状态。举个例子:观察者模式可以理解为, 在一个一对多的关系模式中, 例如一个微信公众号有多个关注用户,那么关注该微信公众号的微信用户就是观察者,微信公众号就...

2019-09-25 20:14:36 169

原创 (四)工厂方法

工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,那样就需要工厂类中做判断(比如:if),根据不同的条件或者前提创建不同的对象。这也就造成了,当增加新的产品时,需要修改工厂类,也就是其增加其判断分支。 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基...

2019-09-24 23:25:43 152

原创 (三)装饰者模式

一,概念装饰器模式是一种属于结构型的设计模式,它通过一层一层地包装类方式来为类增加新的方法,本质是利用组合,同时也利用了继承。与单纯的继承相比,它更加灵活,因为装饰类之间可以动态地自由组合来添加功能。给对象添加方法的方式有多种,通常,当说到给对象添加方法时,最直接的就是直接在该对象的类中增加新的方法,但这样在最上方增加方法,不仅更改了原来的代码结构,还会让代码看起来十分臃肿;然后,我们就...

2019-09-23 22:28:34 129

原创 玩转算法面试(九):贪心算法

455. 分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。注意:你可...

2019-09-08 22:32:42 392

原创 (二)策略模式

简单工厂模式只是解决对象的创建问题,而且由于工厂本身包括了所有的收费方式,商场可能经常性的更改打折额度和返利额度,每次维护或者扩展收费方式都要改动这个工厂,以致代码需要重新编译部署,这不是一种好方法。而且为了创建不同的对象产品使用了switch case(或if else)的形式实现代码,这样违背了开闭原则,即对扩展开放、对修改封闭,维护的成本会随着cese(或else)的增加而增加,而本文的策略...

2019-09-05 23:19:41 206

原创 玩转算法面试:(七)递归和回溯法

回溯问题可以转化成树形问题回溯法是暴力解法的一个主要手段17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].cla...

2019-09-04 22:09:33 539

原创 (一)简单工厂模式

实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。场景:采用简单工厂模式设计一款运算器可以自由添加运算规则#include<iostream>#include<string>#include<vector...

2019-09-01 10:04:58 122

转载 https和http对比

转载自:https://blog.csdn.net/howgod/article/details/89596638一、什么是HTTPSHTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。HTTPS主要作用是:(1)对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;...

2019-08-18 15:53:23 796

原创 玩转算法面试:(六)二叉树和递归

111. 二叉树的最小深度给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.class Solution {public...

2019-08-18 09:49:19 201

原创 linux进程间通信

进程pcb与文件描述符在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。随着计算机的蓬勃发展,一些方法由于自身设计缺陷被淘汰或者弃用。常用的进程间通信方式有:管道(使用最简单) 信号(开销最小) 共享映射区(无血缘关系) 本地套接字(最稳定)(1)利用文件进行通信a.有血缘关系:父子进程间通过文件通信,理论依...

2019-08-13 23:17:53 188

原创 玩转算法面试:(五)LeetCode链表类问题

206. 反转链表反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?class Solution {public: ListNode* reverseList(ListNode*...

2019-08-10 16:45:16 154

转载 IPv6邻居发现协议(NDP)

邻居发现协议(NDP)替代了IPv4的ARP,并且添加了新的功能。它的所有功能都是基于ICMPv6报文来实现。NDP基于ICMPv6实现,NDP使用的所有报文均封装在ICMPv6报文中,所以NDP被认为是3层协议。在三层完成地址解析,主要好处是:地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。可以使用三层的安全机制避免地址解析攻击。使用组播方式发送请求报文,减少了二层网络的性能压力。...

2019-07-23 19:32:33 8229

原创 玩转算法面试:(四)查找类问题

set 和 map:常见操作: insert find erase change (map) map和set的底层实现为红黑树unordered_map和unordered_set的底层实现为哈希表哈希表不管查找、插入、删除都是O(1)的时间复杂度。红黑树的时间复杂度为O(logn)。哈希表的缺点是失去了数据的顺序性数据的顺序性 数据集...

2019-07-23 00:11:50 255

原创 网络工具分析

1.使用ping检查连通性有以下6个步骤(1)使用ipconfig/all观察本地网络设置是否正确。(2)ping 127.0.0.1,来检查本地的TCP/IP协议有没有设置好。(3)ping本机IP地址,这样是为了检查本机的IP地址是否设置有误。(4)ping本网网关或本网IP地址,这样的是为了检查硬件设备是否有问题,也可以检查本机与本地网络连接是否正常。(在非局域网中这一步骤可以忽略...

2019-07-14 09:52:38 213

原创 玩转算法面试:(三)LeetCode数组类问题

数组中的问题其实最常见。排序:选择排序;插入排序;归并排序;快速排序查找:二分查找法数据结构:栈;队列;堆1、二分查找法template<typename T>int binarySearch( T arr[], int n, T target ){ int l = 0, r = n-1; // 在[l...r]的范围里寻找target:前闭后闭...

2019-07-13 10:22:31 316

原创 排序与检索

最大数给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。示例 1:输入: [10,2]输出: 210示例2:输入: [3,30,34,5,9]输出: 9534330说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。解题思路:制定排序规则,将两个数字颠倒连接比较就好了,比如10,2:比较102和210,显然210 大,那么排序就是2,10...

2019-07-07 19:54:59 393

原创 排序算法总结

排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:1.冒泡排序思想:从后往前将数组中的元素两两比较,交换两者的位置取小的那一个元素,直到数组开头...

2019-07-07 19:30:56 398 1

转载 (二)docker的安装和使用

一、docker 安装1、获取最新版本的 Docker 安装包$ sudo apt-get update$ sudo apt-get install -y docker.io2、查看docker的版本号root@jason-virtual-machine:~# docker versionClient version: 1.6.2Client API version: ...

2019-07-07 00:09:07 421

原创 (三)docker创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。1.从已经创建的容器中更新镜像,并且提交这个镜像 2.使用Dockerfile指令来创建一个新的镜像一、利用 commit 理解镜像构成镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。我们所使用的都是来自于 Docker Hub 的镜像。...

2019-07-07 00:07:48 502

原创 (一)docker基本概念

环境对软件的影响软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。解决办法1、虚拟机虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以...

2019-07-03 21:15:35 134

转载 vector实现

(1)push_back的时候均摊,时间复杂度还是o(1)template <typename T>class MyVector{private: T* data; int size; // 存储数组中的元素个数 int capacity; // 存储数组中可以容纳的最大的元素个数 // O(n):一重循环。 ...

2019-07-03 20:30:00 97

转载 简单递归函数算法复杂度分析

(1)计算x的n次方的幂运算double pow( double x, int n ){ assert( n >= 0 ); if( n == 0 ) return 1.0; double t = pow(x, n/2); //奇数 if( n%2 ) retu...

2019-07-03 19:48:11 1373

原创 玩转算法面试:(八)动态规划

动态规划将原问题拆解成若干子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。1,斐波那契数列(1)递归方法int fib(int n){ if(n == 0) return 0; if(n == 1) return 1; return fib(n - 1) + fib(n - 2);}...

2019-06-30 22:32:47 387

原创 进程

以前,进程是最小的运行单位;有了线程之后,线程成为最小的运行单位,而进程则是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(指令和数据)的真正运行实例。多个进程可与同一个程序相关联,而每个进程则是以同步或异步的方式独立运行的。进程结构一般由3部分组成:代码段、数据段和堆栈段。代码段是用于存放程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码...

2019-06-07 20:18:36 216

空空如也

空空如也

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

TA关注的人

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