自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 pandas DataFrame parallel_apply 处理数据时EOFError: Ran out of input

pandas DataFrame parallel_apply 处理数据时EOFError: Ran out of input

2022-06-23 17:15:50 1933 2

原创 Go中方法调用和接口实现

方法调用方法的接收者有两种:值接收者、指针接收者。这两种有什么区别呢?来看下面这段代码,最后结果是什么呢?编译错误?package mainimport "fmt"type Person struct { age int}func (p Person) howOld() int { return p.age}func (p *Person) growUp() { p.age += 1}func main() { // zhangsan 是值类型

2020-10-15 19:41:12 691

转载 Golang HTTP使用方式

前言关于Golang HTTP服务器实现原理,本文将通过下面两点来讲述,希望能帮到大家!如何创建一个HTTP服务器HTTP服务器实现原理如何创建一个HTTP服务器创建一个 HTTP服务器 的步骤:创建一个处理器(实际的业务逻辑)创建一个路由器并与处理器进行绑定/注册(这样才能根据URL匹配到对应的函数)启动HTTP服务器,并监听指定端口对于处理器的实现,其实只有两种,一是使用处理器函数实现,二是创建一个结构体,并实现ServeHTTP方法。而对于处理器与路由器的绑定方式,一种是通

2020-09-16 17:49:15 878

转载 Go中net/context和http.Handler

The approaches in this post are now obsolete thanks to Go 1.7, which adds the context package to the standard library and uses it in the *net/http http.Request type. The background info here may still be helpful, but I wrote a follow-up post that revisits.

2020-08-26 14:41:17 548

转载 【The Go Blog】Go Concurrency Patterns: Pipelines and cancellation

Sameer Ajmani13 March 2014IntroductionGo’s concurrency primitives make it easy to construct streaming data pipelines that make efficient use of I/O and multiple CPUs. This article presents examples of such pipelines, highlights subtleties that arise whe

2020-08-13 15:02:12 191

转载 理解Go Context机制

文章目录1 什么是Context2 context包3 context使用3.1 小结4 使用原则1 什么是Context最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也不了解其背后的原理。今天趁着妮妲台风妹子正面登陆深圳,全市停工、停课、停业,在家休息找了一些资料研究把玩一把。Context通常被译作上下文,它是一个比较抽象的概念。在公司技术讨论时也经常会提到上下文。一般理解

2020-08-10 15:46:47 241

转载 Goroutine Local Storage

背景最近在设计调用链与日志跟踪的API,发现相比于Java与C++,Go语言中没有原生的线程(协程)上下文,也不支持TLS(Thread Local Storage),更没有暴露API获取Goroutine的Id(后面简称GoId)。这导致无法像Java一样,把一些信息放在TLS上,用于来简化上层应用的API使用:不需要在调用栈的函数中通过传递参数来传递调用链与日志跟踪的一些上下文信息。在Java与C++中,TLS是一种机制,指存储在线程环境内的一个结构,用来存放该线程内独享的数据。进程内的线程不能访问

2020-08-07 15:16:05 423

转载 分布式事务的实现

分布式事务的实现主要有以下 5 种方案:XA 方案TCC 方案本地消息表可靠消息最终一致性方案最大努力通知方案两阶段提交方案/XA方案所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问问各个数据库你准备好了吗?如果每个数据库都回复 ok,那么就正式提交事务,在各个数据库上执行操作;如果任何其中一个数据库回答不 ok,那么就回滚事务。这种分布式事务方案,比较适合单块应用里,跨多个库的分布式事务,而且因为严重依赖于数据库层面来搞

2020-07-04 15:20:38 208

转载 并查集

并查集是什么并查集是一种用来管理元素分组情况的数据结构。并查集可以高效地进行如下操作。不过需要注意并查集虽然可以进行合并操作,但是却无法进行分割操作查询元素a和元素b是否属于同一组合并元素a和元素b所在的组并查集的结构并查集也是使用树形结构实现的,不过不是二叉树。每个元素对应一个节点,每个组对应一棵树。在并查集中,哪个节点是哪个节点的父亲以及树的形状等信息无需多家关注,整体组成一个树形结构才是重要的。(1)初始化我们准备n个节点来表示n个元素。最开始时没有边。(2)合并像下图一

2020-06-18 18:48:04 716

转载 KMP算法

KMP 算法的核心思想,跟 BM 算法非常相近。在模式串和主串匹配的过程中,把不能匹配的那个字符仍然叫作坏字符,把已经匹配的那段字符串叫作好前缀。从模式串和主串头部开始匹配,遇到坏字符时模式串向后滑动,可滑动多少呢,这就是KMP算法的关键。好前缀的后缀子串 与 主串的前缀子串 匹配存在时,模式串就不能向后滑动模式串长度个位置了。为了能够快速得到不匹配是向后滑动的位数,我们先构建了next数组。数组下标是模式串前缀子串结尾字符下标,值是最长可匹配前缀串结尾字符下标。计算next为了效率使用递归的思想。

2020-05-22 16:52:49 171

转载 BM算法

BM 算法包含两部分,分别是坏字符规则(bad character rule)和好后缀规则(good suffix shift)。坏字符规则BM 算法的匹配顺序是按照模式串下标从大到小的顺序,倒着匹配的。我们从模式串的末尾往前倒着匹配,当我们发现某个字符没法匹配的时候。我们把这个没有匹配的字符叫作坏字符(主串中的字符)。我们拿坏字符 c 在模式串中查找,发现模式串中并不存在这个字符,也就是说,字符 c 与模式串中的任何字符都不可能匹配。这个时候,我们可以将模式串直接往后滑动三位,将模式串滑动到

2020-05-22 12:28:24 487 1

转载

图中有几个概念:无向图、有向图、带权图、顶点、边、度、入度、出度。还学习了图的两个主要的存储方式:邻接矩阵和邻接表。邻接矩阵:邻接矩阵的底层依赖一个二维数组。对于无向图来说,如果顶点 i 与顶点 j 之间有边,我们就将 A[i][j]和 A[j][i]标记为 1;对于有向图来说,如果顶点 i 到顶点 j 之间,有一条箭头从顶点 i 指向顶点 j 的边,那我们就将 A[i][j]标记为 1。同理,如果有一条箭头从顶点 j 指向顶点 i 的边,我们就将 A[j][i]标记为 1。对于带权图,数组中就存储相应

2020-05-21 18:18:31 128

转载 数组

/** * 1) 数组的插入、删除、按照下标随机访问操作; * 2)数组中的数据是int类型的; * * Author: leo */type Array struct { data []int length uint}//为数组初始化内存func NewArray(capacity uint) *Array { if capacity == 0 { retur...

2020-05-15 16:35:12 120

转载

满足这两点,它就是一个堆:堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。从图中我们可以看到,数组中下标为 i 的节点的左子节点,就是下标为 i∗2 的节点,右子节点就是下标为 i∗2+1 的节点,父节点就是下标为 2i​ 的节点。往堆中插入一个元素往堆中插入一个元素后,我们需要继续满足堆的两个特性。就需要进行调整,让其重新满足堆的特性,这个过程我们起了一个名字,就叫作堆化(heapify)。堆化实际上有两种,从下往上和从上往下。这里我先讲从下往上

2020-05-15 16:28:10 139

转载 红黑树

因为平衡二叉树的维护成本非常高,如果不维护会导致性能的退化,对于动态数据不太适用,经过取舍,相对牺牲一些性能,减小和降低维护成本,并且经过简单维护保持稳定的性能,所以出现了红黑树。红黑树需要满足这样几个要求:根节点是黑色的;每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;红黑树只是做到了近似平衡,并不是严格的平衡,所以在维护平衡

2020-05-14 11:45:13 237

转载 清晰理解红黑树的演变---红黑的含义

前言红黑树,对不少人来说是个比较头疼的名字,在网上搜资料也很少有讲清楚其演变来源的,多数一上来就给你来五条定义,红啊黑啊与根节点距离相等之类的,然后就开始进行旋转、插入、删除这些操作。一通操作下来,连红色和黑色怎么来的,是什么含义,有什么作用都云里雾里的,能搞清楚就怪了。本文介绍红黑树,暂时不涉及任何代码,只是帮助你理解红黑树的演变来源,树结构中红黑色具体含义,保证你理解了过后,再去看什么旋转插入的东西,要清晰得多。换句话说,理解本文要描述的内容是从代码级理解红黑树的基础。开始之前,我还是恳请你保持耐

2020-05-13 18:23:11 257

转载 二叉查找树

二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。二叉查找树的查找操作先取根节点,如果它等于我们要查找的数据,那就返回。如果要查找的数据比根节点的值小,那就在左子树中递归查找;如果要查找的数据比根节点的值大,那就在右子树中递归查找。二叉查找树的插入操作新插入的数据一般都是在叶子节点上,所以我们只需要从根节点开始,依次比较要插入的数据和节点的大小关系。如果要插入的数据比节点的数据大,并且节点的右子树为空,就将新数据直接插到右子节

2020-05-13 17:59:02 306

转载 二叉树

树的几个概念:父节点、子节点、兄弟节点、根节点、叶子节点(叶节点)、高度、深度、层。A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫作根节点,也就是图中的节点 E。我们把没有子节点的节点叫作叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。除了叶子节点之外,每个节点都有左右两个子节点,这

2020-05-13 14:38:32 220

转载 散列表 哈希表 HaskTable

散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查询元素时,我们用同样的散列函数,将键值转化数组下标,从对应的数组下标的位置取数据。散列函数,顾名思义,它是一个函数。我们可以把它定义成 hash(key),其中 key 表示元素的键值,hash(key) 的值表示经过散列函数计算得到的散列值。散列函数设计的基本要求:1.散列函

2020-05-12 19:04:30 702

转载 跳表

跳表是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(Red-black tree)。有序链表加多级索引的结构就是跳表。加索引之后,查找一个结点需要遍历的结点个数减少了,也就是说查找效率提高了。跳表中查询任意数据的时间复杂度就是 O(logn)。跳表的空间复杂度是 O(n)。跳表这个动态数据结构,不仅支持查找操作,还支持动态的...

2020-05-07 18:09:06 238

转载 快速排序

快排的思想是这样的:如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivo...

2020-04-29 18:21:56 122

转载 归并排序

归并排序把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。归并排序使用的就是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。从我刚才的描述,你有没有感觉到,分治思想跟我们前面讲的递归思想很像。是的,分治算法一般都是用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程...

2020-04-29 17:57:30 253

转载 选择排序

选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。首先,选择排序空间复杂度为 O(1),是一种原地排序算法。选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度都为 O(n2)。选择排序是一种不稳定的排序算法。从我前面画的那张图中,你可以看出来,选择排序每次都要找剩余未排序元素中的最小值,并和前面...

2020-04-29 14:56:51 110

转载 插入排序

首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。如图所示,要排序的数据是 4,5,6,1,3,2,其中左侧为已排序区间,右侧是未排序区间。插入排序也包含两种操作,一种是...

2020-04-29 14:53:58 158

转载 冒泡排序

冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。我用一个例子,带你看下冒泡排序的整个过程。我们要对一组数据 4,5,6,3,2,1,从小到大进行排序。第一次冒泡操作的详细过程就是这样:可以看出,经过一次冒泡操作之后,6 这个元素已...

2020-04-29 14:41:40 125

转载 栈的应用场景

栈在函数调用中的应用我们知道,操作系统给每个线程分配了一块独立的内存空间,这块内存被组织成“栈”这种结构, 用来存储函数调用时的临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数执行完成,返回之后,将这个函数对应的栈帧出栈。为了让你更好地理解,我们一块来看下这段代码的执行过程。int main() { int a = 1; int ret = 0; in...

2020-04-27 14:26:30 2651

转载 golang内幕之组合

type Parent struct { Name string Age int} func (p Parent) String() string { return fmt.Sprintf("Name:%s, Age:%d", p.Name, p.Age)} func StructCombine_1() { var p1 = Parent{} fmt.Println(p1)...

2020-04-24 15:47:44 163

转载 golang内幕之协程goroutine

func ForGoStatement_1() { go func() { fmt.Println("go-func-1") }()} func main() { ForGoStatement_1()}参考如下文章,会更清楚golang的协程:【golang内幕之程序启动流程】【https://blog.youkuaiyun.com/QQ1130141391/article/detai...

2020-04-24 15:13:30 157

转载 golang内幕之for range value

func ForRangeValue_1() { var mapAges map[string]int mapAges = make(map[string]int) mapAges["name-1"] = 1 mapAges["name-2"] = 2 mapAges["name-3"] = 3 var newAges map[string]*int newAges = make...

2020-04-24 12:13:19 208

转载 golang内幕之defer panic recover

问题:defer适用在什么场景?我们先看下下面一段拷贝文件的代码:func CopyFile_1(src, dst string) (wlen int64, err error) { sfd, err := os.Open(src) if err != nil { return 0, err } dfd, err := os.Create(dst) if err != nil...

2020-04-24 12:05:58 181

原创 MongoDB Sharding

介绍Sharding KeySharding key必须是在对应的collection当中所有的文档都存在的field,比如我要sharding我的user collection,我就可以找nick_name这种所有documents中都存在的field来做为sharding key,当然还要考虑其它因素,但是这个是一个必要条件。sharding key可以一个或者多个fields组成,还...

2020-04-22 12:08:14 484

转载 BASE原则

BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定义。CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:Basically Availble --基本可用...

2020-04-20 18:07:45 1735

转载 CAP定理

CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:一致性(Consistency) (所有节点在同一时间具有相同的数据)可用性(Availability) (保证每个请求不管成功或者失败都有响应)分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会...

2020-04-20 18:03:31 180

转载 ACID规则

事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:A (Atomicity) 原子性原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起...

2020-04-20 17:58:14 198

转载 深入浅出 FlatBuffers 之 Encode

一. FlatBuffers 生成二进制流FlatBuffers 的使用和 Protocol buffers 基本类似。只不过功能比 Protocol buffers 多了一个解析 JSON 的功能。编写 schema 文件,描述数据结构和接口定义。用 flatc 编译,生成相应语言的代码文件。解析 JSON 数据,把数据存储成对应的 schema,并存入 FlatBuffers 二进制...

2020-04-20 17:28:46 1208

转载 Golang控制panic stack trace的深度

通过研究官方文档,发现可以通过设置环境变量GOTRACEBACK来控制Golang panic stack trace输出的信息的多少。说明如下:环境变量GOTRACEBACK可以控制Go进程由于不可恢复的panic或者未预料到的其他运行时异常而产生的错误堆栈输出的信息的多少。默认情况下(single),当产生错误的时候,只会打印出异常goroutine的异常堆栈,当不存在当前goroutin...

2018-09-14 20:24:05 1038

转载 Go语言并发与并行

首先,并行!=并发, 两者是不同的Go语言的goroutines、信道和死锁goroutineGo语言中有个概念叫做goroutine, 这类似我们熟知的线程,但是更轻。 以下的程序,我们串行地去执行两次loop函数:func loop() { for i := 0; i 10; i++ { fmt.Printf("%d ", i) }

2018-01-12 19:23:04 4022

转载 linux下安装lua

下载lua源码,编译,安装wget -c https://www.lua.org/ftp/lua-5.3.4.tar.gztar -zxvf lua-5.3.4.tar.gzcd lua-5.3.4make linux这时候遇到了问题gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX -c

2017-08-11 21:23:16 660 1

原创 使用localhost和127.0.0.1连接mysql的区别

localhost和127.0.0.1去连接MySQL的区别,在此总结下。一、网络限制localhost本地服务器,不经网卡传输,不受网络防火墙和网卡相关的的限制。127.0.0.1本机服务器,通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。如果服务器防火墙没有关闭,关系到localhost可以正常连接MySQL,127.0.0.1不行。如何关闭S

2017-07-31 17:05:58 1888

转载 Nginx Cache方面的设置

这里 Cache 有两种情况说明,一种是浏览器访问Nginx,浏览器会Cache;一种是Nginx 访问后端,Nginx 自己Cache 。第一种情况来个例子:$ curl -I http://su.bdimg.com/static/superplus/css/super_min_2b5190eb.cssHTTP/1.1 200 OKServer: JSP3/2

2017-07-28 15:22:58 2274 1

空空如也

空空如也

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

TA关注的人

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