自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 webbench源码剖析

Webbench是有名网站压力测试工具,它是由Lionbridge公司开发 (http://www.lionbridge.com) Webbench能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webbench的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,J

2017-08-09 11:13:05 641

原创 实现itoa()和atoi()

atoi():将字符串转换为整型值 实现代码:enum Status{valid,unvalid};int status = valid;//全局变量标记输入是否非法long long _AtoI(const char* str, bool minus){long long num = 0;while (*str != '\0'){//输入在0-9之间if (*str >

2017-08-08 13:54:39 756

原创 实现布隆过滤器

结合了位图和Hash表两者的优点,位图的优点是节省空间,但是只能处理整型值一类的问题,无法处理字符串一类的问题,而Hash表却恰巧解决了位图无法解决的问题,然而Hash太浪费空间。针对这个问题,布隆提出了一种基于二进制向量和一系列随机函数的数据结构-布隆过滤器。它的空间利用率和时间效率是很多算法无法企及的,但是它也有一些缺点,就是会有一定的误判率并且不支持删除操作。 实现代码:#include"c

2017-08-07 21:29:01 851

原创 shell脚本实现希尔排序

#!/bin/bashecho "please input a number list"read -a arrsize=${#arr[@]}gap=$sizewhile [ $gap -gt 1 ]do ((gap=(gap/3)+1)) for((i=gap;i<size;i+=gap)) do let temp=${arr[$i]}

2017-08-07 21:20:43 596

原创 位图的实现以及应用

所谓位图就是用一个bit位来标记某个元素对应的value,而key即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间。 32位机器上,一个整形,比如int a;在内存中占32bit,可以用对应的32个bit位来表示十进制的0-31个数,bitmap算法利用这种思想处理大量数据的排序与查询 优点:效率高,不许进行比较和移位,占用内存少,比如N=10000000;只需占用内存

2017-08-07 21:16:25 1637

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

将N个字符的数组,循环右移K位。时间复杂度O(N) 比如:str[]=”abcde123”,右移3位 1、旋转abcde->edcba 2、旋转123->321 3、整体旋转abcde123->123abcdevoid reverse(char *str, int left, int right){ while (left<right) { char tmp

2017-08-05 15:43:23 1205

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

求一个无序数组的中位数,如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求:不能使用排序,时间复杂度尽可能低。 解决方案一:采用堆排序思想 1、将前(n+1)/2个元素调整为一个小顶堆 2、对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,取下一个元素。如果大于堆顶,用该元素取代堆顶,调整堆,取下一元素

2017-08-05 14:34:09 1720 1

原创 int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N)

int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) 根据时间复杂度要求,可以用鸽巢排序。所谓鸽巢排序, 也被称作基数分类, 是一种时间复杂度为(Θ(n))且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用. 算法分析:

2017-08-05 10:25:25 1330

原创 归并排序算法(递归与非递归)

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序 归并排序属于外部排序,无最好最差情况,不跨区间排序是一种稳定的排序算法。 时间复杂度:O(n log n) 空间复杂度:O(n) 基本思路: 设两个有序

2017-08-04 15:00:25 1185

原创 快速排序经典算法(分治法,挖坑法,前后指针法,非递归)

快速排序最优的情况就是当关键值位于序列中间时 快速排序最坏的情况就是对已序的序列进行排序 时间复杂度:O(N^2)最差 使用场景:数据量大而杂乱的序列,避免出现最坏的情况 快速排序递归算法之分治法 基本思路: 1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

2017-08-04 14:36:42 2574 1

原创 选择排序&&堆排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 排序思想: 对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用

2017-07-31 22:05:18 458

原创 插入排序&&希尔排序

插入排序:在一个已经排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入已经排好序的子集中,直到将所有待排纪录全部插入为止。例如打扑克牌时的抓拍就是插入排序的一个很好的例子,每抓一张牌,插入到合适位置,主导抓完牌为止,即可得到一个有序序列。 适合场景:记录个数少而接近有序的序列 时间复杂度:O(N^2)—最差情况(完全无序) O(N)——最优情

2017-07-30 14:53:23 508

原创 将二叉搜索树转换成一个排序的双向链表--中序线索化的变型。

将二叉搜索树转换成一个排序的双向链表。 注意:要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。 在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种数据结构的结点是一致,二叉搜索树和双向链

2017-07-29 16:43:29 651 2

原创 C语言模式实现C++继承和多态

C实现一个struct A和struct B各包含一个int成员a和b,要求达到B继承了A的效果,也就是B里面包含一个A。并且能达到多态的效果,也就是一个A*p指向A调的是A的函数,指向B调用的是B的函数何为继承 ? 定义:在C++中所谓的继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类”或者“父类”,新建立的类称为“派生类”或者“子类”,一个新类从已有的类那里获得其已有特性,

2017-07-28 18:51:50 599

原创 由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)

由前序遍历和中序遍历重建二叉树 前序序列(根-左-右):1 2 3 4 5 6 中序序列(左-根-右):3 2 4 1 6 5 1、由前序遍历可知根节点为第一个元素1,在中序遍历序列中找到1对应位置,则1的左边就是左子树324,右边就是右子树65; 2、在找到前序遍历序列中从第二个位置开始往后找相同数目的节点为左子树234,剩余的就是右子树序列65; 3、根据前序遍历规则可知,左子树序

2017-07-28 18:06:56 2909

原创 求二叉树中两个节点的最近公共祖先

要考虑以下三种种情况: 1:二叉树每个节点有parent 2:二叉树是搜索二叉树。 3:就是普通二叉树。

2017-07-28 14:13:55 961

原创 判断一棵树是否是完全二叉树

完全二叉树的定义是,前n-1层都是满的,第n层如有空缺,则是缺在右边,即第n层的最右边的节点,它的左边是满的,右边是空的 根据层序遍历遍历二叉树,直到发现一个空节点,若树种还有未被访问的非空节点,则该二叉树不是完全二叉树template<class T>struct BinaryTreeNode{ BinaryTreeNode(T& data) :_data(data)

2017-07-28 14:04:25 828

原创 基于UDP的网络群聊系统

本系统所涉及到的知识与技术 1、了解Linux操作系统,熟悉基本指令的使用。 2、熟悉Linux开发环境,熟练使用vim, gcc/g++, gdb, make/makefile 等开发工具的使用,学会编写基本的Makefile文件。 3、了解网络, 熟悉数据封包,路由过程。了解协议分层。熟悉udp协议。了解tcp可靠性和udp协议特点。 4、熟练掌握C/C++语⾔言,熟练使⽤用C++ ST

2017-07-27 22:16:13 1176 1

原创 简易HTTP服务器

HTTP协议的主要特点如下: 1.支持客户/服务器模式。 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4.无连接:无连

2017-07-18 12:27:17 3018 2

原创 求解1+2+3+...+n,要求不能使用乘除法、while、for、if 、else、switch、case等关键字

方法一:利用递归以及&&的短路原理int Sum(int num, int& sum){ num&&Sum(num-1,sum);//递归跳出条件,当num为假时,无需判断后序语句,返回sum+=n return sum +=num;}int main(){ int num= 0; int sum = 0; cin>>num; cout <<

2017-07-14 09:52:53 7404

原创 Linux中crond服务与crontab用法

crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cron服务,用 service crond status 查看 cron服务状态 如果没有启动则 service crond start启动它,cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务。 Linux下,在/etc目录下有一个crontab文件,如下:

2017-07-09 19:51:49 2194

原创 shell字符串截取之cut命令

cut命令主要是接受三个定位方法: 第一,字节(bytes),用选项-b 第二,字符(characters),用选项-c 第三,域(fields),用选项-f 一、cut -b 如上图所示,-b后边可以设定截取哪个字节 -b支持形如3-5的写法,而且多个定位之间用逗号隔开就可以: 需要注意的是-b选项,执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再

2017-07-08 14:33:45 7326

原创 shell脚本语言实现进度条

代码如下:i=0bar=''lable=('|' '/' '-' '\\')index=0while [ $i -le 100 ]do printf "[%-100s][%d%%][%c]\r" "$bar" "$i" "${lable[$index]}" bar='#'$bar let i++ let index++ let index%=4

2017-07-03 16:25:27 498

原创 Linux中eval用法解析

eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。 两次扫描: val=’cat test.c’//test.c内容为一段代码 echo $val eval $val 第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令

2017-06-15 12:18:39 788

原创 shell脚本命令代换之‘ ’(反单引号)和$()

命令代换:先完成引号里或者括号里的命令行,然后将其结果替换出来,再重组成新的命令行。 Shell中可以用来实现变量代换的命令有两种,一种是由反引号括起来的一条命令另一种是由$()括起来一条命令,shell先执行这条命令,然后见输出结果立刻代换到当前命令行中。 如:DATE='helloword'echo $DATE输出如下: DATE=$(date)echo $DATE输出如下: 二者

2017-06-15 12:12:26 1267

原创 I/O多路转接之poll

poll()函数:这个函数是某些Linux系统提供的用于执行与select()函数同等功能的函数,下面是这个函数的声明:#include <poll.h>int poll(struct pollfd fds[], nfds_t nfds, int timeout);参数说明: fds:是一个struct pollfd结构类型的数组,用于存放需要检测其状态的Socket描述符;每当调用这个函数之后

2017-06-15 11:16:15 316

原创 I/O多路转接之epoll

所谓epoll 就是为处理大批量句柄⽽而作了改进的poll。epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用。 1、int epoll_create(int size); 创建⼀一个epoll的句柄。当创建好epoll句柄后,它就是会占用一个fd值,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。 2、int epol

2017-06-09 16:56:24 286

原创 I/O多路转接之select

系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、std

2017-06-06 12:11:45 346

原创 使用dup/dup2进行文件描述符重定向

当一个进程运行时,会有相应的文件描述符(Linux一切皆文件),一般会有3个默认的文件描述符: 0:与标准输入关联 1:与标准输出关联 2:与标准错误输出关联dup\dup2函数,对文件描述符重定向 close(1);//关闭要重定向的文件描述符 dup(fd,1);//将标准输出重定向到打开的文件 dup2(fd,1);//将打开的文件fd复制到标准输出1 代码:#include

2017-06-06 12:01:09 1050

原创 解析线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远

2017-06-02 17:59:28 319

原创 多线程服务器

基于TCP实现多进程服务器 服务器端: 1、创建套接字: #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);domain:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。 type:指定soc

2017-06-02 17:45:30 466

原创 多进程服务器

基于TCP实现多进程服务器 服务器端: 1、创建套接字: #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);domain:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。 type:指定soc

2017-06-02 17:15:39 381

原创 基于UDP的服务器和客户端之间的通信

服务器: 1、创建套接字 sock=socket(AF_INET,SOCK_DGRAM,0) 2、绑定 0.0.0.0:8080 让操作系统自由分配一个有效的IP 3、收数据ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen

2017-05-25 17:49:18 2187

原创 基于TCP的服务器/客户端通信

简易TCP服务器/客户端 服务器端: 1、创建套接字 int socket( int af, int type, int protocol); af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。 type:指定socket类型。新套接口的类型描述类型, TCP(SOCK_STREAM)和UDP(SOCK_DGRAM)。常用的socket类型

2017-05-25 13:55:28 789

原创 TCP连接建立和释放过程中状态机的变化

TCP是面向连接的协议,TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。 运输连接有三个阶段:连接建立,数据传送和连接释放。 TCP连接采用的是客户服务器方式。主动发起连接建立请求的应用进程叫客户,而被动等待连接建立的应用进程叫服务器。TCP的连接建立:三次握手 如下图所示TCP连接建立的过程。假定A主机运行的是TCP客户程序,而B主机运行的是TCP服务器程序。最初两端都处于

2017-05-19 21:37:43 1917

原创 TCP的四种定时器

TCP在建立连接后会启动四个定时器:重传计时器:Retransmission Timer 坚持计时器:Persistent Timer 保活计时器:Keeplive Timer 2MSL定时器:Time_Wait Timer1、重传计时器 TCP的发送方没有在规定的时间内收到确认就要重传已发送的报文段。这种重传概念很容易理解,但重传时间的选择却不简单。 如果吧超时重传的时间

2017-05-18 11:33:35 906

原创 TCP报文首部中URG和PSH的作用

1、URG(紧急指针URGent) 当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送,例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。因此用户从键盘发出中断命令(Ctrl+C)。如果不使用紧急指针数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的

2017-05-18 10:48:13 3373 1

原创 网络端口号的类型

什么是端口? 在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。如何查看端口号? 使用Netstat命令: 打开

2017-05-18 10:25:06 1293

原创 路由表的生成及其算法

路由表:在计算机网络中,路由表或称路由择域信息库(RIB)是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库。路由表存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值)。路由表中含有网络周边的拓扑信息。路由表建立的主要目标是为了实现路由协议和静态路由选择。在现代路由器构造中,路由表不直接参与数据包的传输,而是用于生成一个小型指向表,这个指向表仅仅包含由路由算法选择的数据

2017-05-17 13:50:21 1610

原创 NAT(网络地址转换)&&代理服务器

网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。NAT有三种类型:静态NAT(Static NAT)、

2017-05-17 13:25:17 446

空空如也

空空如也

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

TA关注的人

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