自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

鱼思故渊的专栏

不积跬步,无以至千里;不积小流,无以成江海

  • 博客(1072)
  • 资源 (3)
  • 论坛 (3)
  • 收藏
  • 关注

原创 我为什么那么喜欢呆在实验室,因为我知道我错过就再也没有机会

原以为属于自己的求职季会非常残酷、异常辛苦,想一想去年毕业的师兄师姐,为了一个满意的工作整天跑场去笔试面试。原以为在这场没有硝烟的战争中会被虐的很惨,原来都是虚惊一场,之前一切的假想都是存在,简历还没来得及好好准备就那样稀里糊涂的签了。找工作之前,或者说在研究生阶段,每次遇到细致的面经,都忍不住扫上一眼。时至今日,学校的秋季招聘也告一段落,闲来无事,也想和大家分享一下个人找工作的些许经历和准备

2015-11-10 21:28:05 16311 33

转载 STL源码剖析--vector

vector容器概述      vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,

2015-09-14 09:59:06 1913

原创 二叉树中和为某一值的路径

题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树      10         / \        5  12         / \          4    7则打印出两条路径:10, 12和10, 5, 7。先序遍历树即可得到结果

2015-09-09 17:57:34 1150

原创 求一个数组中的逆序对

数组中的逆序对是指左边元素大于右边元素,这样的一对数就构成了一个逆序对。求一个数组中的逆序对。这里使用分治方法,具体的思路可以参考剑指offer中的一个问题,这里使用了归并的思想,假如我们将一个数组分成两个数组,而且这两个数组是有序的,在从尾部到头部合并的时候,就可以判定有多少对逆序的元素对#include #include #include using namespace std

2015-09-09 17:30:35 1341

原创 32位系统和64位系统的区别

这里只说在32位系统和64位系统下编译器对内建类型的大小32位系统:char: 1个字节char*(也就是指针变量)4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)short int :2个字节int: 4个字节unsigned int:4个字节float:4个字节double:8个字节long long:8个字节u

2015-09-09 17:12:19 1507 1

转载 生产者消费者模型(Linux系统下的两种实现方法)

生产者消费者问题是同步问题中的一种常见情况,借用一下维基百科的话生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中

2015-09-07 14:32:19 8149 1

转载 大端模式和小端模式

在 各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机 通信领 域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正 确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先从字节序说起。一、什

2015-09-05 10:01:13 837

转载 浅谈C++多态

C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握。  多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(polymorphism),字面意思多种形状。  C++多态性是通过虚函数来实现的,虚函数允许子类重新定

2015-09-05 09:44:21 802

原创 二分查找的实现

在一个有序的数组中,查找一个数,可以使用二分查找,但是这个算法也是有很多地方需要注意的。正确的写法如下所示。//首先要把握下面几个要点:    //high=n-1 => while(low high=middle-1;    //high=n   => while(low high=middle;    //middle的计算不能写在while循环外,否则无法得到更新。i

2015-08-28 15:29:20 1507

转载 typeid详解

在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。    dynam

2015-08-25 15:11:12 1842

原创 使用递归反转一个栈

反转递归栈的内容使用递归,一定要明白递归结束的条件,假如栈中只有一个元素或者没有元素,那么这个栈就不用递归。那么我们将栈顶元素取出来,将余下的元素进行反转,那么将取出的元素放到栈的底部即可。对于将一个元素放到底部,又是一个递归的调用,如果栈为空,那么直接将元素存放到栈的底部即可,如果栈中有元素,那么取出栈内的元素,将原来的元素再次调用函数存放到栈底,然后将取出的元素压入栈即可。感觉这个

2015-08-21 11:26:50 3176 1

原创 十进制小数和二进制小数之间的转换

一、二进制数转换成十进制数    由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。二、十进制数转换为二进制数    十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。    1. 十进制整数转换为二进制整数    十进制整数转换为二进制

2015-08-20 14:50:05 5339

原创 Linux进程的睡眠和唤醒(一个定时信号唤醒睡眠中的进程)

突然想到Nginx中时间更新这块处理,Nginx中为了减少调用系统调用gettimeofday这个函数(因为一旦调用了系统调用,就会使得进程从用户态切换到内核态,就会发生上下文切换,这个代价很大且不值得)而设置了系统时间更新的次数,内部时间更新有两种方式,一种就是在配置文件中设置更新的评论,另一种是没有设置更新频率,在后面这种情况下,可以使用epoll_wait()这个函数的最后一个参数来控制反复

2015-08-20 11:35:56 13569

转载 Linux中fork()函数实例讲解

一、fork入门知识     一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数

2015-08-17 15:56:54 1342

原创 大型分布式网站的技术需求

HBase是Apache Hadoop项目下的一个子项目,它以GoogleBigTabale为原型,设计实现了高可靠性、高可扩展性、实现读写的列存储数据库,他的本质实际上是一张稀疏的大表,用来存储粗粒度的结构化数据,并且能够通过简单地增加节点来实现系统的线性扩展。         HBase运行在分布式文件系统HDFS之上,利用它可以在廉价PC Server上搭建。HBase集群中通常包含两种

2015-08-15 16:26:17 1200

原创 Zookeeper监控的作用

当服务越来越多,规模越来越大时,对应的机器数量也越来越大,单靠人工来管理和维护服务及地址的配置地址信息,已经很困难了,并且,依赖单一的硬件负载均衡设备或者使用LVS.nginx等软件方案进行路由和负载均衡调度,单点故障的问题也开始凸显,一旦服务路由或者负载均衡服务器宕机,依赖他的所有服务均将失效、         此时,需要一个能够动态注册和获取服务信息的地方。来统一管理服务名称和其对应的服务

2015-08-15 15:50:55 1938 1

原创 二叉树的非递归遍历(前序、中序、后序)

先序遍历void PreOrder_Nonrecursive1(BiTree T) //先序遍历的非递归 { if(!T) return ; stack s; BiTree curr = T; while(curr != NULL || !s.empty()) { while(

2015-07-17 08:01:17 1136

原创 UDP连接调用connect()函数

UDP是一个无连接的协议,它没有像TCP中EOF之类的东西。8.11 UDP的connect函数除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。对于已连接UDP套接字,与默认

2015-07-15 10:59:38 4683

原创 从TCP协议的原理来谈谈rst复位攻击

在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接、四次握手怎样把全双工的连接关闭掉、滑动窗口是怎么传输数据的、TCP的flag标志位里RST在哪些情况下出现。下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下RST攻击是怎么回事。1、TCP是什么?TCP是在IP网络层之上的传输层协议,用于提供port到port面向连接的可靠的字节流传输。我来用

2015-07-15 09:01:41 1720 2

原创 函数模板的特化

函数模板的特化该定义中一个或多个模板形参的实际类型或实际值是指定的。特化形式如下:关键字template后面接一对空的尖括号();再接模板名和一对尖括号,及括号中指定这个特化定义的模板形参;函数形参表函数体templateint compare(const char *const &v1, const char *const &v2){     return s

2015-07-15 08:21:27 1035

原创 new/malloc的区别

1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。1.

2015-07-15 08:17:59 1390 1

原创 缺页中断处理过程

缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。当进程执行过程中发生缺页中断时,需要进行页面换入,步骤如下: 首先硬件会陷入内核,在堆栈中保存程序计数器。大多数机器将当前指令的各种状态信息保存在CPU中特殊的寄存器中。启动一个汇编代码例程保存通用寄存器及其它易失性信息,以免被操作系统破坏。这个例程将操作系统作为一个函数来调用。(在页面换入换

2015-07-09 17:56:36 12873

原创 C++--何时需要定义赋值/复制构造函数

继承和动态内存分配假设基类使用了动态内存分配,而且定义了析构函数、复制构造函数和赋值函数,但是在派生类中没有使用动态内存分配,那么在派生类中不需要显示定义析构函数、复制构造函数和赋值函数。当基类和派生类采用动态内存分配时,派生类的析构函数、复制构造函数、赋值运算符都必须使用相应的基类方法来处理基类元素。这种要求是通过三种不同的方式来满足的。对于析构函数。这是自动完成的,也就是说在派生类的析

2015-06-17 22:40:16 2167

原创 一个string类的简单实现

string类中使用到了赋值构造函数、复制构造函数、构造函数、默认构造函数、析构函数、重载操作符等一些类操作class String{ public: String() { data = new char; data[0]='\0'; length = 0; } String(const char* str) { length = strlen(

2015-05-18 10:42:05 2105 4

原创 Linux网络编程中EAGAIN错误和EINTR错误

在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。    从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如,以O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起

2015-05-12 15:01:38 10268 5

原创 离散事件模拟--银行排队时间模拟

在数据结构中有个讲述如何模拟银行排队,最终算出每个人平均的逗留时间。这是需要数据结构的知识。将银行的每个窗口看成是一个队列,那么对于每次来一个人,都需要从最短的队列进行排队。(其实更优秀的做法是从最短的等待时间队列来排队)。这里的做法是这样的,首选在一个队列中插入一个人,整个事件是事件驱动的,每次去检查所有队列,删除那些业务用时已经超出的人,然后选择最短的队列来插入一个人,也就是说,每次插

2015-04-30 15:15:50 3587 1

原创 判断树为另一树的子结构

输入两棵二叉树 A 和 B,判断树 B 是不是 A 的子结构。例如,下图中的两棵树 A 和 B, 由于 A 中有一部分子树的结构和 B 是一样的,因此 B 就是 A的子结构。思路:首先采用一种方式来遍历A树,发现A树的某个节点和B树的根节点的值相等,从这个节点开始遍历是否为A树的一部分。bool IsSame(BinTree* first,BinTree* second)

2015-04-29 14:47:47 956

原创 二叉树两个结点的最低共同父结点

入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。第一变种是二叉树是一种特殊的二叉树:查找二叉树。也就是树是排序过的,位于左子树上的结点都比父结点小, 而位于右子树的结点都比父结点大。 我们只需要从根结点开始和两个结点进行比较。 如果当前结点的值比两个结点都大, 则最低的共同父结点一

2015-04-29 11:40:30 2031

原创 输出 1 到最大的 N 位数

题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数。比如输入 3,则输出 1、2、3 一直到最大的 3位数即 999。思路:这是一个大数问题,必须使用一个字符串来表示数字,因为担心数字太大void Add(string& cur){ int carry =1; int temp; int i; for(i=0;i<cur.length();i++) {

2015-04-29 10:54:26 909

原创 和为 n 连续正数序列

题目:输入一个正数 n,输出所有和为 n 连续正数序列。例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以输出 3 个连续序列 1-5、4-6 和 7-8。思路:我们再找连续的序列,那么我们从最小的一直往前加,如果和结果相等,那么这是一个符合条件的序列,然后再连续的往后加,如果和比结果小,那么一直往后加,如果比结果大,那么需要取出前面小的值,因为后面大的值是刚添加上的

2015-04-29 09:41:46 880

原创 二叉查找树的镜像

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入:8/ \6 10/\ /\5 7 9 11输出:8/ \10 6/\ /\11 9 7 5思路:这也是一个递归的题目,对于当前节点,如果不是NULL节点或者叶子节点,那么只需要交换左右子节点

2015-04-29 08:53:14 990

原创 约瑟夫环问题

题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字) 。 当一个数字删除后,从被删除数字的下一个继续删除第 m 个数字。求出在这个圆圈中剩下的最后一个数字思路:这就是约瑟夫环问题,使用STL中的list来解决,是最基础的解决办法int Joseph(list& ring,int

2015-04-29 08:44:47 1130 1

原创 判断一个序列是否是一个二叉查找树的后序遍历结果

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回 true,否则返回 false 。例如输入 5、7、6、9、11 、10、8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11因此返回 true。如果输入 7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false 。思路:

2015-04-28 23:08:21 923

原创 二叉查找树转换成排序的双向链表

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。比如将二元查找树10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。思路:对于树的很多题目,都可以使用递归的方法来处理。这道题目也不例外。我们从最基本的思路来考虑这个题目。把一个二叉树编程双向链表,

2015-04-28 21:57:51 841

原创 STL源码剖析--各个容器迭代器的分类

五类迭代器如下:1、输入迭代器:只读,一次传递    为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析,它们只能向前移动。一个专门的构造函数定义了超越末尾的值。总是,输入迭代器可以对读操作的结果进行解析(对每个值仅解析一次),然后向前移动。   2

2015-04-23 17:35:03 1105

原创 Bitwise AND of Numbers Range--LeetCode

Given a range [m, n] where 0 For example, given the range [5, 7], you should return 4.思路:第一个思路肯定是从第一个数开始按位与,但是这样的复杂度太高,开始有新的改进,如果这个范围内有2的幂,那么从这个开始按位或即可,这个2的幂要紧挨着n,如果发现这个2的幂次小于m,那么仍然从这个范围开始安装或。in

2015-04-21 08:32:34 3581

原创 Linux进程地址空间 && 进程内存布局

一 进程空间分布概述    对于一个进程,其空间分布如下图所示:                                     程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。未初始化过的数据(BSS):在程序运行

2015-04-20 20:24:02 29182 6

原创 Linux进程间通信--内存映射

一  内存映射概述                  从原理上讲,Linux系统利用已有的存储管理机制可以很自然的实现进程间的共享存储。对于一段物理存储空间,只需通过进程的虚存管理机构就可以映射到各自的3G用户地址空间中。通过这种映射,在不同进程看来“私有”的数据事实上是同一段内存单元,它们被这些不同的进程所共享。             在Linux系统实际运行时,内存中

2015-04-20 20:22:19 3096 1

原创 Linux进程间通信--shmget()共享内存(一)

大多数共享内存的具体实现,都是把由不同进程之间共享的内存映射为同一段物理内存。 多个进程都把该物理内存区域映射到自己的虚拟地址空间,这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存允许两个不相关的进程访问同一段物理内存, 由于数据不需要在不同的进程间复制,所以它是在两个正在运行的进程之间传递数据的一种非常有效的方式,一个进程向共享内存区域写入数据,共享该

2015-04-20 20:19:45 4770

原创 Linux进程间通信--shmget()共享内存(二)

共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同

2015-04-20 20:18:04 2132

nginx源码分析--带注释

nginx源码分析,分析过程中将重要的部分进行了注释,以便理解

2014-11-26

libevent-1.4.12-stable-注释版

注释了libevent中很关键的部分,很重要的接口函数。

2014-03-07

3G模块驱动运用开发总结

在特定ARM开发板上使用linux 进行3G拨号的连接

2012-11-16

空空如也

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

TA关注的人 TA的粉丝

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