自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux—I/O多路转接之poll

poll  poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。  poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。poll函数  

2017-08-16 22:06:02 434 2

原创 Linux—I/O多路转接之epoll

一。什么是epoll       按照man⼿册的说法:是为处理⼤批量句柄⽽作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel2.5.44),它⼏乎具备了之前所说的⼀切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知⽅法。在了解e

2017-08-16 21:06:42 304

原创 模拟实现c库的atoi和itoa

atoi是将数字符号的字符串转化为整形。itoa是将整形转化为字符串。参考代码如下void Reverse(char * start,char* end){ char *l = start; char *r = end; while (l < r) std::swap(*l++,*r--);}char *my_itoa( int value, char *str

2017-08-10 15:48:41 301

原创 删除小写字母字符串中重复字符

具体场景:删除小写字母字符串中重复字符。如果可以,优先删除重复字符中排在比他小字符前面的字符。 比如,输入:bbcacdww;输出:bacdw思路:1.先将字符的出现次数统计好。2.再重新遍历一遍,如果出现次数是一次就直接拷贝到另一个数组,如果次数不是1,就直接进行下一次,然后次数--。参考代码如下:void DeletePar(char a[],i

2017-08-09 17:04:48 592

原创 将N个字符的数组,循环右移K位。时间复杂度O(N)

思路:示例:char a[] = {nihao},若k为12,size为5.1.若k比数组的size大很多,则求模,得到适当大小的k值。k=k%size=2;2.将【0,size-k)区间的值反转。{hinao}3.将【size-k,size)区间的值反转。{hinoa}4.将【0,size)区间的值反转。{aonih}参考代码如下:void Reverse(cha

2017-08-09 15:54:18 450

原创 求一个无序数组的中位数

求一个无序数组的中位数。 如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求:不能使用排序,时间复杂度尽可能高。 提示:考虑堆或者快排思想解决。思路一:利用堆排序的思路将前n/2的元素放进一个大堆里,然后将后续的元素与堆顶比较,如果比堆顶大,则继续比下一个,如果比堆顶小,则与堆顶的值进行交换。

2017-08-09 15:11:46 484

原创 求出大家最喜欢吃的前k种水果(求数组中出现次数最多的)

场景:       本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。void GetFavoriteFruit(const vec

2017-08-08 15:38:20 412

原创 用shell脚本实现希尔排序

代码如下:#!/bin/bashfunction shellsort(){ let size=$# a=($@) echo "原序列为:" ${a[@]} let gap=$size while [ $gap -gt 1 ] do let gap=gap/3+1 #echo "gap=" $gap for(( i=gap; i<size; ++i))

2017-08-08 13:36:27 298

原创 堆排序

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义 :二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆

2017-08-03 23:44:37 208

原创 直接选择排序

直接选择排序 思路 1.在比较的元素中,找到最小的。 2.如果最小的是在0下标处,则无动作,否则,将最小的元素与0下标的元素交换位置。 3.按照1,2的步骤继续找到第二小的放在下标为1的地方…..一直循环到处理完整个数组。以此为例:数组a为:2,5,4,7,1,8,3,0,9,6 ///////////////////////////////////////选择排序/

2017-08-01 21:09:35 174

转载 单例模式——c++实现线程安全的单例类

一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。1、静态成员实例的懒汉模式:cla

2017-07-31 22:42:04 436

原创 将二叉搜索树转换成一个排序的双向链表

【题目具体】        将二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。以如下的二叉树为例:要将此二叉树转化称为如下的双向链表:则步骤可以分以下:1.先找到最左边的结点0作为头结点。2.

2017-07-31 22:17:12 537

原创 由前序遍历和中序遍历重建二叉树

在刚开始见到这个题,只是觉得要用递归的方式来构造,但是实现很久实现不出来,后来多加了两个参数,直接定好了两个数组的遍历范围。【思路】以前序遍历: 1,2,3,4,5,6  【中左右】中序遍历:3,2,4,1,5,6  【左中右】1.由前序遍历可以得到根为1。2.在中序遍历中找到根1。3.建立结点1.4.找到后中序遍历1前面的都是根1的左子树的结点。5.中序遍历根

2017-07-29 22:18:29 769

转载 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数

看到这个题,我的第一思路是:哈希表记录每个元素出现的次数,还有排序,然后取中间的元素。看了其他人的博客,发现还有一种巧妙的方法是一遍扫描法。总结解题思路:1.哈希。2.排序。3.一遍扫描:这个算法的时间复杂度是O(n),另外用了两个辅助变量。     k用于临时存储数组中的数据,j用于存储某个数出现的次数。     开始时k存储数组中的第一个数,j为0,如果

2017-07-22 23:28:11 513

转载 给定一个整数N,求它的阶乘末尾有多少个0呢?

题目:给定一个整数N,那么N的阶乘N!末尾有多少个零呢?末尾有几个零?如果我们从哪些数相乘可以的出10,这个角度来解决这个问题,这就会变成简单。对质因数进行分解由于10=2*5,即每一对2和5就可以产生一个10,如果我们求出N!中,2和5的分别的次方数,假设为X,Z,取决于两个数中最小的那个数,于是有公式,M=min(X,Z),M为零的个数,由于在阶乘中,2出现的概率比5的高,所以公式

2017-07-21 22:26:00 818

转载 整数的二进制表达中有多少个1

题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问题变成

2017-07-20 22:16:56 405

原创 给出入栈顺序,判断元素出栈顺序的合法性

【思路】给出入栈顺序,判断出栈顺序的合法性。大致算法如下:以入栈顺序 1 2 3 4 5,出栈顺序2 1 3 5 4 为例1.先判断p1 p2不相等,1入栈,p1++然后p1和p2相等,p1++,p2++;2.判断栈顶元素1和p2相等,则出栈且p2++;3.p1的值和p2相等,都为三,则p1++,p2++;4.s为空,p2->5和p1->4不相等

2017-07-20 21:58:49 732

原创 实现一个栈Stack,Push、Pop、Min(返回最小值的操作)的时间复杂度为O(1)

【思路】可以用两个栈来实现,s1为存储栈,s2为辅助栈。       入栈时,往s1里入栈,然后若s2为空,则s2也入栈,若s2不为空,则将s1里的栈顶与入栈的数字比较,若栈顶小,则s2不入栈,否则,s2,入栈。       出栈时,s1栈顶和s2栈顶比较,若相等,则s1和s2都出栈,否则,只是s1出栈。【代码如下】template class Sta

2017-07-19 23:20:47 350

原创 用两个栈实现队列,用两个队列实现一个栈

bj

2017-07-18 14:16:37 258

原创 判断两个链表是否相交,若相交,求交点

【不带环】判断两个链表是否相交:     1、把第二个链表连接到第一个后面,判断得到的链表是否有环,有环则相交,并求交点。(判断是否带环并求交点可点击此处到另一篇博客)     2、先遍历第一个链表,记住最后一个节点,再遍历第二个链表,得到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交。求交点时,定义两个计数器,分别记录各个链表的个数,然后让长的向短的对齐,然后一

2017-07-17 15:26:11 517

原创 创建不能被继承的类?只在栈上?只在堆上?

【不被继承】首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。可是这个类的构造函数和析构函数都是私有函数了,怎样才能得到该类的实例呢?可以通过定义静态来创建和释放类

2017-07-17 10:03:13 214

原创 链表是否带环?环长?入口?时间复杂度?

【是否带环】      基本思路:定义两个指针从头结点开始,一个一次向后走一步,一次走两步,循环,若能够走到NULL,则不带环,若走到两个指针相等,则带环。代码如下:pair HasCircle(PNode phead)//判断是否带环,带环的话环的长度,入口。{ assert(phead); //时间复杂度是O(n) PNode pcur =

2017-07-17 09:45:45 343

原创 实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等

第一次看到这个题,哇真是变态,不能用四则运算还要算出来加法,后来仔细想了想,可以用位运算,以下是剑指offer上的解决方法。        以5+14为例,5——0101,14——1110。要求得这个加法的结果,其实步骤有以下几步:1.只加数字,不进位,则可得结果 11——1011;(两个1加起来为10,但不算进位的话就为0)2.做进位,可以得到第3位时有进位,进位的值时100

2017-07-15 16:15:21 1493

原创 linux—I/O多路转接之select

携带方便

2017-07-08 23:31:07 258

原创 linux—dup和dup2重定向文件描述符

【dup】

2017-07-03 15:01:24 553

原创 linux下的eval命令

1. eval command-line其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:pipe="|"eval ls $pipe wc -lshell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。如果变量中包含任何

2017-07-03 10:49:46 623

转载 进程线程池

通过动态创建子进程(或者子线程)来实现并发服务器的。这样做有如下缺点:1、 动态创建进程(或线程)是比较耗费时间的,这将导致较慢的客户响应。2、动态创建的子进程(或子线程)通常只用来为一个客户服务(除非我们做特殊处理),这将导致系统上产生大量的细微进程(或者线程)。进程(或者线程)间的切换消费大量CPU时间。3、动态创建的子进程是当前进程的完整映像。当前进程必须谨慎地管理其分配的文件描

2017-06-24 23:50:46 177

原创 UDP_server服务器和用户空间下如何实现可靠性

【server】server.cclient.c【UDP用户空间如何保证可靠性】       UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。       传输层无法保证数据的可靠传输,只能通过应用层

2017-06-24 23:39:48 366

原创 TCP下的套接字编程

【单进程】【多进程】在单进程的基础上加上【多线程】在单进程的基础上加上线程创建如下当服务器先于客户端退出后,若还是用之前的那个端口再次启动时会出现bind 失败,为什么?怎么解决?为什么?       TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态

2017-06-24 23:09:17 195

转载 TCP的三次握手与四次挥手

为什么需要“三次握手”            在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。这两种不用的表述其实阐明的是同一个问题。            谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求

2017-06-21 17:27:16 160

转载 TCP中的四种定时器

TCP的四种定时器TCP使用四种定时器(Timer,也称为“计时器”):重传计时器:Retransmission Timer坚持计时器:Persistent Timer保活计时器:Keeplive Timer时间等待计时器:Time_Wait Timer。 (1)重传计时器:重传定时器:为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间。当TCP发送报

2017-06-20 14:50:12 339

原创 TCP协议包头中的URG和PSH

【URG】紧急数据的起始点=序号;紧急数据的终止点=序号+紧急指针;(综上,紧急指针就是记录紧急数据的字节数,紧急指针永远为正数)1)在紧急数据后面的数据为普通数据,需要按序缓存2)窗口为0也可以发送紧急数据3)紧急数据都处理完成后,tcp就告诉进程恢复到正常操作例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消程序的运行

2017-06-20 14:47:02 389

原创 网络——端口号

【个数】       一个IP地址的端口 可以有65536(即:256×256)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(256×256)。【分类】第一类公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。第二类注册端口(Regi

2017-06-16 17:24:11 345

转载 常见的代理服务器

https://wenku.baidu.com/view/2199ace226fff705cc170aeb.html

2017-06-14 23:26:35 621

转载 网络——代理服务器和NAT技术

【代理服务器】  所谓“代理”,就是代而劳之的意思。代理服务器就是代理网络用户去取得网络信息,形象的说:它是网络信息的中转站,使得一个网络终端和另一个网络终端不直接进行相连,代理网络用户去取得信息。主要工作在OSI的会话层中。  一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接或者获得目标服务器的指定资源(如文件)。在后

2017-06-14 23:11:34 464

原创 CRC校验-arp脚本

【CRC校验】【定义】       CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。、【校验码位数】CRC校验码位数 = 生成多项式位数 - 1。注

2017-06-10 18:07:59 419

原创 linux_守护进程

【定义】守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。       Linux系统启动时会启动很多系统服务进程,这些系统服务没有控制终端,不能直接和用户交互。其他进程都是在用户登录或运行

2017-06-10 15:35:33 194

原创 Linux_crond和crontab的用法

crondcrond的概念和crontab是不可分割的。crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。而crond正是它的守护进程。(1)crontab 需要启动一个服务crond才行,crond服务通过crontab命令实现。(2)cr

2017-06-09 12:12:29 1002

原创 linux下使用gdb调试多进程多线程

多进程 多线程 gdb

2017-06-07 23:38:59 498

原创 B树详解

B树的引入,定义,插入,代码

2017-06-04 13:58:24 829

空空如也

空空如也

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

TA关注的人

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