自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 找出字符串中连续出现次数最多的子串

pair FindSub(const string& str){ vectorv; int count = 1; int maxcount = 1; string ret; int len = str.length(); int i = 0; for (int i = 0; i < len; i++) { v.push_back(str.substr(i, len - i))

2016-07-29 16:46:40 804

原创 字符串中字符的所有组合(递归方式)

思路:根据递归的特性,确定产生的字符组合顺序例:字符串“abc”的字符组合产生的顺序为: a、b、c、ab、ac、bc、abcvoid Print(vector& v){ for (int i = 0; i<v.size(); i++) { cout << v[i]; } cout << endl;}void _Combination(char* str, int

2016-07-29 13:35:42 1973 1

原创 字符串中字符的所有组合(组合中的先后顺序不考虑)

思路:在字符串中没有相同的字符时,可采用位运算,得到所有的字符组合。                  根据字符串的长度,可得知字符组合的所有方式。例:求出字符串“abc”字符的所有组合方式?      分析: (1)长度等于3                  (2)即可用3个二进制位表示这三个字符                  (3)3个二进制位共有7种组合方式(0

2016-07-29 13:21:57 1635

原创 输出字符串所有的子串

思路:(1)通过字符串的总长度,可知它的所有子串的长度分布范围            (2)按子串长度分类,依次找出每个长度段的所有子串关键函数:substrvoid FindStr(const string&str){ string sub; int len = str.length(); for (int i = 1; i <= len; i++)//用i控制子串的长度 {

2016-07-29 13:03:33 2646 1

原创 字符串中某一子串出现的次数

思路:遍历整个字符串,调用 strncmp 函数判断是否含有子串int Count(const char*src, const char*dst){ int count = 0; int slen = strlen(src);//源字符串 int dlen = strlen(dst);//要查找的子字符串 if (slen < dlen) return 0; for (int

2016-07-29 12:49:15 652

原创 B树

定义:一棵M(M>2)阶的平衡搜索树性质:以下出现的 M/2 均表示向上取整     (1)根节点至少有两个孩子     (2)每个非根节点有[M/2,M]个孩子     (3)每个非根节点有[M/2,M-1]个关键字,并且以升序排列     (4)key[i]和key[i+1]之间的孩子节点的值介于key[i]、key[i+1]之间     (5)所有的叶子节点都在同

2016-07-19 18:05:03 532

原创 STL空间配置器

STL空间配置器分为第一级配置器与第二级配置器,主要用来对内存的申请与释放。第一级配置器:调用的是malloc/free,并有 new-handle 机制第二级配置器:由自由链表及内存池组成                           自由链表:一个存储16个空闲块列表表头的数组free_list;                      内存池 :起始地址的指针st

2016-07-18 22:38:33 392

原创 红黑树

红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡红黑树是满足下面红黑性质的二叉搜索树:(1)每个节点,不是红色就是黑色的(2)根节点是黑色的(3)如果一个节点是红色的,则它的两个子节点是黑色的(没有连续的红节点)(4)对每个节点

2016-07-18 00:36:47 575 1

原创 二叉平衡搜索树——AVL树

AVL树:保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。AVL树的性质:(1)左子树和右子树的高度之差的绝对值不超过1                        (2)树中的每个左子树和右子树都是AVL树。

2016-07-18 00:13:18 491

原创 二叉搜索树

二叉搜索树的性质:(1)每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。(2)左子树上所有节点的关键码(key)都小于根节点的关键码(key)。(3)右子树上所有节点的关键码(key)都大于根节点的关键码(key)。(4)左右子树都是二叉搜索树。           缺陷:在特殊情况下,会退化成单链表的形式,若还以搜索树来看待问题,效率就会很低

2016-07-17 23:41:02 420

原创 文件压缩与解压

文件压缩与解压思想: (1)统计字符出现次数,结合最小堆的性质生成哈夫曼树; (2)对叶节点进行编码,结点左边编0,右边编1; (3)读取文件,用哈夫曼编码代替字符产生新的字符,即压缩; (4)读取压缩文件,进行哈夫曼编码的解读产生相应字符,即解压;例如,对以下数据生成哈夫曼树,以及产生相应的哈夫曼编码://自己写的最小堆(因为在加强巩固,所以没用STL里的)

2016-07-17 23:21:43 1456

原创 进程组、作业、会话

********************************************************************************************************************************************************一、进程组进程组:一个或多个进程的集合。每个进程都可以有一个组长进程;组长进程的

2016-06-11 13:55:36 505

原创 读写锁

说读写锁之前,先解释一下什么是自旋锁?自旋锁就是,若P不到资源,它不会被挂起,而是一直去看是否有资源就绪。读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写

2016-06-10 18:31:55 383

原创 线程的创建、等待与终止

LWP:轻量级进程,因为Linux下的线程是用进程模拟的,所以它比线程大一点,比进程小一点在Linux上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。********************************************************************************************

2016-06-08 14:36:59 530

原创 进程间通信---管道

为什么进程间需要通信?1、数据传输     一个进程需要将它的数据发送给另一个进程。2、资源共享     多个进程之间共享同样的资源。3、通知事件     一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。4、进程控制     有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的

2016-06-08 13:03:25 431

原创 进程间通信----命名管道

命名管道是一个设备文件,即使不存在血缘关系,只要可以访问该路径,就可以实现进程间的通信*********************************************************************************************************************************一、创建管道 (mkfifo)(1)创建管道

2016-06-08 12:21:16 461

原创 进程等待与终止

僵尸进程:一个子进程在其父进程没有调用 wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并

2016-06-08 11:59:17 574

原创 进程创建方式与exec函数簇

进程的两个基本元素:1、程序代码;2、与代码相关联的数据集**********************************************************************************************************一、要创建一个子进程可以执行fork()系统调用。                  返回值:成功的话,有

2016-06-08 11:30:13 583

原创 简易HTTP服务器的实现

基于HTTP协议实现简易服务器完成提交静态网页和CGI的功能,当方法为POST时,执行CGI功能;当方法为GET时,根据请求是否具有可执行权限,判断服务器应执行哪种功能。CGI的功能是它可以在服务器上执行相关的代码对数据进行处理,最后再将执行结果返回给浏览器。对于POST方法,要完成CGI功能,需要先从HTTP的请求报头中的消息内容里拿到浏览器的请求,经过CGI处理,再将处理结果交给浏览器

2016-04-09 11:57:58 557

原创 不用加减乘除做加法

对于num1+num2可分为三步完成:(1)对num1与num2做二进制相加,不计进位(这一步可用异或实现);(2)记录进位(可用位与运算,因为相同位都为1,才会向前产生进位;即得到进位的方法为(num1&num2)(3)把(1)与(2)的结果相加,方法同上,直到不再产生进位,即可得到结果;由于不能使用加减乘除,那么我们可以试着考虑位操作对两数进行运算:如:num1=5,num

2016-04-02 17:34:55 481

原创 缓冲方式、文件描述符及文件操作

**********************************************************************************************************************************************三种缓冲方式:进程退出时,要刷新缓冲区以清空缓冲区 ,这时就相当于修改缓冲区,这时父子进程会各有一份缓冲区里

2016-04-01 22:45:34 1367

原创 竞态条件与sigsuspend函数(四)

*******************************************************************************************************************************************************一、可重入函数:拿单链表的insert函数来举例(不带头结点的),单链表的insert完成

2016-03-31 14:27:44 545

原创 信号捕捉(三)

信号捕捉 :如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数的种种行为。/*************************************************************************************************************/一、sigaction 函数(功能与 signal()函数功能一样,都是捕捉信号

2016-03-31 14:22:43 486

原创 信号未决与阻塞(二)

/**************************************************************************************************************/一、几个基本的概念信号递达(Delivery) :实际执行信号的处理动作;信号未决(Pending) :信号从产生到递达之间的状态;进程可以选择阻塞(Block

2016-03-31 11:57:02 1084

原创 信号的产生以及处理方式(一)

/*************************************************************************************************************/为了理解信号,先从我们最熟悉的场景说起:1.用户输入命令,在Shell下启动一个前台进程。2.用户按下Ctrl-C,这个键盘输入产生一个硬件中

2016-03-31 11:45:26 1721

原创 动态内存管理

//LIst.hpp#ifndef _LIST_H_#define _LIST_H_#includeusing namespace std;templatestruct Node{ T _value; Node* _next; Node(const T& value) : _value(value) , _next(NULL) {}};templatec

2016-03-31 11:02:47 487

原创 大数运算

在进行大数运算的时候,因考虑到内存问题,所以直接采用算术运算的逻辑对数据进行处理,必定会导致结果的溢出,而无法保证所得结果的正确性。为了避免上述情况,在数据运算过程中,有时需采用字符串模拟数据的运算,从而提高结果的可靠性。//Bigdata.h#ifndef BIG_DATA_H#define BIG_DATA_H#include using namespace std;#i

2016-03-31 09:37:08 784

原创 哈希冲突之散列法

#include#includeusing namespace std;enum State{ EMPTY, DELETE, EXIST,};class HashTable{public: HashTable(int capacity) { v.reserve(capacity); v.assign(capacity, 0); s.reserve(capaci

2016-03-17 15:12:52 623

原创 哈希冲突之开链法

#include#include#includeusing namespace std;templatestruct Node{ K _key; V _value; Node*_next; Node(const K& key, const V& value) :_key(key) , _value(value) , _next(NULL) {}};templa

2016-03-17 15:09:14 1595

原创 把二叉树打印成多行

题目描述:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行,例如:void Print(){ if (_root == NULL) return; queueq; q.push(_root); int NextLevel = 0; //下一行结点的个数 int CurLevel = 1; //当前行结点的个数 while (!q.empty())

2016-03-08 21:37:12 448

原创 计数排序

void Count_sort(int a[], int size ){ int min = a [0]; int max = a [0]; for (int i = 1; i < size; i++) { if (a [i]>max)

2016-01-03 18:27:58 328

原创 基数排序

void Radix_sort(int a[], int size ){ int *count = new int[10]; int *bucket = new int[size]; int radix = 1; for (int i = 1; i<=get_bit(a,10); i++)

2016-01-03 18:26:37 412

原创 归并排序

//合并两个有序数组void Merge(int a[], int left, int mid, int right){ assert(a); int* tmp = new int[right - left + 1](); int index = 0; int begin1 = left, end1 = mid; int begin2 = mid + 1, end2 = right

2015-12-13 20:48:07 379

原创 快速排序

int GetMid(int a[], int left, int right)//三数取中{ int mid = left + (right - left) / 2; if (a[left] <a[right]) { if (a[mid] < a[left]) { return left; } else { if (a[mid]>a[right])

2015-12-13 20:37:49 405

原创 堆排序

void AdjustDown(int a[], int root, int size) //调整堆{ int left = root * 2 + 1; int right = left + 1; int key = left; while (left < size) { if (righta[right]) { key = right; } if (a[key

2015-12-13 20:35:15 389

原创 冒泡排序

void BubbleSort(int a[], int size){ assert(a); int i = size - 1; int j = 0; while (i) { int exchange = 0; for (j = 0; j < i; j++) { if (a[j]>a[j + 1]) { swap(a[j], a[j + 1]);

2015-12-13 20:31:42 312

原创 选择排序

思想:在一次遍历中同时选出最大数与最小数void SelectSort(int a[], int size){ assert(a); int left = 0; int right = size - 1; while (left < right) { int min = left; int max = right; for (int i = min; i <= max;

2015-12-13 20:30:04 290

原创 希尔排序

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。分

2015-12-12 15:50:01 324

原创 直接插入排序

设数组为a[0…n-1]。1.      初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12.      将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。3.      i++并重复第二步直到i==n-1。排序完成。void InsertSort(int a[], int size){ int i, j; for (i

2015-12-12 14:34:30 307

原创 【C++】位图

#includeusing namespace std;class BitMap{public: BitMap(size_t size) { _capacity = size / 32 + 1; _array = new int[_capacity]; memset(_array, 0, sizeof(int)*_capacity); } void SetBit(int

2015-11-30 15:29:24 862

空空如也

空空如也

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

TA关注的人

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