- 博客(83)
- 资源 (1)
- 收藏
- 关注
原创 Word Break && Word Break II
leetcode上面的两道动态规划题。 题目1 Word Break Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, g
2017-08-24 00:18:31
1296
原创 HTTP协议详解
HTTP超文本传输协议 http使用面向连接的TCP作为传输层协议。http本身无连接。请求报文 方法为GET的请求报文GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vn
2017-08-15 23:26:30
3453
原创 拥塞控制的几种算法
在某段时间内,对网络中的资源(链路容量,交换节点中的缓存和处理机等)需求大于可用的,就会造成拥塞。 拥塞控制就是防止过多的数据注入到网络中造成拥塞,是路由器或链路不会过载。拥塞控制和流量控制的区别: 拥塞控制是一个全局性的过程,涉及所有主机和路由器,以及其他因素。 流量控制是端到端的,发送端和接收端,需要做的是抑制发送端的发送速率,以便来的及接收。 吞吐量代表一定时间内从网络中传输的分组量。
2017-08-07 22:50:47
22053
原创 TCP概述
TCP的主要特点TCP是面向连接的传输层协议(应用程序在使用TCP协议之前必须先建立TCP连接,使用完后必须释放TCP连接)每个TCP连接只能有两个端点,点对点的。(端点 - 套接字 (IP地址:端口号))TCP提供可靠性。全双工的。(TCP允许通信双方在任何时候都能发送数据,TCP连接两端都设有发送缓存和接收缓存,发送端在发送数据后,就做自己的事情了,数据会保存在缓存区,TCP会在合适的时
2017-08-07 16:40:42
841
原创 线程同步的几种方式
多个线程同时访问共享数据可能会冲突。比如两个线程同时把某个全局变量增加1需要3步。1.从内存读取变量到寄存器 2.把寄存器中变量值加一 3.把结果返回给内存 不同线程的执行时间会造成结果的不同,这时候就需要线程同步:线程同步的四种方式:互斥量(mutex):引入互斥锁,得到锁的线程执行(读,修改,写)的操作,没有获得锁的线程只能等待,不能共享数据。(读,写,修改)的操作就有了原子性(要么
2017-07-29 14:24:49
6511
1
原创 进程间通信的几种方式
匿名管道 - 是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道 - 命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。消息队列 - 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。信号量 - 是一个计数器,可以用
2017-07-29 00:00:26
965
原创 进程状态
进程线程有哪几种状态。之间转换的关系是什么?下面的状态在/fs/proc/array.c中定义 运行状态(running)表明进程在运行中或者运行的队列中 睡眠状态(sleeping)表明进程在等待事情的完成。 磁盘休眠状态(disk sleep),这个状态下的进程通常会等待IO的结束。 停止状态(stopped),进程收到信号停止 死亡状态(dead)是内核运行里的do_exit()
2017-07-28 23:41:50
1137
1
原创 排序相关面试题总结
旋转数组中的最小元素如{3,4,5,1,2},就是{1,2,3,4,5}左旋两个得到,因为数组可以分为两个递增的部分,左边大于右边,用二分法的思想,中间元素如5大于2,说明5在左边部分,最小元素在右半部分,缩小区间到{5, 1, 2}之间。时间复杂度为O(logN). 注:如果左边元素与右边元素中间元素相同,需要另外处理。如{1,1,1,0,1}和{1,0,1,1,1}都是旋转数组,无法用二分法判
2017-07-26 20:55:33
1198
原创 查并集(朋友圈问题)
假设有A,B,C,D,E,5个人A,B在一个朋友圈内,B,C在一个朋友圈内,这样A,B,C就在一个朋友圈内,总共有多少个朋友圈。 当人数较多时不容易算出。 可以利用数据结构查并集。 设5个人的初值为-1,用数组下标代替A,B,C,D,E A,B在一个朋友圈,设A为根,B的值替换为A的下标,将A,B合并,A加上B本身的值为-2代表朋友圈内有两个人,当所取得值为负数时为根,为正数时代表所在朋
2017-07-24 16:11:03
5064
原创 STL空间配置器
当用户申请的内存大于128时调用一级空间配置器。 小于或者等于128调用二级空间配置器。 一级空间配置器是malloc的封装,如果不能成功申请到空间,用户通过调用set_malloc_handler函数可以自己设定处理函数。 二级空间配置器类似哈希桶,将128的区块分为16个分别为8,16,24。。。128大小的区块,用free_list来保存. 用户每次申请小于128的内存,会提升的8
2017-07-24 12:32:21
434
原创 单链表相关面试题总结
主要来自于《剑指offer》,都是面试高频题1. 删除结点删除节点需要知道上一个节点的地址。就需要遍历,可以把问题转化为删除下一个节点,把下一个节点的值拷贝给本节点。 删除pdel就转化为删除pnext,不需要再从头遍历。时间复杂度为O(1).但是pdel为尾节点或者头节点需要另外的处理。typedef struct SignalListNode { SignalListNode(co
2017-07-10 23:30:39
636
原创 TCP server的实现,和多线程,多进程服务器
socket在TCP/IP协议中,“IP地址+TCP/UDP端口号”表示唯一网络通信中的一个进程,IP地址+端口号称为socket。 注意: 字节序有大端和小端,在两台使用不同字节序的主机上通信,为了让两台主机间能正确的通信,发送端总是把字节序转成大端字节序数据后在发送,接收方知道接受的一定是大端字节序,然后根据自己的字节序进行转化就不会出错。调用函数int socket(int domain,
2017-07-08 23:57:26
8932
原创 多路转接-EPOLL 及简单的EPOLL服务器实现
EPOLL简介EPOLL是linux下公认的最好用的I/O就绪通知方式。 epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显着提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描
2017-07-04 11:14:54
856
1
转载 多线程与多进程
原文链接 http://blog.youkuaiyun.com/lishenglong666/article/details/8557215 鱼还是熊掌:浅谈多进程多线程的选择关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。
2017-06-28 14:31:56
634
原创 TCP定时器
TCP定时器是TCP可靠性的保障之一。当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能记时收到一个确认,它就重发这个报文段。TCP使用四种定时器(Timer,也称为“计时器”):重传计时器:Retransmission Timer 坚持计时器:Persistent Timer 保活计时器:Keeplive Timer 时间等待计时器:Time_Wait Tim
2017-06-28 13:11:30
429
原创 TCP三次握手和四次挥手详解
TCP: SYN ACK FIN RST PSH URG 详解TCP的三次握手是怎么进行的了:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手;接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉
2017-06-27 16:49:59
833
转载 端口号及分类协议号
原文链接 原文链接协议号与端口号详解IP是网络层协议,IP头中的协议号用来说明IP报文中承载的是哪种协议(一般是传输层协议,比如6 TCP,17 UDP;但也可能是网络层协议,比如1 ICMP;也可能是应用层协议,比如89 OSPF)。 TCP/UDP是传输层协议,TCP/UDP的端口号用来说明是哪种上层应用,比如TCP 80代表WWW,TCP 23代表Telnet,UDP 69代表TFTP。
2017-06-26 17:03:52
5319
原创 ARP协议及脚本
ARP地址解析协议,即(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。简介主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基
2017-06-25 23:31:20
4522
原创 NAT技术和代理服务器
NAT技术-网络地址转换来源:在Internet网上广泛使用的IPV4技术由于NAT技术,中文翻译为网络地址转换。该技术产生的原因:IPv4地址危机,在Internet上应用广泛的IPv4技术,由于其先天性不足,在九十年代初期时,已经预计到了IPv4地址不足,从而开始开发IPv6技术。但开发IPv6需要足够的时间,为了延长IPv4技术的使用时间,产生了NAT技术。 NAT技术不仅解决了网络地址不足的
2017-06-25 17:17:16
1435
原创 CRC校验原理
基本概念CRC即循环校验码是数据通信中最常用的一种差错校验码。信息字段的长度和校验码的长度是任意的。基本原理在K位信息码的后面加上R位校验码,整个长度是N位, N=K+R。给定一个(N,R)码,可以证明存在一个最高次幂为R的多项式G(x),根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。校验码生成生成过程:假设发送的信息用C(X)信息码表示,将C(X)左移R位得到多项式
2017-06-25 15:41:40
3132
原创 linux守护进程介绍以及如何编写守护进程
守护进程介绍:linux中的守护进程是一种特殊进程。它独立于控制终端并且周期性的执行某种任务或等待处理某些事件的发生。 linux中大多数服务器就是守护进程实现的。例如: internet服务器中inetd, Web服务器中的http。守护进程也完成一些系统任务如作业规划进程crond。 linux启动时会启动很多系统服务进程,这些进程没有控制终端,无法直接和用户交互。其他进程都是在用户登陆时启
2017-06-09 14:37:14
1443
原创 linux中crond服务与crontab的编写
crond服务是一种守护进程crond服务通常被放在/etc/init.d/crond , 这样就可以在系统启动后自动启动crond服务。 Linux中的用户使用contab命令来配置corn任务。 crontab在/etc目录下面存在cron.d,cron.daily,cron.weekly,cron.monthly,cron.hourly五个目录和crontab文件。cron.d是系统自动定
2017-06-09 12:28:08
3932
原创 如何使用GDB调试多线程
先写一段多线程程序。 makefile 加上 -g参数生成可调式信息, 可以进行调试。 pthread不是Linux下的默认的库,也就是在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。在gcc编译的时候,附加要加 -lpthread参数即可解决。gdb test 进入调试需要调试的地方打下断点,run运行到断点处。r 运行到断点处,info thread可以查看被调
2017-06-08 17:56:18
2758
原创 如何用gdb调试多进程
如何在linux下用gdb调试多进程 1. 方法一 先写一段程序 编译时加上参数-g 才可以调试gcc tioashi.c -g -o tiaoshi 在父进程中休眠40秒时为了有足够的时间查询父进程id. 先运行程序,子进程跑完,父进程还在sleep。ps aux|grep ..查看进程id gdb开启调试,再打开一个终端,attach 进程id就
2017-06-08 16:38:21
752
原创 AVL平衡树的旋转
AVL树是一种平衡查找树(每个节点左子树与右子树的高度差不超过1),这样可以保证树不偏向一边,使查找的时间复杂度降低。 需要给节点一个平衡因子_bf(右子树的高度减去左子树的高度)。 AVL树的插入分为下面几种情况: 在父节点的右子树插入节点,父节点的bf+1,如果父节点bf等于0,树平衡,插入成功,父节点bf等于1,右子树高度加1,接着向上调整。 在父节点的左子树插入节点,父节点的bf-1
2017-05-25 23:43:32
603
原创 用两个栈实现一个队列
栈是先进后出,队列是先进先出每次元素都push在st1中,pop的时候如果st2为空,将st1的栈顶元素放在st2的栈底,这样st1的所有元素都放在st2中,st1的栈底就是st2的栈顶,pop st2的栈顶,这样就满足了队列的先进先出。 #include <iostream>using namespace std;#include <stack>#include <stdlib.h>tem
2017-05-22 00:09:20
328
原创 Effective C++ 关于析构函数
条款七 带有多态性质的Base calsses应该声明一个virtual析构函数。 如果class带有任何的virtual, 他就应该有一个virtual 的析构函数。(虚函数会有额外的空间开销-虚表指针,不是所有的析构函都为virtual)。条款八 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出的异常析构函数应该捕捉任何异常,并不传播或者结束程序。如果需要对于某个函数运行期抛
2017-05-21 22:49:41
301
原创 Effective C++ 第五 六条C++默认编写调用哪些函数,如何明确拒绝自动生成的函数
c++中一个类如果没有自己声明,编译器会为它声明一个拷贝构造函数,赋值拷贝函数,一个析构函数。如果没有声明任何构造函数,会生成一个无参的构造函数。这些函数都是inline,且为public的。class Test{};//相当于class Test{Test(){...}Test(const Test& t){...}Test& operator = (const Test& t){..
2017-05-18 23:28:49
322
原创 Effective C++ 第四条 确定对象被使用前以先被初始化
为内置对象进行手工初始化,C++不保证初始化它们确保每一个构造函数都将对象的每一个成员初始化。#include <iostream>using namespace std;#include <string>class Test {public: Test(const string &str, const string& add, int num) { nam
2017-05-17 22:23:42
405
原创 Effective C++ 第三条,尽可能使用const
列表内容const可以修饰指针,也可以修饰指针所指物 char str[] = "ni hao"; char *p = str; // 非常量指针,非常量数据 const char *p1 = str; //非常量指针, 常量数据 char const *p2 = str; // 等于上一个 char *const p3 = str; //
2017-05-16 23:21:10
344
原创 查找二叉树的实现(查找,删除,插入)分别用递归和非递归
对于一个查找二叉树的每个节点X,它的左子树中的节点的关键值都小于X的关键值,右子树中的所有节点的关键值都大于X的关键值。 并且所有的关键值都是相异的,不存在相同的。 二叉树的平均深度是O(log N),对于查找树找一个元素最多查找树的高度次。#include <iostream>using namespace std;template <class K, class V>struct BS
2017-05-15 20:37:53
1522
原创 Effiective C++条款第二条 尽量以const,enum,inline,替换#define
宁可以编译器替换预处理器。#define MAX 1.623MAX 可能从未被编译器看见,编译器在处理之前预处理器就将MAX移走,只能看到1.623, 当运用这个常量并且出现错误时,错误信息就只会提到1.623。用const double Max = 1.623就不会出现这种问题。Max肯定会进入符号表。 常量作为类的成员时,将其申明为static将其作用域限制于class中class Gamep
2017-05-14 19:30:13
353
原创 优先级队列(二叉堆)
堆是一颗被完全填满的二叉树,底层的元素从左到右填入。 所以一个高度为h的堆有2^h到2^(h+1)-1个节点,这样的堆可以用一个数组来表示,堆顶为arr[0],父节点的下标为n,左儿子的下标就是2n+1, 堆有大堆(父节点的值大于儿子节点的值)和小堆(父节点的值小于儿子节点的值),大堆的根节点就是数组中最大的值,小堆的根节点就是数组中最小的值。堆只能访问根节点,能进行插入和删除操作。
2017-05-14 17:56:17
435
原创 二叉树面试题—前,中,后序(非递归),判断是否为完全二叉树
二叉树的基本操作Node* GetParent(Node* x) //得到父节点 { if ( _pRoot == NULL) return _pRoot; return _GetParent(_pRoot, x); } Node* Find(const T& value) //查找结点 { ret
2017-05-05 18:25:16
556
原创 密码学—如何随机生成大素数以及Miller Rabin素性检测方法
素数被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入质数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找质数的过程(分解质因数)过久,使即使取得信息也会无意义 给出两个大素数,很容易就能将它们两个相乘。但是,给出它们的乘积,找出它们的因子就显得不是那么容易了。这就是许多现代密码系统的关键所在。如果能够找到解决整数分
2017-05-01 23:07:56
30348
4
原创 二叉树的创建,前序,中序,后序,层序遍历
二叉树(binary tree)是另一种树形结构,它的特点是每个节点至多有两颗子树,并且其子树有左右之分,并且顺序不能颠倒。 主要用递归的思想完成创建,遍历等操作。 #include <iostream>using namespace std;#include <string>#include <queue>template <typename T>struct TreeNode{
2017-04-27 23:49:29
1723
原创 模重复平方算法
今天在做diffie_hellman加密中需要求一个数很多次方模另一个数,如 44^36mod97,这时用模重复平方算法就可以快速计算出结果。#include <iostream>using namespace std;size_t repeatMod(size_t base, size_t n, size_t mod){ size_t a = 1; while(n)
2017-04-24 23:23:01
8637
1
原创 数组全排列递归实现
将一个数组元素所有的排列方式列出。使用递归的方法所有元素的全排列转化为一部分。 例如: 1 2 3的全排列就是1 2 3, 1 3 2, 2 1 3, 2 3 1, 3 1 2, 3 2 1,用递归的方法就是1加上2 ,3全排列,然后1和2换位,2加上1,3的全排列,然后把3换到最前面加上1,2的全排列,同样的如果是4个数就是第一位加上后面的全排列,然
2017-04-09 20:42:37
1910
原创 单例模式
单例模式保证一个类只有一个实例并提供提供一个访问他的全局访问点,该实例被所有程序模块共享。class Signalleton{public: static Signalleton* get_instance(); //定义一个接口 void set_var(int var); int get_var();private: Signalleton(); //将
2017-04-08 12:03:39
353
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人