随笔分类 - C++
摘要:0/1背包 问题描述有N件物品和一个容量为V的背包,第i件物品的体积为c[i],价值为w[i]。求将哪些物品放进背包可以使物品价值总和最大(有两种情况:不要求填满背包和填满背包)。每件商品只有一件,且只能选择放或者不放入背包。 解决方案使用动态规划求解,定义一个递归式opt[i][v]表示前i个物品,在背包容量大小为v的情况下,最大的价值。opt[i][v] = max(opt[i-1][v], opt[i-1][v-c[i]] + w[i])其中opt[i-1][v]表示第i件物品不装入背包中的总价值,而opt[i-1][v-c[i]]+w[i]表示第i件物品装入背包中的总价值。通过初始..
阅读全文
摘要:做linux网络编程的同学都清楚,2.6版本以前的linux内核大多都是用select作为非阻塞的事件触发模型,但是效率低,使用受限已经很明显的暴露了select(包括poll)的缺陷了,为了解决这些缺陷,epoll作为linux新的事件触发模型被创造出来。一、epoll相对于select的优点: 1.支持一个进程socket描述符(FD)的最大数目 select支持的单进程socket描述符最大数目只有几千,而epoll支持的数目很大,等于系统最大打开的文件描述符数,这个文件描述符数跟内存有一定关系 2.IO效率不随FD数目增加而线性下降 select对事件的扫描是针对于所有创建的...
阅读全文
摘要:今天很有成就感,倒不是做出了多牛的东西,而是终于可以动态的进行编码的各种转换了。 其实这个用到的是网上一搜一大片的iconv,目前有windows版和linux版,linux下的很容易找到,直接装上就可以进行开发了,windows下的包可以通过这个链接下载:win-iconv-0.0.4.zip,直接将放入工程内,就可以使用了。 下面给出我自己的测试代码(基于文件的):#include <iostream>#include <stdlib.h>#include <stdio.h>#include <fstream>#include "i
阅读全文
摘要:最近在写正文抽取的过程中,经常用到字符串处理,为了更好的定制,就没使用第三方的字符串处理库,而选择了c++自带的标准库string 真正使用的时候,发现知道方法名,不知道怎么用了(参数),所以在网上找了个方法列表:#include <string>// 注意是<string>using namespace std;//string类的构造函数:string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初始化//此外,string类还支持默认构造函数和复制构造函数,如string s1;string s
阅读全文
摘要:近期在写一个正文抽取的程序,基于linux平台C++,大体流程从网页获取-->网页解析-->构建变种dom树-->正文抽取算法-->结构化输出。 目前已经完成了第一个功能,调试第二、三个功能,由于互联网上的页面很多由“无证”程序员完成,所以很不规范,需要进行一些容错处理,所以比较耗时间,而且,由于之前对编码格式不了解,在解析时,对我来说编码格式的转换也是一个难题,不过应该会在不断的学习过程中慢慢解决,也算是弥补一下技术缺陷。 网页获取可以用curl库完成,很简单,主要有四个函数: 1.CURL *curl_easy_init( ) This function must
阅读全文
摘要:#include <iostream.h>#include <stdlib.h>#include <stdio.h>using namespace std;//冒泡排序 O(n^2)---稳定冒泡排序将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为ki的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R;凡扫描到违反本原则的轻气泡,就使其向上"漂浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。void BubbleSort(int *arr, int len){ bool changed
阅读全文
摘要:信号(signal) 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。 信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。 信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及si...
阅读全文
摘要:一、 XSI IPC1. 介绍XSI IPC包括消息队列、信号量和共享内存,它们都用一个非负的标示符(identifier)加以引用。标识符是IPC对象的内部名,为了使进程间能够在同一个IPC上相连,就要有一个外部名。键(key)就是这个外部名,每个IPC对象都与一个键相关联。 几种使客户进程与服务进程关联的方法(1) 服务进程可以指定键IPC_PRIVATE创建一个新IPC结构,将返回的标识符存在某处(如:一个文件)以便客户进程读取。注意:使用IPC_PRIVATE只能是创建一个新IPC,且只有服务进程将标识符写到文件中后,客户进程才能获取到。(2) 在公用都文件中定义一个客户进程和服务进.
阅读全文
摘要:一、 Linux进程间通信概述主要分为以下几种:管道(无名管道pipe和命名管道FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)等。主要分为以下4个领域(1)消息传递(管道,FIFO,消息队列)(2)同步(互斥锁,条件变量,读写锁,信号量)(3)共享内存区(匿名共享内存区,有名共享内存区)(4)过程调用(Solaris门,Sun RPC)二、 无名管道PIPE普通Linux都允许重定向,而重定向就是使用的管道。管道是单向的,先进先出,固定大小,一个进程向管道里进行输入,另一个进程从管道里获取输出。一旦数据被读出,则从管道里面删除,其它进程无法再读到该数据。管
阅读全文