自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

kikajack的博客

保险,互联网

原创 Nginx 官网文档翻译汇总

Nginx 官网文档,各个模块的手册还在这里。 改版后的新 Nginx 官网文档 概述 新手指南 控制 Nginx 管理员指南 Admin Guide 安装 基本功能 在运行时控制 Nginx 进程 创建 Nginx 配置文件 负载均衡 HTTP 负载均衡 实时配置(O...

2018-04-07 20:22:33 950 0

原创 Docker 官网文档翻译汇总

官方文档地址 Guide Docker 入门 Docker 入门教程 方向和设置 容器 服务 swarm 集群 stack 部署应用 概述 用 Docker 进行开发 在 Docker 上开发应用 应用开发的最佳实践 开发镜像 编写 Dockerfile 的最佳实...

2018-04-07 17:25:45 1382 1

原创 Golang 实现 RPC

go RPC 包文档 通过 go 自带的 net/rpc 包可以很容易实现 RPC。go 官方文档对 RPC 服务端方法的要求如下: 方法是导出的 方法有两个参数,都是导出类型或内建类型 方法的第二个参数是指针 方法只有一个error接口类型的返回值 通过 net/rpc 包实现 RPC Go...

2020-04-25 22:15:55 37 0

原创 Protobuf 在 Ubuntu18 下的安装和使用

Protocol Buffer 是 Google 搞的 RPC 服务的中间层数据协议。其实 RPC 服务之间可以用各种数据格式,例如 JSON、XML 等。但考虑编解码效率和传输效率的话,Protobuf 性能更好。 安装 下载源码 git clone https://github.com/pro...

2020-04-25 12:32:46 247 0

原创 Golang 配置代理

通过 go get 命令下载各种依赖时,经常需要访问 github/google 等网站。配置好代理后,可以快速稳定的访问。 常用的 go 代理 goproxy https://goproxy.io/zh/ 阿里云 https://mirrors.aliyun.com/goproxy/ 七牛云 ...

2020-04-25 11:19:17 171 0

原创 golang 二维 slice 的奇怪 bug

对二维 slice 操作时,对长度 16 的 slice 的第 8 次操作时,影响了第 16 个 slice 的最后一个元素。。 package main import "fmt" // import "sort" // import "refl...

2020-03-05 22:04:17 61 0

原创 操作系统实践-预备知识-FAT12文件系统

参考资料:http://www.disc.ua.es/~gil/FAT12Description.pdf 软盘 软盘的文件组织格式一般为 FAT12,组织单位由大到小分为: 分区:例如 C 盘、D 盘 簇:文件以簇为单位分配存储空间,一个簇包含一个或多个扇区 扇区:磁盘上的最小数据单元 每个软...

2020-01-12 16:06:08 178 0

原创 操作系统实践-BIOS

基本概念:https://wiki.osdev.org/BIOS 所有中断列表:http://www.ctyme.com/intr/int.htm IBM PC 介绍:http://classiccomputers.info/down/IBM_PS2/documents/PS2_and_PC_BI...

2020-01-11 16:46:07 126 0

原创 【二叉树】O(1)空间复杂度的Morris遍历

对于二叉树的遍历,常规的递归或迭代都需要用到栈,不管是函数调用栈还是手动创建的栈。因此空间复杂度都是 O(n)。 如果要省掉栈的开销,将空间复杂度降低到 O(1),则需要借助二叉树中的叶子节点来保存临时信息。只要当前节点 cur 不为空,就一直循环: 如果当前节点 cur 的左子节点不存在,则...

2019-11-03 15:23:18 70 0

原创 【二叉树】Python 从List创建二叉树及4种遍历的递归和非递归实现

# -*- coding: UTF-8 -*- from collections import deque class TreeNode: def __init__(self, val): self.val = val self.left = None ...

2019-11-01 13:26:22 303 0

原创 【算法与数据结构】字符串模式匹配 KMP 算法

语义 在一个很长的字符串 T 中,查找是否存在子字符串 P。例如搜索引擎收录的大量网站数据,当用户输入关键字后,就会在这些数据中进行匹配,并返回合适的网站。 语义:假定字符串长度为 j,则所有字符串都在 [0, j) 这样的集合中。 返回首次匹配的字符的位置。注意这里调用方需要判断位置是否正确,例...

2019-10-20 22:45:13 50 0

原创 【算法与数据结构】查找算法语义约定及二分查找

对于有序数组,通常用二分查找(包括改进型的 Fibonacci 查找和插值查找)。 查找算法语义约定 一般简单的查找算法,可以在查找失败时直接返回 -1。但为了让函数更具有通用性(例如对于插入操作,需要定位到精确的位置),通常约定的语义为(假设数组 A[lo,hi),要查找元素 e):返回不大于 ...

2019-10-07 17:23:35 46 0

原创 【算法与数据结构】分治法和快速排序

快排思想: 从待排序数据中,选取一个数字做基准 pivot 把所有比 pivot 小的数据放在 pivot 左边,大的放在右边 对左右两个子序列递归使用上面两个步骤 子序列中仅有一个元素时,退出 C 代码: #include <stdio.h> void quickSort(in...

2019-10-06 13:38:56 47 0

原创 【算法与数据结构】分治策略与归并排序

分治策略 对于所求的问题域,每次将其分为大小相似的两部分,然后再把每一部分当作最初的问题域再次分割,依次递归,直到得到基本问题(递归基),求解。然后,再逐步合并直到完成最初的问题域。 通常用递归的方式分割问题,例如这里的归并排序,每次将数组一分为二,然后分别判断分割动作是否到不可再分割了(数组中仅...

2019-09-28 15:15:18 35 0

原创 【Linux 应用编程】IO 多路转接 - epoll

跟 select、poll 的对比 epoll 性能更高,Nginx、redis 等流行的软件,都是基于 epoll 实现的。epoll 优点有: 监听描述符数量大于 1024 只返回准备好的描述符,不需要浪费时间遍历 描述符集合基于红黑树实现,高效 使用步骤 epoll 有 3 个函数: ...

2019-09-22 22:37:39 139 0

原创 MySQL - 慢查询日志

开启慢查询日志 通过 set 命令可以临时开启慢查询日志,MySQL 重启后修改丢失。如果想要永久开启,则需要修改配置文件,Linux 中是 /etc/my.conf 文件。 临时开启慢查询日志 mysql> set global slow_query_log = 1; Query OK, ...

2019-09-22 13:05:50 39 0

原创 【Linux 应用编程】IO 多路转接 - select 和 poll

Linux 中,read 和 write 函数默认实现的是阻塞式的 IO。例如: while ((n = read(STDIN_FILENO, buf, BUFSIZ) > 0) { if (write(STDOUT_FILENO, buf, n) != n) { perror(&qu...

2019-09-21 18:55:32 27 0

原创 MySQL - explain 输出信息详解

常用 SQL(假设表名是 student) 连接查询、联合查询、子查询: 查看表结构: show create student; desc student; 增删索引: 增加主键:alter table class add constraint primary key cid_pk(cid); 删...

2019-09-20 19:59:26 86 0

原创 MySQL 连接查询、联合查询和子查询

准备测试数据 create table class( cid int(10), cdesc varchar(20) ); create table student( sid int(10), name varchar(20), age int(3), cid int(10) ); ...

2019-09-20 19:44:51 41 0

原创 【Linux 网络编程】多进程、多线程服务器并发模型

服务器在执行 accept 等待客户端连接时,会阻塞。客户端连接成功后 accept 函数返回,执行后面的代码。 如果想要服务器同时为多个客户端服务,有以下几种方式: 多进程:每来一个客户端,就开一个进程与其通讯。 多线程:跟多进程类似,但每个客户端对应一个单独的线程 IO多路复用:借助 sel...

2019-09-16 17:38:45 61 0

原创 【Linux 网络编程】socket 实现服务器和客户端

IP 地址可以标识网络中的主机,协议类型(TCP或UDP)加端口号可以表示主机上的进程。 基本原理 文件类型 Linux 中有七种类型的文件,这些文件类型可以使用一些基本的函数,例如 read、write: 普通文件 目录 链接文件 字符设备 块设备 管道:pipe匿名管道,fifo有名管道 套...

2019-09-16 11:46:12 108 0

原创 C 语言中使用多字节字符,通过 UTF-8 支持中文

C 语言默认的 char 类型是单字节字符,仅支持 ASCII 码。但是 ISO C90 标准开始,定义了 wchar_t 类型用于支持多字节字符(头文件 wchar.h)。 这一版标准中还定义了本地化和国际化相关的头文件 locale.h,可以通过其中的 setlocale 函数设置使用的字符集...

2019-09-01 15:26:49 288 0

原创 【算法与数据结构】双端队列示例

双端队列可以从两侧入队和出队: #include <stdio.h> #include <stdlib.h> struct dequeNode { int data; struct dequeNode *next; struct dequeNode *prev...

2019-08-25 18:12:00 87 0

原创 【算法与数据结构】优先级队列 - 用二叉堆求数据流中的第K大的元素

数据流中的第K大的元素,总数据个数不足K个元素时返回-1。 #include <stdio.h> #include <stdlib.h> typedef struct { int* data; int count; int capacity; } ...

2019-08-24 10:58:24 58 0

原创 【算法与数据结构】 用栈实现队列、用队列实现栈

用栈实现队列效果(需要两个栈) 思路: 栈1负责进数据,每次要实现出队效果的时候,借助栈2颠倒顺序后出栈即可。元素出队后可以有两种方式: 把出队后栈2中的数据再依次放入栈1。效率低。 出队后,栈2中的数据不需要动,此时仍然用栈1入栈,栈2出栈,只有在栈2空的时候,再把栈1中的所有数据搬入栈1。高...

2019-08-20 22:31:47 101 0

原创 【算法与数据结构】链表逆序、相邻两元素逆序、探测环路

链表常见操作有: 链表逆序 链表每相邻两个元素逆序,例如 1, 2, 3, 4 => 2, 1, 4, 3 探测是否构成环路 #include <stdio.h> #include <stdlib.h> typedef struct NodeStruct { ...

2019-08-19 23:07:53 49 0

原创 【算法与数据结构】无重复字符的最长子串 -暴力破解和滑动窗口

滑动窗口 创建两个指针 start 和 end,分别指向窗口起止位置。对于长度为 n 的字符串,总共需要循环 n 次。 每次循环时,end 指针加一,同时保存当前字符的下一个位置,然后判断是否出现重复字符。 如果无重复,则继续下次循环 如果重复,则把 start 移到记录中对应字符的下一个位置 ...

2019-08-18 12:28:21 75 0

原创 HashTable 示例 - 找出数组中和为指定值的两个数

数组 [2, 4, 6, 8],和为 8,则返回 [0, 2] 数组 [2, 3, 3],和为 6,则返回 [1, 2] #include <stdio.h> #include <stdlib.h> typedef unsigned int Index; typedef...

2019-08-17 22:40:57 75 0

原创 【算法与数据结构】堆 heap - 基于数组实现的完全二叉树

#include <stdio.h> #include <string.h> #define MAXSIZE 100 typedef struct heap { int data[MAXSIZE]; int size; } heap; void hea...

2019-08-14 22:52:03 58 0

原创 Linux 进程间通信

Linux 进程间通信的方式可以分为三大类: 管道 信号 IPC,又可分为三类 共享内存 消息队列 信号量 管道 管道是 Linux 内核中的数据结构,类似于队列,管道中的特性如下: 数据只能读取一次,读取后消失,不可再次读 半双工通信,两端都可以用来写数据,但一端开始写数据的话,另一...

2019-07-01 23:04:23 51 0

原创 Linux 中静态库、动态库的创建及使用

异同点 静态库:文件名默认为 libXXX.a,就是可重定位目标文件的集合。编译时 gcc 会将静态库中的依赖打包到可执行文件 动态库:文件名默认为 libXXX.so,执行时需要动态加载依赖 创建并使用静态库 创建静态库 创建 sub.c 和 sub.h 两个文件,用于创建静态库: int ...

2019-06-30 16:20:23 70 0

原创 gcc 和 gdb 常用选项

gcc 编译步骤 预处理,生成 .i 的文档[预处理器 cpp]:cpp test.c -o test.i 编译,得到汇编代码 .s [编译器 cc1]:/usr/local/gcc-4.8.1/libexec/gcc/x86_64-unknown-linux-gnu/4.8.1/cc1 tes...

2019-06-19 13:31:14 251 0

原创 C 语言二级指针的段错误

C语言中的指针变量 C 语言中,指针变量也是变量,只不过跟 char、int 型等基本类型变量不同,指针变量中保存的是其他变量的地址和类型。 通过这个地址,并根据类型来读取指定长度的字节,就可以把这个变量解析出来。 int a = 3; int *p = &a; // & 是取地址...

2019-06-02 11:27:24 123 0

原创 C语义的预处理 - 宏定义中 # 和 ## 的意义及用法

宏定义基本语法 C 语言中,所有预定义的宏,都会在预处理阶段进行替换。宏定义的语法为: #define 宏名 字符串 简单宏定义 下面的示例中,预处理后,所有出现 MAX 的位置都会被替换为 100: #include <stdio.h> #define MAX 100 int m...

2019-05-25 13:12:03 91 0

原创 【算法与数据结构】动态规划

用递归求解问题时,反复的嵌套会浪费内存。而且更重要的一点是,之前计算的结果无法有效存储,下一次碰到同一个问题时还需要再计算一次。例如递归求解 Fibonacci 数列,假设求第 n 位(从 1 开始)的值,C 代码如下: #include <stdio.h> int fib(int ...

2019-05-10 22:13:10 99 0

原创 【算法与数据结构】图的最小生成树 MST - Prim 算法

Prim 算法属于贪心算法。 #include <stdio.h> #define VERTEXNUM 7 #define INF 10000 typedef struct Graph { int vertex[VERTEXNUM]; int edge[VERTEXNUM][VE...

2019-05-06 22:52:01 69 0

原创 【C语言工具】AddressSanitizer - 内存检测工具

Github 地址:https://github.com/google/sanitizers Wiki 地址:https://github.com/google/sanitizers/wiki/AddressSanitizer 参考:https://www.jianshu.com/p/3a2df9...

2019-05-04 13:56:16 398 0

原创 【算法与数据结构】二叉堆和优先队列 Priority Queue

优先队列的特点 普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同: 最大优先队列:优先级最高的元素先出队 最小优先队列:优先级最低的元素先出队 优先队列可以用下面几种数据结构来实现: 基于堆 heap,包括下面几种堆: 二叉堆 多项式堆 Fibonacci 堆 ...

2019-05-03 22:16:33 152 0

原创 【算法与数据结构】三种简单排序 - 冒泡排序、选择排序、插入排序

冒泡排序 逐个比较相邻元素,如果逆序则交换。每一趟都会让一个元素就位,总共比较 n-1 趟。 n 个元素,需要进行 n - 1 轮冒泡,每次冒泡都会有一个元素就位,所以每轮冒泡的循环次数都会减一。时间复杂度为: 1 + 2 + … + n-1 = n(n-1)/2 = O(n^2) 初始值: 5...

2019-05-02 12:33:23 55 0

原创 【算法与数据结构】并查集 Disjoint Set

并查集(Disjoint Set)用来判断已有的数据是否构成环。 在构造图的最小生成树(Minimum Spanning Tree)时,如果采用 Kruskal 算法,每次添加最短路径前,需要先用并查集来判断一下这个路径是否会构成环。 思路 遍历图的每一条边,按照下面的原则将对应的两个顶点添加到集...

2019-04-30 13:25:04 310 0

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