自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序人生

不想被定义,所以要编程

原创 C++拷贝构造函数

定义拷贝构造函数(copy constructor),又称复制构造函数,是在基于同一个类的其他对象进行构造的时候(赋值初始化、参数传递、返回值)被编译器调用的一种特殊构造函数。假设有一个类类型为T,拷贝构造函数的第一个形参必须是该类类型的引用,(即T&)也可以用cv限定符来修饰(const T&、volatile T&或const volatile T&),也可...

2019-08-11 22:19:32 106

原创 C++默认构造函数

定义默认构造函数是可以无实参调用(空参数列表或所有形参都提供了默认初始值)的构造函数,在没有提供显式初始化值时被调用。假设类类型为T,其默认构造函数声明的语法如下:T();T::T();T() = delete; //C++11T() = default; //C++11T::T() = default; //C++11在上面几种默认构造函数的声明中,2和5都属于类外定义(每...

2019-08-06 01:25:33 179

原创 LibROSA库提取MFCC特征的过程解析

目录源码解析获取梅尔频谱分帧加窗快速傅里叶变换梅尔滤波器取对数离散余弦变换总结LibROSA(本文使用的版本是0.6.3)中的mfcc函数可以用来提取音频的梅尔频率倒谱系数(Mel-Frequency Cepstral Coefficients,MFCCs)特征,MFCC被广泛应用于语音识别。LibROSA的mfcc函数源码如下:# -- Mel sp...

2019-04-07 19:28:41 7201 10

原创 C++断言

断言简述断言(assertion)是编程中的一种常用手段,在通常情况下,断言就是将一个返回值总是真(或者我们需要是真)的判别式放在语句中,用以排除在设计逻辑上不应该出现的情况。举个例子:我们都知道除数不能为0,那么就可以对除数使用断言,以使程序在除数为0的情况下产生异常退出。通常来说,断言并不是正常程序所必需的,但对于程序调试来说,通常断言能够帮助开发者快速定位那些违反了某些前提条件的程序...

2019-03-06 15:24:57 2273

原创 vim分屏

目录切割窗口水平分割调节窗口大小垂直分割关闭窗口切换窗口移动窗口窗口批处理分屏功能是通过分割窗口来实现的,这是提高工作效率的一大利器。无论我们想同时显示两个文件,或者同时显示一个文件的两个不同的位置,又或者并排比较两个文件……这些都能通过分屏来实现。切割窗口水平分割在命令模式下,输入以下命令::split这个命令把窗口横向切分为两个,并把光...

2019-02-28 14:40:40 560

原创 macOS下SVN常见命令简述

获取帮助命令格式:svn help(或svn h,或svn ?)此命令用以获取svn的常见命令及其书写格式。此外,加上具体的命令名称还可以获取该命令的说明文档,如:svn help status。检出命令格式:svn checkout|co URL [local_path]checkout命令用于将服务器端(代码仓库)中的项目代码检出(其实就是拷贝,类似于Git的clone...

2019-02-19 11:17:13 188

原创 Go并发编程——goroutine与channel

goroutine并发编程表现为程序由若干个自主的执行单元组成,在Go里,每一个并发执行的活动称为goroutine。从宏观作用上看,goroutine类似于操作系统或其他编程语言中的进程/线程,但实现却大不相同。Go语言中,当一个程序执行时,只有一个goroutine来调用main函数,这个routine称为主goroutine,新的goroutine通过关键字 go 进行创建——在函数...

2019-02-15 01:56:45 316

原创 Go语言的类型断言

类型断言是一个作用在接口值上的操作,写出来类似于x.(T),其中x是一个接口类型的表达式,而T是一个类型(称为断言类型)。类型断言会检查作为操作数的动态类型是否满足指定的断言类型,这有两种可能:1.如果T是一个具体类型,那么类型断言会检查x的动态类型是否为T。如果是则检查成功,类型断言的结果就是x的动态值,类型就是T,如果不是则检查失败。2.如果T是一个接口类型,那么类型断言会检查x的动态...

2019-02-12 14:51:46 351

原创 Go语言的接口

概述接口是一种抽象类型,是对其他类型行为的概括与抽象,从语法角度来看,接口是一组方法定义的集合。很多面向对象的语言都有接口这个概念,但Go语言接口的独特之处在于它是隐式实现。换句话说,对于一个具体的类型,无须声明它实现了哪些接口,只要提供接口所必需的方法即可。这种设计让编程人员无须改变已有类型的实现就可以为这些类型创建新的接口——对于那些不能修改包的类型,这一点特别有用。以Go标准库中的f...

2019-02-12 12:45:09 1489 2

原创 Go语言的方法

目录方法概述 嵌套结构体中的方法调用方法变量方法表达式封装方法概述尽管Go没有统一的面向对象编程(OOP)的定义,但依然支持方法(C++中常叫做成员函数)。因为对我们来说,对象就是一个值或变量,并且拥有其方法,而方法是某种特定类型的函数。OOP就是使用方法来描述每个数据结构的属性和操作。Go语言的方法声明和普通函数声明类似,只是在函数名前面多了一个参数。这个参数把这...

2019-02-09 23:44:05 210

原创 Go语言的结构体

概述与C相同,Go的结构体是零个或多个任意类型的命名变量组合在一起的聚合数据类型,每个变量叫做结构体的成员。结构体的每个成员都通过点号来访问。定义结构体时,成员通常一行写一个,但相同类型的成员也可以写在同一行上。但需要注意的是:成员的顺序对于结构体同一性很重要,如果我们将变量的定义顺序调换或者将本来单行定义的变量写成同一行(或反之),那么我们就会定义一个不同的结构体类型。命名结构体类型...

2019-02-06 22:49:35 72

原创 Go语言的函数特性

函数声明Go语言的每一个函数声明都包含一个函数名、一个形参列表、一个可选的返回列表以及函数体:func name(parameter-list) (result-list) {body}上述函数声明的语法通式中,若函数仅有一个或没有返回值,返回列表的圆括号可以省略。函数的类型称作函数签名。当两个函数拥有相同的形参列表和返回列表时(形参和返回值的名字不作为判断依据),这两个函数的类型或签...

2019-02-02 23:41:02 94

原创 Go语言变量的基本特性

变量声明Go语言中,用var关键字创建一个具体类型的变量,并设置它的初始值。通用形式为:    var name type = expression类型和表达式部分可以省略其中一个,但不能都省略。如果省略类型,变量的类型将由初始化表达式决定;如果表达式省略,其初始值对应于类型的零值——对于数字是0,对于布尔值是false,对于字符串是"",对于接口和引用类型(slice、指针、map、通道...

2019-02-01 23:08:20 111

原创 Go语言的常量

Go语言的常量是一种表达式,常量可以保证在编译阶段就计算出表达式的值。所有的常量本质上都属于基本类型:数字、布尔型、字符串等。Go语言的常量定义与变量类似,只不过使用了const关键字修饰,但不能使用短变量声明关键字 := 来定义常量。对于常量操作数,所有数学运算、逻辑运算和比较运算的结果依然是常量,常量的转换结果和某些内置函数的返回值(例如len、cap、real、imag、complex和...

2019-02-01 22:24:51 350

原创 Go的基本数据类型

整数与其他程序设计语言一样,Go的整型也分为有符号整型和无符号整型两类。有符号整型有int、int8、int16、int32、int64;无符号整型有uint、uint8、uint16、uint32、uint64、uintptr。上述整型中,后面带数字的整型有明确的大小,数字即代表比特位。int、uint、uintptr的大小并不明确,或者说与编译器相关。uintptr足以完整存放指针,仅用于...

2019-01-31 21:36:43 313

原创 MySQL数据类型

MySQL提供了多种数据类型,主要包括数值类型、字符串类型、日期和时间类型等。不同版本的MySQL支持的数据类型及其命名方式可能会稍有不同。我们可以通过查询帮助文件来获得具体信息,以5.7.19为例:我们还可以进一步查询某一种具体类型的定义及其存储空间等基本信息。 数值类型MySQL的数值类型   类型名 字节 有符号数范围 无符号数范围 整数...

2019-01-22 18:22:42 69

原创 MySQL基础——SQL语句

目录DDL语句创建数据库查看已创建的数据库选择数据库删除数据库创建表查看表定义信息删除表修改表修改字段类型增加表字段删除表字段修改字段排列顺序DML语句插入记录更新记录删除记录查询记录去重查询条件查询排序和限制聚合表连接DCL语句DDL语句DDL(Data Definition Langu...

2019-01-21 02:04:43 139

原创 主存内容更新算法

更新主存内容主存和缓存之间信息交换的关键是更新主存内容,一般有两种更新算法:写回法(Write Back)和写直达法(Write Through)。写回法是指在CPU执行写操作命中Cache时,信息只写入Cache,仅当需要被替换时,才将已被写入过的Cache块先送回主存,然后再调入新的数据块。写回法包括简单写回法和采用标志位的写回法。简单写回法不管块是否更新,都进行写回操作;而采用标志位...

2019-01-15 02:13:53 256

原创 《剑指offer》题解

1.赋值运算符函数CMyString& CMyString::operator=(const CMyString &str){ if (this != &str) { CMyString strTemp(str); char *pTemp = strTemp.m_pData; strTemp.m_pDa...

2018-12-25 13:53:47 124

原创 Linux进程间通信总结

 目录信号管道命名管道System V IPC组成标识符ftok函数结构定义特点消息队列信号量共享内存套接字Linux下的进程间通信(Interprocess Communication,IPC)方式基本上是从Unix继承而来的。对Unix发展做出重大贡献的两个实验室:AT&T的贝尔实验室、BSD在IPC方面的侧重点有所不同。前者...

2018-11-13 12:52:44 255

原创 进程间通信之Linux信号量编程

信号量信号量(Semaphore)是一种用于实现计算机资源共享的IPC机制之一,其本质是一个计数器。信号量是在多进程环境下实现资源互斥访问或共享资源访问的方法,可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,进程/线程必须获取一个信号量;一旦该关键代码段完成了,那么该进程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个进程释放信号量。信号量有两种应用形...

2018-11-12 16:03:03 4321

原创 进程间通信之Linux消息队列编程

消息队列消息队列是一种以链表为结构组织的数据,存放在Linux内核中,是由各进程通过消息队列标识符来引用的一种数据传送方式。每个消息队列都有一个队列头,利用结构struct msg_queue来描述。队列头中包含了该消息队列的基本信息,包括消息队列键值、用户ID、组ID、消息数目等,甚至记录了最近对消息队列读写进程的PID。消息队列的队列头存在于内核空间中,结构定义如下:struct...

2018-11-11 21:10:07 670

原创 进程间通信之Linux命名管道编程

命名管道管道(匿名管道)的使用局限性大,这与管道的实现机制有关。而命名管道(Named Pipe)不仅可在同一台计算机的任意不同进程之间通信,而且还可以在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。命名管道不同于管道之处在于它提供一个路径名与之关联,以命名管道的文件形式存在于文件系统中。这样,即使与命名管道的创建进程不存在亲缘关系的进程,只要能够访问该路径,就...

2018-11-11 11:29:07 227

原创 进程间通信之Linux管道编程

管道简述管道(pipe)是Unix/Linux中最常见的进程间通信方式之一,它在两个进程之间实现一个数据流通的通道,数据以一种数据流的方式在进程间流动。在系统中,管道相当于文件系统上的一个文件,用于缓存所要传输的数据。在某些特性上又不同于文件,例如当数据读出后,管道中就没有数据了,但文件没有这个特性。管道有两个特点:·部分系统下的管道是半双工的,数据在同一时间只能向一个方向流动。从实现的角...

2018-11-10 19:53:03 2028

原创 字符串匹配算法

目录Brute-Force算法Knuth-Morris-Pratt算法确定有限状态自动机部分匹配表Boyer-Moore算法Rabin-Karp算法总结网络信息中充满大量的字符串,对信息的搜寻至关重要,因此子字符串查找(即字符串匹配)是使用频率非常高的操作:给定一段长度为N的文本和长度为M的模式字符串(N≥M),在文本中找到一个和模式串相匹配的子串。由这个问题可以延...

2018-11-05 17:58:47 2793

原创 基数排序

基数排序(Radix Sort)属于分配式排序算法的一种,它是将待排序序列的元素切分为许多个部分作为排序键,对序列的每一趟排序都会更换不同的键(由低位到高位或是由高位到低位)进行计数排序。这种排序思想要求每一趟排序都是稳定的,即相同键值的相对位置不会发生改变,而计数排序可以满足这个要求。低位优先低位优先(Least Significant Digital,LSD)的基数排序主要应用于元素都...

2018-11-01 09:48:50 508

原创 计数排序

在所有基于比较的排序算法中,最快的算法其时间复杂度为O(NlogN),事实上可以证明,这已经是基于比较的排序算法的时间复杂度下界了。但有一种实现简单的非比较排序算法可以突破基于比较的排序算法这一时间下界——计数排序(Counting Sort)。如果我们的待排序序列为整数且有一个已知的数值范围K,那么计数排序可以在O(N+K)的时间复杂度内将序列排序好。在多数情况下计数排序的效率比任何基于比较...

2018-10-30 22:03:35 57

原创 Bellman-Ford算法及其优化

与Dijkstra算法一样,我们定义一幅加权有向图的结构如下://带权有向图struct EdgeWeightedDigraph{ size_t V; //顶点数 size_t E; //边数 map<int, forward_list<tuple<int, int, double>> adj; //改进后的邻接表,tuple存储的是边集}Be...

2018-10-30 12:09:29 621

原创 有向无环图的最短路径求解算法

对于最短路径问题,Dijkstra算法只能求解所有边的权值都是非负的加权有向图,而Bellman-Ford算法虽然可以求解有负权值边的图的最短路径,但效率并不高。对于有向无环图,下面这种基于Dijkstra和拓扑排序的算法可以在线性时间内解决单点最短路径问题,且能够处理负权重的边,甚至能够求出最长路径。该算法的思想很简单:按照拓扑顺序放松顶点。因为每条边v→w都只会被放松一次,当v被放松时有:...

2018-10-29 21:45:34 1868

原创 Dijkstra算法

Dijkstra算法是求解带权有向图中两点之间最短路径的经典算法,它采用贪心策略,维护一个向量dis用来表示从起点到其余顶点的路径“长度”。其主要原理如下:1.定义一个向量dis[],下标表示顶点,即dis[v]的值表示为从起点到v点的已知最短路径长度。初始化向量时,若v不是起点的相邻顶点,则dis[v]=∞,起点dis[0]=0。2.定义向量edge[],下标和值都表示顶点,假设edge...

2018-10-29 18:16:55 768

原创 最小生成树及其求解算法

最小生成树图论中,树是图的一种特殊形式,它的众多性质中有两个是求解最小生成树的Prim算法和Kruskal算法的基础:(1)用一条边连接树中的任意两个顶点都会产生一个新的环;(2)从树中删去一条边将会得到两棵独立的树。无权图中的边只是单纯的作为联系两个顶点的抽象概念,而带权图(也称加权图)中为边增加了权重,使得顶点之间的路径形式变得更丰富多样。图的生成树是它的一棵含有其所有顶点的无...

2018-10-24 21:03:47 333

原创 强连通分量求解算法

强连通分量在有向图中,如果顶点v和w相互可达,则称这两个顶点之间强连通。一幅图中任意两点之间强连通则称这幅图为强连通图。有向图的极大强连通子图就是有向图的强连通分量(Strongly Conneted Component)。强连通有如下性质:(1)自反性:任意顶点v和自身是强连通的。(2)对称性:如果v和w是强连通的,那么w和v也是强连通的。(3)传递性:如果v和w是强连通的且...

2018-10-23 20:32:14 2168 1

原创 图的连通分量寻找

连通分量无向图G的极大连通子图称为G的连通分量(Connected Component)。任何连通图(任意两个顶点之间可达的图)都只有一个连通分量,即自身,非连通图有多个连通分量。深度优先搜索的特点非常适合用于求解图的连通分量,每一次深度优先遍历所经过的顶点就是一个连通分量。因此只需要对图的每一个顶点调用一次深度优先遍历(注意标记访问过的顶点),就可以求得所有的连通分量。/* s...

2018-10-22 00:26:14 1517

原创 有向图及拓扑排序

有向图在无向图中,边没有方向,两条边之间的顶点是单向可达的,而有向图的边是单向的。虽然边的性质不同,但我们仍然可以用邻接表来表示有向图。对有向图的结构定义如下:#include <map>#include <forward_list> using namespace std; struct DirectedGraph{ size_t V, E;...

2018-10-20 23:06:53 8095 1

原创 无向图及其深度优先搜索和广度优先搜索

无向图图(Graph)是表示事物与事物之间的关系的数学对象,是数学领域的重要分支——图论(Graph Theory)的研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。无向图中边(edge)仅仅是两个顶点(vertex)之间的连接,是比较简单的图。我们定义无向图的结构如...

2018-10-19 21:46:44 2527

原创 红黑树及其插入、删除操作

在二叉搜索树中,基本操作如结点的插入、删除、查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示)。因此我们需要对二叉搜索树做出一些改进和限制,从而使其拥有更好更稳定的性能上界保证。红黑树就是一种自平衡的二叉搜索树。定义红黑树除了满足二叉搜索树的性质以外,还有以下性质:(1)红黑树的结点都是带有“颜色”属性的,...

2018-10-19 13:57:05 549

原创 二叉搜索树结点的查找、插入、删除

       二叉搜索树(Binary Search Tree,BST),要么是一颗空树,要么是一颗具有如下性质的二叉树:对于二叉搜索树的任意结点来说,若它的左子树非空,则左子树上所有结点的值均小于它的值; 若它的右子树不空,则右子树上所有结点的值均大于它的值; 它的左、右子树也分别为二叉搜索树。       定义一颗二叉搜索树的结点结构如下:struct BST_Node{ ...

2018-10-16 18:29:20 315

原创 快速排序优化

       快速排序是一种以分治为基本思想的排序算法,它将待排序数组分成两个子数组,将两部分再独立地排序。其中涉及到三个重要操作:选择基准元素、切分、对切分得到的子数组进行快排(分治)。因此对快速排序的优化也应针对这三部分进行。优化基准元素选择       快速排序最理想的情况是每次都能将序列切分成相同大小的两部分,因此切分所用的基准元素如何选择就成了影响算法性能的关键。最简单的实现就是...

2018-10-14 12:25:15 229

原创 希尔排序

       对于大规模乱序数据插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。希尔排序简单改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。希尔排序把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分成一组。因此希尔排序也叫缩小增...

2018-10-13 17:39:12 183

原创 二叉树的前中后序遍历

       本文源码示例是自己在LeetCode上做的相关题目而来。前序遍历       遍历思想:根节点→左子树→右子树递归版本/** * Definition for a binary tree node. * struct TreeNode * { * int val; * TreeNode *left; * TreeNode *rig...

2018-10-12 01:13:15 375

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