C++
liuwei1206
PhD student.
展开
-
快排的c++实现(两种实现方式)
快速排序算法是现在用的最广的排序算法,也是效率最高的。它有两种实现方式,一种是定轴法,另外一种是挖坑法。这里简单介绍一下两种实现方法的思想,并附上C++实现代码。(一)定轴法:1.备份对轴(首记录)2.取两个指针left和right,初始值分别是序列的第二个元素和最后一个元素,并且left<=right3.移动两个指针*从right所指的位置向左搜索,找到第一个小于轴的元素*从left所指的...原创 2016-10-22 20:51:12 · 15335 阅读 · 0 评论 -
2分法解决逆序对数
在一个数组中,如果两个元素aiaia_i和ajaja_j,有i<ji<ji < j 并且ai>ajai>aja_i > a_j,我们则成这两个元素对(ai,aj)(ai,aj)(ai, aj)次序出错,是一个逆序对。例如数组[2, 4, 1, 3, 5]中逆序对有3个,分别是(2,1),(4,1),(4,3)(2,1),(4,1),(4,3)(2, 1), (4, 1...原创 2018-04-13 09:38:35 · 1549 阅读 · 0 评论 -
二分图及其判断
二部图又称为二分图,双分图,指顶点可以分成两个不相交的集合U和V,使得在同一个集内的顶点不相邻的图。无向图为二分图G的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。 判断某个图是否是二分图可以用着色问题解决。我们从图中任选一个顶点s,并把它着为红色,接着s的邻居必须着为蓝色,然后s邻居的邻居再次作为红色,这样一层一层着色,直到整个图被着色为止;如果在着色过程中产生了冲...原创 2018-03-21 22:53:28 · 4861 阅读 · 0 评论 -
skyline point解析
Skyline query是多维度数据库中一种非常重要的point query,它最初由 Börzsönyi 等人于2001年提出。一个数据库中的数据对象(也就是空间中的点)可能有成千上万个,但是我们往往对其中一些更感兴趣,Skyline就是定义这里的“更感兴趣”的一种方式。如下图所示是美国纽约曼哈顿区的天际线(Skyline),显然这里的建筑有很多很多,但放眼望去我们所能看见的(也就是构成天...原创 2018-03-30 16:11:18 · 4396 阅读 · 1 评论 -
二分图的最大匹配问题
1.定义二分图: 将一个图的所有顶点划分为两个不相交集U和V,使得图中的每一条边的顶点分别属于点集合U和点集V,即同一点集中的点不构成边,这样的图叫做二分图。维基百科中给出的无向图G的二分图的充分必要条件是:G至少有两个顶点,且其所有回路的长度均为偶数。下图为带有回路的二分图举例: 匹配: 图中匹配的定义是指,这个图的一个边的集合,集合中任意两条边都没有公共的顶点,则称这个边...原创 2018-03-17 23:14:34 · 8576 阅读 · 0 评论 -
C++中序列化对象并存储到mysql
1.序列化C++序列化存在多种方式,我这里使用的boost,推荐看一个简单的教程。boost方法就是在类定义中添加一个友元类对象,并实现serialize()方法就可以让该类变为可序列化类。要使用boost序列化首先需要去boost官网下载相应的boost文件,然后需要include两个头文件,包括#include <boost\archive\text_oarchive.hpp> ...原创 2017-04-26 15:31:33 · 1695 阅读 · 0 评论 -
C++中lib和dll解析
(一)概念首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。 静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功原创 2017-04-28 12:10:46 · 3803 阅读 · 1 评论 -
LCA问题的RMQ解法解析
LCA问题是指最近公共祖先问题,RMQ问题是只区间最小值问题,我们可以将LCA问题转化为RMQ问题,然后利用RMQ的解法来解决LCA问题。有关RMQ问题的详解可以参考我的博客,有关于RMQ问题的详解。本博客重点讲如何将LCA问题转化为RMQ问题。当我们深度遍历树时,我们没遇到一个未访问过的节点就将其存入到数组中,同时记录下来的还有它的深度;当我们完成了对每一个节点u的所有分支访问后,会回溯到该节点...原创 2016-10-19 19:23:16 · 2156 阅读 · 0 评论 -
C++中图的简单表示法
在C++中,我们表示图的方法一般都是用链接矩阵或者连接表,这两种表示方法比较常见,但是另外一种用结构体来表示图的方法其实更加简单,而且也很省内存,与连接表法有些类似,但coding起来比较简单。 这个代码个邻接表很像,都是通过head[n]来找到一条以n为起点的边,然后根据边中的next来找其他边。但是还是有一点区别的,邻接表中,是按图中逆时针顺序将每原创 2016-05-22 11:47:07 · 955 阅读 · 0 评论 -
Tarjan算法详解
在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。如下图中,强连通分量有:{1,2,3,4},{5},{6} Tarjan算法是基于对图深度优先搜索的算法...原创 2016-10-16 10:08:45 · 17497 阅读 · 9 评论 -
并查集详解
并查集详解:并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集在使用中通常以森林来表示,每个集合组织为一棵树,并且以树根节点为代表元素。实际中以一个数组father[x]即可实现,表示节点x的父亲节点。另外用一个变量n表示节点的个数。但为了提升性能,通常还用一个数组rnk[x]表示节点x的子树的深度,因为我们希望建立的树的深度尽量的低,这样再向上查找的时候能够更快的找到最祖...转载 2016-10-16 20:15:02 · 497 阅读 · 0 评论 -
LCA详解
LCA问题(least Comment Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u,v)(通常查询数量较大),每次求树T中两个顶点u和v的最近公共祖先,即找到一个节点,同时是u和v的祖先,并且深度尽可能的大(尽可能远离树根).LCA问题的解法有很多,有一般解法,基于tarjan的解法,跳表解法以及RMQ和LCA互相转化的解法。下面我们依次原创 2016-10-18 21:31:18 · 22724 阅读 · 6 评论 -
RMQ问题解析
ST(Sparse Table,稀疏表)算法是求解RMQ问题的经典在线算法,以O(nlogn)时间预处理,然后在O(1)时间内回答每个查询。ST算法本质上是动态规划算法,定义了一个二维辅助数组st[n][n],st[i][j]表示原数组a中从下标i开始,长度为2^j的子数组中的最值(以最小值为例)。要求解st[i][j]时,即求下标i开始,长度为2^j的子数组的最小值时,可以把这段子数组再划分成两...转载 2016-10-19 10:07:06 · 580 阅读 · 0 评论 -
word2vec源码详解
已经看了很久的word2vec,但是发现了很多不同版本的解释,再加上原始论文没有提到太多的细节,所以打算直接看一遍源码,一方面可以加深自己理解;另一方面,以后也可以做适当的改进!源码分析请参考本人github地址:https://github.com/liuwei1206/word2vec 先给出源码中执行的流程图,按照流程图对代码进行详细的解读,流程图如下:训练部分的流程图如下:讲解将会按照这个训练过程来!(一)训练参数注意,这些参数都是全局参数,包括以下参数:size: 对应代码原创 2018-05-09 12:00:11 · 15236 阅读 · 9 评论