- 博客(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
865
原创 字符串中字符的所有组合(递归方式)
思路:根据递归的特性,确定产生的字符组合顺序例:字符串“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
2044
1
原创 字符串中字符的所有组合(组合中的先后顺序不考虑)
思路:在字符串中没有相同的字符时,可采用位运算,得到所有的字符组合。 根据字符串的长度,可得知字符组合的所有方式。例:求出字符串“abc”字符的所有组合方式? 分析: (1)长度等于3 (2)即可用3个二进制位表示这三个字符 (3)3个二进制位共有7种组合方式(0
2016-07-29 13:21:57
1728
原创 输出字符串所有的子串
思路:(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
2835
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
700
原创 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
591
原创 STL空间配置器
STL空间配置器分为第一级配置器与第二级配置器,主要用来对内存的申请与释放。第一级配置器:调用的是malloc/free,并有 new-handle 机制第二级配置器:由自由链表及内存池组成 自由链表:一个存储16个空闲块列表表头的数组free_list; 内存池 :起始地址的指针st
2016-07-18 22:38:33
442
原创 红黑树
红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡红黑树是满足下面红黑性质的二叉搜索树:(1)每个节点,不是红色就是黑色的(2)根节点是黑色的(3)如果一个节点是红色的,则它的两个子节点是黑色的(没有连续的红节点)(4)对每个节点
2016-07-18 00:36:47
641
1
原创 二叉平衡搜索树——AVL树
AVL树:保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。AVL树的性质:(1)左子树和右子树的高度之差的绝对值不超过1 (2)树中的每个左子树和右子树都是AVL树。
2016-07-18 00:13:18
543
原创 二叉搜索树
二叉搜索树的性质:(1)每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。(2)左子树上所有节点的关键码(key)都小于根节点的关键码(key)。(3)右子树上所有节点的关键码(key)都大于根节点的关键码(key)。(4)左右子树都是二叉搜索树。 缺陷:在特殊情况下,会退化成单链表的形式,若还以搜索树来看待问题,效率就会很低
2016-07-17 23:41:02
468
原创 文件压缩与解压
文件压缩与解压思想: (1)统计字符出现次数,结合最小堆的性质生成哈夫曼树; (2)对叶节点进行编码,结点左边编0,右边编1; (3)读取文件,用哈夫曼编码代替字符产生新的字符,即压缩; (4)读取压缩文件,进行哈夫曼编码的解读产生相应字符,即解压;例如,对以下数据生成哈夫曼树,以及产生相应的哈夫曼编码://自己写的最小堆(因为在加强巩固,所以没用STL里的)
2016-07-17 23:21:43
1506
原创 进程组、作业、会话
********************************************************************************************************************************************************一、进程组进程组:一个或多个进程的集合。每个进程都可以有一个组长进程;组长进程的
2016-06-11 13:55:36
554
原创 读写锁
说读写锁之前,先解释一下什么是自旋锁?自旋锁就是,若P不到资源,它不会被挂起,而是一直去看是否有资源就绪。读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写
2016-06-10 18:31:55
432
原创 线程的创建、等待与终止
LWP:轻量级进程,因为Linux下的线程是用进程模拟的,所以它比线程大一点,比进程小一点在Linux上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。********************************************************************************************
2016-06-08 14:36:59
583
原创 进程间通信---管道
为什么进程间需要通信?1、数据传输 一个进程需要将它的数据发送给另一个进程。2、资源共享 多个进程之间共享同样的资源。3、通知事件 一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。4、进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的
2016-06-08 13:03:25
478
原创 进程间通信----命名管道
命名管道是一个设备文件,即使不存在血缘关系,只要可以访问该路径,就可以实现进程间的通信*********************************************************************************************************************************一、创建管道 (mkfifo)(1)创建管道
2016-06-08 12:21:16
516
原创 进程等待与终止
僵尸进程:一个子进程在其父进程没有调用 wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并
2016-06-08 11:59:17
635
原创 进程创建方式与exec函数簇
进程的两个基本元素:1、程序代码;2、与代码相关联的数据集**********************************************************************************************************一、要创建一个子进程可以执行fork()系统调用。 返回值:成功的话,有
2016-06-08 11:30:13
639
原创 简易HTTP服务器的实现
基于HTTP协议实现简易服务器完成提交静态网页和CGI的功能,当方法为POST时,执行CGI功能;当方法为GET时,根据请求是否具有可执行权限,判断服务器应执行哪种功能。CGI的功能是它可以在服务器上执行相关的代码对数据进行处理,最后再将执行结果返回给浏览器。对于POST方法,要完成CGI功能,需要先从HTTP的请求报头中的消息内容里拿到浏览器的请求,经过CGI处理,再将处理结果交给浏览器
2016-04-09 11:57:58
603
原创 不用加减乘除做加法
对于num1+num2可分为三步完成:(1)对num1与num2做二进制相加,不计进位(这一步可用异或实现);(2)记录进位(可用位与运算,因为相同位都为1,才会向前产生进位;即得到进位的方法为(num1&num2)(3)把(1)与(2)的结果相加,方法同上,直到不再产生进位,即可得到结果;由于不能使用加减乘除,那么我们可以试着考虑位操作对两数进行运算:如:num1=5,num
2016-04-02 17:34:55
540
原创 缓冲方式、文件描述符及文件操作
**********************************************************************************************************************************************三种缓冲方式:进程退出时,要刷新缓冲区以清空缓冲区 ,这时就相当于修改缓冲区,这时父子进程会各有一份缓冲区里
2016-04-01 22:45:34
1431
原创 竞态条件与sigsuspend函数(四)
*******************************************************************************************************************************************************一、可重入函数:拿单链表的insert函数来举例(不带头结点的),单链表的insert完成
2016-03-31 14:27:44
625
原创 信号捕捉(三)
信号捕捉 :如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数的种种行为。/*************************************************************************************************************/一、sigaction 函数(功能与 signal()函数功能一样,都是捕捉信号
2016-03-31 14:22:43
559
原创 信号未决与阻塞(二)
/**************************************************************************************************************/一、几个基本的概念信号递达(Delivery) :实际执行信号的处理动作;信号未决(Pending) :信号从产生到递达之间的状态;进程可以选择阻塞(Block
2016-03-31 11:57:02
1138
原创 信号的产生以及处理方式(一)
/*************************************************************************************************************/为了理解信号,先从我们最熟悉的场景说起:1.用户输入命令,在Shell下启动一个前台进程。2.用户按下Ctrl-C,这个键盘输入产生一个硬件中
2016-03-31 11:45:26
1810
原创 动态内存管理
//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
536
原创 大数运算
在进行大数运算的时候,因考虑到内存问题,所以直接采用算术运算的逻辑对数据进行处理,必定会导致结果的溢出,而无法保证所得结果的正确性。为了避免上述情况,在数据运算过程中,有时需采用字符串模拟数据的运算,从而提高结果的可靠性。//Bigdata.h#ifndef BIG_DATA_H#define BIG_DATA_H#include using namespace std;#i
2016-03-31 09:37:08
827
原创 哈希冲突之散列法
#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
671
原创 哈希冲突之开链法
#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
1660
原创 把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行,例如: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
500
原创 计数排序
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
365
原创 基数排序
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
450
原创 归并排序
//合并两个有序数组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
415
原创 快速排序
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
447
原创 堆排序
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
430
原创 冒泡排序
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
352
原创 选择排序
思想:在一次遍历中同时选出最大数与最小数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
333
原创 希尔排序
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。分
2015-12-12 15:50:01
363
原创 直接插入排序
设数组为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
349
原创 【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
919
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人