C/C++
文章平均质量分 66
李亚超
自强不息,厚德载物;
专注于Deep Learning, Machine Translation, NLP;
喜欢写关于Linux C/C ,C#,算法,自然语言处理的技术博客,欢迎观临;
展开
-
【算法导论】c++实现堆排序
堆排序的过程就不说明了,代码如下:void Build_Max_Heap(int array_list[] ,const int array_size,const int index);bool HeapSort(int array_list[],const int array_size);int main(){ const int size = 10; int array_li原创 2012-06-27 17:42:07 · 1951 阅读 · 1 评论 -
【算法导论】用C++实现快速排序
本算法为【算法导论】7.1的C++实现,代码如下:#includevoid swap(int * a,int * b);int partition(int * array_list,int left,int right);void quick_sort(int * array_list,int left,int right);void Print();const int size原创 2012-06-29 16:14:57 · 1670 阅读 · 1 评论 -
让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件
正常情况下,当我们用VC编译出一个Console/Win32类型项目的exe程序时(这里暂不考虑MFC程序),会依赖于msvcrxx.dll文件(xx为不同VC对应的版本号,VC2005为80,VC2008为90,VC2010为100),发布程序的时候,就需要把对应的dll也copy过去,比较不方便。通过以下的方法,可以让exe不依赖于这些dll(不过生成的exe会大很多)以VC2转载 2012-06-26 16:00:21 · 10088 阅读 · 0 评论 -
【算法导论】c++实现计数排序
计数排序的基本思想为:对每一个输入的元素x,确定出小于x的元素的个数。有了这一信息,那么就可以把x直接放到相应的位置上。特点:1 需要临时的存储空间,如果排序数据范围特别大时,空间开销很大。2 适合于排序0 - 100以内的数据。3 排序的时间复杂度为O(n)。#include #include const int size = 100;int * array_list原创 2012-07-06 15:23:29 · 3928 阅读 · 0 评论 -
【算法导论】c++实现的随机化的快速排序
随机化的快速排序:#include #include #include void swap(int * a,int * b);int partition(int * array_list,int left,int right);void Print();int random_partition(int * array_list,int left,int right);void原创 2012-07-04 17:21:03 · 1691 阅读 · 0 评论 -
【算法导论】同时找出最大值和最小值
在一个有n个元素的集合中,需要多少次比较才能确定其最小、最大元素呢?如果一个一个的比较,那么需要n-1次比较,是不是有更好的方法呢?如果,在比较中,记录遇到的最大值和最小值。将输入的元素两两比较,然后与当前的最大值、最小值进行比较。这样每2个元素需要3次比较,而不是原来的4次。实现代码如下:void MiniNum(){ const int size = 100000; int原创 2012-07-04 16:22:23 · 6303 阅读 · 0 评论 -
【算法导论】装备线调度问题
本程序为算法导论中动态规划章节(15.1)的装配线调度问题的C++实现代码,具体问题就不详细说明了,代码如下:#include#includeconst int max_len = 6;int a[max_len][2] = {{7,8},{9,5},{3,6},{4,4},{8,5},{4,7}};/*装配站a,i,j上的耗费时间*/int t[max_len-1][2] = {{原创 2012-05-30 15:15:56 · 1206 阅读 · 0 评论 -
标准C++实现key-value数据插入及修改的简单例子
在统计文本数据时,经常会出现一些key-value结构的数据,并且需要进行动态的修改,下面为用c++标准程序库实现的一个操作key-value结构数据的简单例子。#include#include #include #include #include using namespace std;typedef struct atom_node{ std::string key; s原创 2012-05-11 17:22:43 · 9682 阅读 · 0 评论 -
ScorePP-用标准C++实现的自动分词评测程序
中文分词是自然语言处理的基础性关键问题,近一年来一直在进行着分词方面的研究。一开始用的是Sighan backoff 提供的用Perl脚本编写的分词打分程序Score。为了把用C++写的分词程序和评测程序无缝的结合在一起,同时也为了自动的分析分词中的错误原因,参考Score改写了在C++下的评测程序,我自己称它为ScorePP。 为了分词很长时间都没有休息了。中午走出自动化所的食原创 2012-04-13 17:05:58 · 3498 阅读 · 2 评论 -
一个通用的Trie树,标准C++实现
1 Trie简介 Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 在本文中,对于输入的进行序列化,比如输入“单词查找树”,序列化为“单/词/查/找/树”,这样可以进行任何一种自原创 2012-04-03 13:09:12 · 6191 阅读 · 1 评论 -
在Linux下编译Google leveldb数据库及在C++中操作示例
1:简介 Leveldb是一个google实现的非常高效的kv数据库,可按照字符串键值顺序映射进行存贮。目前的版本1.2能够支持billion级别的数据量了。 在这个数量级别下还有着非常高的性能。 Leveldb是一个C++库,可用于很多情况。比原创 2011-08-07 19:16:14 · 14760 阅读 · 18 评论 -
一步一步实现C++操作SQLite数据库
一步一步实现C++操作SQLite数据库 SQLite,是一款轻型的数据库,是遵守ACID的关联式关系数据库,目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主原创 2011-08-05 14:59:35 · 10170 阅读 · 4 评论 -
Unicode(UTF16)文件读写终极方案---用C++标准的字节流读取,转化为宽字符(wchar_t),再以字节流写入
用C++做程序真够麻烦的,先不说各种数据类型搞的人头疼,再者读写各种编码的文本文件ansi、Unicode、UTF-8等等,让人头晕目眩的。 这半年来经常要用C++处理各种不同编码的文本文件,开始读取Unicode文件,一直很麻烦。用了wifstream,wsp原创 2011-07-29 13:13:17 · 11323 阅读 · 4 评论 -
string和wstring相互转换方法,标准C++做成,可以在Linux、Windows下运行
string和wstring相互转换方法,这个是对以前的修改,主要修改了输入为空,导致的小bug。/* string 转换为 wstring */std::wstring c2w(const char *pc){ std::wstring val = L""; if原创 2011-07-22 10:10:50 · 11966 阅读 · 3 评论 -
用标准C++做的string和wstring相互转换方法,经过大规模测试
这段代码是从网上找的。但是,在实际使用中,出现了很多莫名奇妙的问题。后来多了修改,经过大规模的测试,表现良好。首先,感谢原作者,由于找不到链接了,不好意思,没能贴出链接地址。 size_t Dictionary::get_wchar_size(const char *str){ size_t len = strlen(str); size_t size=0;原创 2011-06-28 17:12:00 · 4170 阅读 · 1 评论 -
【模式识别与机器学习】模式识别中的一些基本概念
1 特征(feature):如果有一个区分鱼的类别的系统,可以分类的依据为长度、光泽、宽度、鳍的数目和形状、嘴的位置。这些可以利用的要素称为模式分类的特征。2 模型(model):如果鱼的不同类别之间确实存在某种差异,我们称之为具有不同的模型,即可以用数学形式表达的不同特征的描述。在模式识别系统中,经常会用到三种密切相关的系统,回归分析、函数内插和(概率)密度估计。3 回归(regre原创 2012-07-02 11:27:55 · 4188 阅读 · 2 评论 -
【面试题精选】2-求二元树的路径和
题目来源:微软面试100题:在二元树中找出和为某一值的所有路径题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22 和如下二元树10/ \5 12/ \4 7则打印出两条路径:10, 12 和10, 5, 7。#include using nam原创 2012-09-27 20:59:54 · 954 阅读 · 0 评论 -
【面试题精选】3 数字操作-翻转及求和
在这里介绍两个操作数字的小程序,程序不难,但是需要一定的技巧:代码如下:#include using namespace std;int digitSum(int digit);int digitReverse(int num);int main(int argc,char * argv[]){ return 0;}/*返回正整数中的各位数字之和,比如49205返回20*/原创 2012-10-04 20:08:53 · 1222 阅读 · 0 评论 -
Unicode(UTF16)文件读写终极方案
去年写过一个博客介绍了自己写的一个读写Unicode编码文件的方法,这个方法不使用系统提供的类库,使用标准C++的方法,因此很很好的可移植性。上次写的没经过大规模的测试,这几天对这个方法进行了修改:1支持Windows和Linux的换行符2修改了部分代码,使之更加健壮代码如下:/* ******************************************原创 2013-02-26 21:31:56 · 2832 阅读 · 0 评论 -
C++debug和release的差异
c++的debug对程序检查的很不严格,而release进行研究检查。比如,debug对数组越界不报错,程序运行时也没问题。但是release一旦运行就出错。做注意这个问题。原创 2013-03-08 10:21:58 · 1413 阅读 · 0 评论 -
一个奇怪的c++错误
下面是我实现的一个工程上得部分代码,除了很奇怪的错误:class Trie { public: Trie(); ~Trie(); bool loadModel(const std::string model); private: bool type ; static std::map _model; static bool Split(原创 2013-01-26 23:06:27 · 1117 阅读 · 0 评论 -
【算法导论】24.1 Bellman-Ford 算法
本代码为算法导论24.1的C++实现。#include using namespace std;#define N 5#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3//顶点结点结构 struct Vertex { Vertex * next;/*指向下一个顶点*/原创 2012-11-19 14:45:35 · 2512 阅读 · 0 评论 -
【算法导论】24.3 Dijkstra算法
算法导论24.3章中算法的C++实现,代码如下:/******************************************************************** * Copyright (C) 2012 Li Yachao * Contact: liyc7711(at)gmail.com * * Permission to use, copy, m原创 2012-11-19 16:37:30 · 3124 阅读 · 0 评论 -
【算法导论】22.1 图的转置
用邻接表表示的图的转置算法,比较简单。#include using namespace std;#define N 8#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3//顶点结点结构 struct Vertex { Vertex * next;/*指向下一个顶点*/原创 2012-11-18 22:02:05 · 2318 阅读 · 1 评论 -
【算法导论】22.2-7 树的直径问题
树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾) 2) 如果原创 2012-11-19 09:27:34 · 4528 阅读 · 0 评论 -
【算法导论】22.7 无向图的广度优先搜索--C++实现
这是用无向图的广度优先搜索代码,如果是有向图需要稍微修改,否则产生死循环。邻接矩阵表示的无向图的广度优先搜索:#include #include #include using namespace std;#define N 6#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3原创 2012-11-15 10:33:03 · 3325 阅读 · 0 评论 -
【算法导论】22.3 图的深度优先搜索-C++实现
本程序是用邻接表表示的图的深度优先搜索,为算法导论22.3伪代码的C++实现。对于有向图可以得到正确的结果,对于无向图貌似也可以得到遍历结果,代码如下:#include using namespace std;#define N 6#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3原创 2012-11-15 21:49:18 · 5461 阅读 · 2 评论 -
【面试题精选】1-构造一个二叉查找树-C++实现
根据输入的数组元素,构造一个二叉查找树。#include using namespace std;/*二叉查找树结构*/typedef struct BSTree{ int node_value; struct BSTree * left; struct BSTree * right;}Tree;/*****构造二叉查找树*****************************原创 2012-09-26 10:48:12 · 1150 阅读 · 0 评论 -
【算法导论】二叉查找树的操作C++实现
本代码为算法导论第12章中,伪代码的C++实现:#include #include using namespace std;/*二叉查找树结构*/typedef struct BSTree{ int node_value; struct BSTree * left; struct BSTree * right; struct BSTree * parent;}Tree;T原创 2012-10-15 11:11:03 · 1691 阅读 · 0 评论 -
【算法导论】线性时间选择---从数组中选择第i小的数
问题:从数组中选择第i小的数,并且要求问题的时间复杂度为O(n)。代码用到了随机化的快速排序中的分组方法。其基本原理为:用快速排序的分组方法,随机的选择一个数组元素,使其大于左边的元素,小于右边的元素。然后,看这个元素的下表与要求元素中第i小的值是否相等,如果小于i则表示要查找的元素在当前分组元素的右边,如果大于i表示在左边。这样递归进行,可以达到很高的运行效率。c++实现的代码如下:原创 2012-10-12 20:07:28 · 5246 阅读 · 0 评论 -
【面试题精选】4 优先级队列,堆积
优先级队列为,首部元素最大,总是删除当前最大元素。并在尾部插入元素。删除元素的时间复杂度为O(1),插入元素的时间复杂度为O(lgn),效率非常高。C++实现代码如下:#include using namespace std;const int MAX_SIZE = 1024;int Tail = 0;int PriorStack[MAX_SIZE]={0};bool原创 2012-10-07 18:24:37 · 1565 阅读 · 1 评论 -
Linux下读取UTF-8文本文件
开始我以在Linux为读取UTF-8的文本会很麻烦的,因为这不是普通的ANSI编码文件。所以开始看了很多资料,没想到,用普通的方法竟然读取出来了。并且读写和普通的纯文本文件一样,也没有像Windows下的头文件标志。 哎,Unicode编码人的智慧啊,要不在Linux下,所有的命令都要重写了。 我们IT民工啥时候可以达到这种程序啊。原创 2011-06-22 22:30:00 · 3898 阅读 · 0 评论 -
Linux Unicode 编程---如何(在程序中)加入并使用 Unicode 以实现外语支持
From:http://www.ibm.com/developerworks/cn/linux/i18n/unicode/linuni/Unicode 并不只是一个编程工具,它还是一个政治的、经济的工具。没有结合世界的语言支持的应用程序通常只能被那些能读写 ASCII 所支持语言的个人使用。这使得建立在 ASCII 基础之上的计算机技术脱离了世界上大部分人。Unicode 允许程序使用世界转载 2011-06-15 07:58:00 · 1717 阅读 · 0 评论 -
CFile在写入Unicode编码文件出现乱码---原因及解决办法
<br /><br /> 这几天统计一个词典,为藏文词典,以Unicode编码保存。要对其进行过滤处理,并且要保存处理后的结果。<br /> 在一开始出现了一下问题:<br /> 1,把源文件读到程序中,重新写回去,没问题<br /> 2,在对原文件处理后,重新写回去,出现乱码<br /> 原来,在程序处理时,把Unicode文件的头标志,过滤掉了。这样,写入的文件虽然是Unicode文件,但是,没有头标志,程序没法判断文件编码,只有按默认的ANSI编码读取。这原创 2011-04-21 19:26:00 · 4977 阅读 · 0 评论 -
C/C++中的void类型探究
<br />1:概述<br />在C/C++中void类型本意指的是,无类型。就说这个类型,不像int、double那样成为一个可以提供用户正常使用的系统数据类型。如果定义了一个变量如下:<br />void v;<br />在Linux中,用gcc编译报错如下:“variable or field 'v' declared void”。<br />如果定义void类型的指针,如下:<br />void * p;<br />在Linux中,用gcc编译,没有问题。<br />也就是说,void不能用于一般原创 2011-03-03 22:02:00 · 4439 阅读 · 0 评论 -
C++虚函数表解析
<br /><br />C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。<br />关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面转载 2011-02-10 20:55:00 · 1029 阅读 · 1 评论 -
看似简单,但是经常出错的微软面试题(C/C++)1
<br />在面试过程中,不少人有这样的经历。笔试题感觉做的很好,但是没有应聘上。为啥?看似简单的问题,面试官的要求就越高,这时候需要考虑的问题的方方面面,一不小心,就大意失荆州。<br />下面看一个简单的微软面试题:把一个字符串转换成整数。大多数人,一看到这个标题,大多数人觉得“小意思”,我不到三分钟就搞定它。<br />int StrToInt(char* string){ int number = 0; while(*string != 0)原创 2011-02-26 18:00:00 · 1850 阅读 · 0 评论 -
C++自定义类的析构函数,生成指针对象:用delete删除时,产生错误:"fatal error LNK1120: 1 个无法解析的外部命令"
<br /><br /> 在C++中,如果用户自定义了类的析构函数,会覆盖系统默认的析构函数。则对象在销毁时,会调用用户定义的类的析构函数,来释放内存。<br /> 所以用户在定义类的析构函数时,如果没有在程序中实现,在使用类的指针对象是。用delete删除对象是会出现错误:“fatal error LNK1120: 1 个无法解析的外部命令”。<br />就是因为,用户定义的析构函数,而没有来实现。所以delete删除时,出现了这样的错误。<br /> 总结:<br />原创 2011-01-19 19:38:00 · 5853 阅读 · 2 评论 -
C++基础之:引用与指针的区别
<br /> <br />在C++中指针和引用的功能很相似,共同点为都可以直接或者是间接地指代其他的对象。下面介绍不同点<br />1:操作符<br />指针使用“*”和“->”操作符,引用使用的是“.”<br />2:变量初始化<br />首先引用不能为空,指针可以为空。<br />引用必须要指代对象,指针可以在初始化时<br />string &str; //错误,引用不能为空<br />string s("liyachao");<br />string &rs=s; //可以<br />strin原创 2011-01-07 22:32:00 · 1261 阅读 · 0 评论 -
C++基础之:对象的静态类型和动态类型
<br /> <br />由于继承导致对象的指针和引用具有两种不同的类型:静态类型和动态类型。<br />静态类型:指针或者是引用声明时的类型。<br />动态类型:由他实际指向的类型确定。<br />例如:<br />GameObject *pgo= //pgo静态类型是GameObject *<br />new SpaceShip;//动态类型是SpaceShip*<br /><br />Asterioid *pa = new Asterioid;//pa的静态类型是Asterioid *<br />/原创 2011-01-07 20:48:00 · 6768 阅读 · 0 评论