自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Roykuang的专栏

更像是一个技术笔记

  • 博客(35)
  • 收藏
  • 关注

转载 关于Time_Wait的几个问题

time_wait是个常问的问题,tcp网络编程中最不容易理解的也是它的time_wait状态,这也说明了tcp/ip四次挥手中time_wait状态的重要性。 下面通过4个问题来描述它问题1.time_wait状态是什么2.为什么会有time_wait状态3.哪一方会有time_wait状态4.如何避免time_wait状态占用资源

2016-09-23 22:56:01 545

原创 网络编程之Reactor 模式

我理解Reactor基本的架构是 epoll+线程池。这篇博文主要从以下几个方面进行阐述:(1)reactor模式的一个介绍:(只要是我的理解)(2)关于线程池的说明。(3)如何将epoll + 池结合起来实现一个群聊 一. reactor 模式:从我个人的理解角度,所谓的reactor模式类似于:场景:银行, 和三个业务工作人员 ,一个接待

2016-09-18 18:30:02 798

原创 同步和异步,阻塞和非阻塞

刚开始学习网络编程的时候,就会碰到这几个概念。将道理这几个概念真的很容易让人一脸懵逼。我还是把之前的理解整理一下吧,免得以后碰到这个又会一脸懵逼。先摘录一段维基的解释:维基百科,自由的百科全书异步方法调用或异步方法模式是(多线程)面向对象程序设计中用于异步调用对象的潜在的长期运行方法的一种设计模式[1]。 它等价于Allan Verm

2016-09-18 17:46:05 426

原创 C++中vector<> resize()和reserve区别

1 reserve()首先,从字面意思理解,reserve的意思是:预留。那么这个函数是如何控制空间的呢?vectorint> vec(10);cout << vec.size() << endl;cout << vec.capacity() << endl;vec.reserve(5);cout << vec.size() << endl;cout << vec.ca

2016-09-17 14:53:44 624

原创 muduo网络库源码分析-定时器

首先,我们先要明白为什么需要设计这样一个定时器类?在开发Linux网络程序时,通常需要维护多个定时器,如维护客户端心跳时间、检查多个数据包的超时重传等。如果采用Linux的SIGALARM信号实现,则会带来较大的系统开销,且不便于管理。Muduo 的 TimerQueue 采用了最简单的实现(链表)来管理定时器,它的效率比不上常见的 binary heap 的做法,如果程序

2016-09-14 02:05:23 645

原创 进程间通信:管道和socketpair的区别

最近在总结之前做过的FTP服务器小项目时,突然想到服务进程和nobody进程之间的通信方式为什么不能采用其他方式时。查了点资料,总结就是socketpair和管道形式非常的类似,唯一的不同就是sockerpair支持全双工,这样在进程之间发送数据的时候变得非常的简单方便。管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。socketpair直接就可以实现全双工socke

2016-09-13 15:44:51 3306

原创 二叉搜索树与双向链表

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:1)首先说一个很简单的思路,就是先中序遍历,将序列存入数组,然后再一个个插入双向链表。额,空间复杂度太高。但是确实好简单代码就不贴了。2)采用递归的方法。就是首先分别将左右子树变成双向链表,然后再将两个链表合并。时间复杂降低了,空间

2016-09-10 12:16:54 461

原创 一道回溯的题

吐个槽,一道典型的回溯题目竟然花了快三个小时....啊啊啊 记录一下矩阵中的路径题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e

2016-09-09 14:42:54 624

转载 最近公共祖先问题LCA

自己想的一种思路:从根节点开始,分别找到AB两个点的路径。然后保存下来,从保存的路径开始,根节点开始遍历,找到第一个不相同的节点,那么他们的前一个节点就是最近公共祖先了。问题描述求有根树的任意两个节点的最近公共祖先。分析与解法解答这个问题之前,咱们得先搞清楚到底什么是最近公共祖先。最近公共祖先简称LCA(Lowest Common Ancestor),所谓L

2016-09-08 23:09:46 1002

原创 求数组中唯一重复的元素

在网上看到一个这样的题:一个数组中含有1001个元素,存放了1,2,3...1000和一个重复的数。只有唯一一个数是重复的,其它均只出现一次。要求设计一个算法找出这个重复的数,要求:每个数组元素只能访问一次,不用辅助存储空间。解法一:最简单的方法是,先求出1...1000的和(用公式:n(n+1)/2)sum1,然后求出arr[0]...arr[1000]的和sum2,(sum2-

2016-09-08 22:52:08 591

原创 回溯法-求二叉树中路径和为某一定值所有路径

题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。很明显改用回溯法:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val

2016-09-07 23:04:52 1165

原创 按之字形顺序打印二叉树

层次遍历后结果之按字输出其实我们可以借鉴层次遍历时候的思路, 参见剑指Offer–060-把二叉树打印成多行, 我们把层次遍历的结果保存在vector中每一层保存在一个vector中, 那么我们输出的时候就可以进行调整, 按照之字形输出即可 for(int i = 0; i <ans.size( ); i++) { if(i &

2016-09-07 22:44:00 297

转载 链表相交与环问题

转载:1、 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。 示意图如下:如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相

2016-09-07 21:47:04 299

原创 二叉搜索书的第K个节点

二叉搜索书的第K个节点题目描述给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。题目一看就是关于二叉搜索书的中序遍历。正好可以练习一下中序遍历的非递归实现。/*struct TreeNode { int val; struct TreeNode

2016-09-07 17:01:42 501

原创 非递归遍历二叉树的方法

三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担。而我们常接触到那三种非递归遍历方法,除了都使用栈,具体实现各有差异,导致了理解的模糊。本文给出了一种统一的三大非递归遍历的实现思想。三种递归遍历//前序遍历void preorder(TreeNode *root, vectorint> &path){ if(root !=

2016-09-07 16:19:20 380

原创 统计数组的逆序对

题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。题目代码思路:这个最简单的当然是直接统计了,算法时间复杂度为n^2,冒泡排序都可以。如果想进一步减少时间复杂度的话,可以考虑用递归的方法,比如使用归并排序。下面贴代码。int merge(int A[], int start,

2016-09-06 16:54:44 793

原创 把数组排成最小的数

题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路就是定义一种比较运算,如3>32,就是位数如果不够就用最后一位去填充,一直比较完每一位为止。然后就是将vector里所有的元素按照这个大小顺序重新排列一次,依次输入stringstream,最后将

2016-09-06 10:58:04 427

原创 数组中只出现一次得两个数

题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路就是使用异或,但是与在成对出现的数字中查找一个单独的数字不同的是需要利用异或结果的最低位为1的flag将数组中的数字分为两类,一类是与flag按位与为0,另一类为不为0,这样再分别异或一次就能够找出这两个数。很是巧妙。其中有一个语法上容易忽略的坑:==的优先级比&高,所以&时

2016-09-06 01:12:44 390

原创 返回min元素的栈

题目:设计一个栈,使得PUSH、POP以及GetMin(获取栈中最小元素)能够在常数时间内完成。分析:很刚开始很容易想到一个方法,那就是额外建立一个最小堆保存所有元素,这样每次获取最小元素只需要O(1)的时间。但是这样的话,PUSH和POP操作就需要O(lgn)的时间了(假定栈中元素个数为n),不符合题目的要求。那么用1个辅助栈如何呢?

2016-09-05 23:59:58 356

原创 二维递增数组的查找

题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。最直接简单的算法当然是直接查找了,但是这里提供一种算法。 考虑右上角的元素,比较和目标元素的大小,依次递增xy值,直至查找到该元素为止.class Solution {public: bool Fi

2016-09-05 18:19:19 689

原创 最长公共子串-简单的DP

题目描述查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 输入描述:输入两个字符串输出描述:返回重复出现的字符输入例子:abcdefghijklmnopabcsafjklmnopqrstuvw输出例子:jklmnop很明显就是用DP来做。递推公式也很简单,在输出的时候用二维数组保存最长子串的大小,返回该子串的终止位置,

2016-09-05 17:00:22 748

原创 字符串的编辑距离

题目:对于一个字符串a可以通过增加一个字符、删除一个字符、修改一个字符,将字符串a变成字符串b,例如a= abcddefgb = abcefg可以通过a字符串删除两个dd得到b字符串,也可以通过b字符串增加dd编程a字符串,从上面的分析可以知道,增加和删除的代价必须是相同的,这样a字符串变成b字符串的代价和b字符串变成a字符串的代价才会是相同的,否这可能产生代价不对

2016-09-05 16:50:07 366

原创 new一个二维数组的几种方法

定义二维数组char array[x][y]; 1.只定义个一维的就可以了 char *array; array = new char[x*y]; 访问的时候*(array+i*y+j)表示array[i][j] 2.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;iarray1[i] = new c

2016-09-05 16:47:50 4548

原创 关于getline输入的一个小问题

今天做OJ的时候,遇到连续输入一行和接着输入单个字符的情况,然而第二次循环的时候却会出问题,大概分析了下,应该是缓冲区出问题了。所以加上 char s; string str; while (getline(cin, str)) { cin >> s; cout << str.c_str()<<" "<<s<<endl; cin.ignore(); }则不会错误.随手记

2016-09-05 15:49:12 490

原创 哈希表总结

哈希表的概念        哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就做散列函数,存放记录的数组叫做散列表。散列存储的基本思路        以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块

2016-09-03 11:55:26 403

原创 堆排序

堆排序是另外一种常用的递归排序。因为堆排序有着优秀的排序性能,所以在软件设计中也经常使用。堆排序有着属于自己的特殊性质,和二叉平衡树基本是一致的。打一个比方说,处于大堆中的每一个数据都必须满足这样一个特性:(1)每一个array[n] 不小于array[2*n](2)每一个array[n]不小于array[2 * n + 1]构建这样一个堆只是基础,后面我们需要每次从堆的顶

2016-09-03 10:37:35 293

转载 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

转自:BYVoid[非基于比较的排序]在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销。排序算法有非常多种,如我们最常用的快速排序和堆排序等算法,这些算法需要对序列中的数据进行比较,因为被称为基于比较的排序。基于比较的排序算法是不能突破O(NlogN)的。简单证明如下:N个数有N!个可能的排列

2016-09-02 21:15:59 451

原创 进程间通信-共享内存

一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到

2016-09-02 14:25:44 769

原创 进程间通信-信号量

一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量,程序对其

2016-09-02 14:10:21 572

原创 进程间通信-消息队列

下面来说说如何用不用管道来进行进程间的通信,消息队列与命名管道有很多相似之处。一、什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。Linux用宏MSGMAX

2016-09-02 14:07:30 582

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

之前看过如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。一、什么是命名管道命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字

2016-09-02 14:05:16 538

原创 Linux最常用的20个命令

1、cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。如:[plain] view plain copy print?cd /root/Docements # 切换到目录/root/Docements  cd ./path          # 切换

2016-09-02 10:29:27 1783

原创 Linux守护进程创建

概述   守护进程是在需要在后台长期运行不受终端控制的进程,通常情况下守护进程在系统启动时自动运行,在服务器关闭的时候自动关闭;守护进程的名称通常以d结尾,比如sshd、xinetd、crond、atd等。守护进程编程规则    调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0)   调用fork(),创建新进程,它会是将来的守护进程 

2016-09-01 13:30:51 527

转载 Linux系统编程文件IO

转载:Linux系统编程文件IO今天继续学习文件与io,主要是学习文件共享及文件、复制文件描述符,有点抽象,主要是概念上的理解,但是很重要,下面一一来分解:文件共享:回顾一下,在linux系统调用中,是通过文件描述符来访问文件的,文件描述符是一个非负的整数,这是站在用户的观点来看的,实际上在linux内核上是有一定的数据结构来表示文件描述符的,下面就从三方面来看图分析一

2016-09-01 10:41:57 556

转载 Linux文件描述符表和文件的关系

转载1. 概述    在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此

2016-09-01 10:37:44 711

空空如也

空空如也

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

TA关注的人

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