- 博客(143)
- 资源 (7)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 史上最全设计模式导学
权声明:本文为博主原创文章,未经博主允许不得转载。 圣诞献礼! 2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多篇与设计模式学习相关的文章,涵盖了七个面向对象设计原则和24个设计模式(23个GoF设计模式 + 简单工厂模式),为了方便大家学习,现将所有文章的链接进行了整理,希望能给各位带来帮助! 祝大家圣诞
2015-12-22 10:21:28
727
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 TCP/IP协议(三)---传输层
/**本篇博客由汗青ZJF整理并发布, 转载请注明出处:http://bloger.csdn.net/zzjf280441589/article/category/1854365*/传输层的主要功能 1)传输层为应用进程之间提供端到端的逻辑通信(网络层是为主机到主机提供逻辑通信)。 2)复用和分用: 复用是指发送方不同的应用进程都可以使用同一
2015-11-24 13:13:44
1266
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Tcpdump 和 Wireshark 的结合使用(二)
在上一篇博文中我们分别介绍了Tcpdump 和 Wireshark 的简单使用,这一节我们将介绍使用Wireshark 来分析 Tcpdump 抓住的网络包,主要分析TCP三次握手的过程。1.首先我们在Linux系统运行 下面的命令抓包,并保存在 a.cap 文件中, #tcpdump -i lo -w a.cap 然后运行一个简单的
2015-11-18 14:32:19
1057
1
转载 linux 内核与用户空间通信之netlink使用方法
Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Na
2016-07-06 10:57:56
740
转载 数据结构基础(18) --哈希表的设计与实现
哈希表 根据设定的哈希函数 H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“映像”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。 构造哈希函数的方法1. 直接定址法(数组) 哈希函数为关键字的线性函数H(key) = key 或者 H(key) = a*ke
2016-01-28 15:38:18
1055
转载 数据结构基础(17) --二叉查找树的设计与实现
二叉排序树的特征二叉排序树或者是一棵空树,或者是具有如下特性的二叉树: 1.每一元素都有一个键值, 而且不允许重复; 2.若它的左子树不空,则左子树上所有结点的值均小于根结点的值; 3.若它的右子树不空,则右子树上所有结点的值均大于根结点的值; 4.它的左、右子树也都分别是二叉排序树。二叉排序树
2016-01-28 15:36:45
886
转载 数据结构基础(16) --树与二叉树
树的基本术语1.结点:{数据元素+若干指向子树的分支}2.结点的度:分支的个数(子树的个数)3.树的度:树中所有结点的度的最大值4.叶子结点:度为零的结点5.分支结点:度大于零的结点(包含根和中间结点)6.(从根到结点的)路径:由从根到该结点所经分支和结点构成;7.结点的层次:假设根结点的层次为1,则根的孩子为第2层,如果某节点在第L层,则其
2016-01-28 15:33:58
539
转载 数据结构基础(15) --基数排序
基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。实现多关键字排序通常有两种作法: 最低位优先法(LSD) 先对K[0]{基数的最低位}进行排序,并按 K(0) 的不同值将记录序列分成若干子序列之后,分别对 K[1] 进行排序,..., K[d-1]依次类推,直至最后对最次位关键字排序完成为止。 最高位优先法(MSD)
2016-01-28 15:32:47
597
转载 数据结构基础(14) --链式队列的设计与实现
链式队列是基于单链表的一种存储表示, 其形状如下图所示: (队列的队头指针指向单链表的第一个结点, 队尾指针指向单链表的最后一个结点, 注意没有无用的空[头/尾]节点) 用单链表表示的链式队列特别适合于数据元素变动比较大的情况, 而且不存在队列满而产生溢出的情况; 链式队列结点构造:[这次我们将节点构造成了类LinkQueue的
2016-01-28 15:31:08
449
转载 数据结构基础(13) --链式栈的设计与实现
采用链式存储的栈成为链式栈(或简称链栈), 链栈的优点是便于多个栈共享存储空间和提高其效率, 且不存在栈满上溢的情况(因为链栈是靠指针链接到一起,只要内存够大, 则链栈理论上可以存储的元素是没有上限的); 与顺序栈相比, 由于顺序栈是采用的数组实现, 因此一旦数组填满, 则必须重新申请内存, 并将所有元素”搬家”, 而链栈则省略了这一”耗时耗力”的工作, 但却需要付出附加一个指针的代
2016-01-28 15:29:55
426
转载 数据结构基础(12) --双向循环链表的设计与实现
双向链表的操作特点: (1) “查询” 和单链表相同; (2)“插入” 和“删除”时需要同时修改两个方向上的指针。 但是对于双向循环链表则在表尾插入非常的迅速, 只需O(1)的时间,因为有指向前面的指针, 因此双向循环链表会很容易的找到位于表尾的元素,因此双向循环链表比较适用于频繁在表尾插入的情况.空链表:
2016-01-28 15:28:35
501
转载 数据结构基础(11) --循环链表的设计与实现
循环链表:最后一个结点的指针域的指针又指回第一个结点的链表; 循环单链表与单链表的区别在于:表中最有一个节点的指针不再是NULL, 而改为指向头结点(因此要对我们原来的MyList稍作修改), 从而整个链表形成一个环. 因此, 循环单链表的判空条件不再是头结点的指针是否为空, 而是他是否等于头结点; 其实如果只是单纯的实现循环链表对单链表的性能提升
2016-01-28 15:27:10
495
转载 数据结构基础(10) --单链表迭代器的设计与实现
为了向 STL 致敬(O(∩_∩)O~), 我们模仿STL中的list的迭代器, 我们也自己实现一个MyList的迭代器, 以供遍历整个链表的所有元素:首先:Node节点需要做如下修改(注意后缀有+的代码)[cpp] view plain copy //链表节点 template typename Type> class
2016-01-28 15:24:07
544
转载 数据结构基础(9) --单链表的设计与实现(2)之高级操作
链表的链接: 将第二条链表的所有内容链接到第一条链表之后, 其完整实现代码与解析如下:[cpp] view plain copy //链表的链接 template typename Type> void MyList::concatenate(const MyList &list) { if (i
2016-01-28 15:22:11
351
转载 数据结构基础(8) --单链表的设计与实现(1)之基本操作
链表简介数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N);
2016-01-28 15:18:53
664
转载 数据结构基础(7) --循环队列的设计与实现
队列 队列简称队, 也是一种操作受限的线性表, 只允许在表的一端进行插入, 而在表的另一端进行删除.其特点为”先进先出(FIFO)”,故又称为先进先出的线性表,简单队列如图所示: 循环队列 顺序队列有一个先天不足, 那就是空间利用率不高, 会产生”假溢出”现象,即:其实队列中还有空闲的空间以存储元素, 但我们在判断队列是否还有空间时, 队列告
2016-01-28 15:17:19
488
转载 数据结构基础(6) --顺序栈的设计与实现
栈是一种只允许在一端进行插入或删除操作的线性表.其特点为:先进后出(FILO)/后进先出(LIFO); 栈 VS. 队列 栈和队列都是动态集合, 但在栈中, 可以去掉的是最近插入的那一个,:栈实现了一种后进先出(last-in, first-out)的策略;类似的, 在队列中, 可以去掉的元素总是在集合中存在时间最长的那一个:队列实现了先进先出(first-in, f
2016-01-28 15:15:43
425
转载 数据结构基础(5) --归并排序
归并排序的基本思想: 将两个或两个以上的有序子序列”归并”为一个有序序列:假定待排序表含有n个记录, 则可以看成是n个有序的子表, 每个子表长度为1, 然后两两归并, 得到[n/2]个长度为2或1的有序表,; 再量量归并, ...., 如此重复, 直到合并成为一个长度为n的有序表为止, 这种排序方法称为2-路归并排序.如图为一个2-路归并排序的一个示例:
2016-01-28 15:14:22
411
转载 数据结构基础(4) --快速排序
快速排序是最流行的,也是速度最快的排序算法(C++ STL 的sort函数就是实现的快速排序); 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数
2016-01-28 15:11:38
323
转载 数据结构基础(3) --Permutation & 插入排序
Permutation(排列组合)排列问题:设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), (ri)Permutation(X)表示在全排列Permutation(X)的每一个排列前加上前缀ri得到的排列.R的全排列可归纳定义如下:当n=1时,Permutati
2016-01-28 15:10:30
634
转载 数据结构基础(2) --顺序查找 & 二分查找
顺序查找适用范围:没有进行排序的数据序列缺点:速度非常慢, 效率为O(N)[cpp] view plain copy //实现 template typename Type> Type *sequenceSearch(Type *begin, Type *end, const Type &searc
2016-01-28 15:09:09
310
转载 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
Swap的简单实现[cpp] view plain copy //C语言方式(by-pointer): template typename Type> bool swapByPointer(Type *pointer1, Type *pointer2) { //确保两个指针不会指向同一个对象 if (po
2016-01-28 15:07:29
382
转载 八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,
2016-01-28 15:02:19
364
原创 什么是排序算法的稳定性
排序算法的稳定性,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。 稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其
2016-01-28 14:36:16
5670
转载 Top k 算法
Top K 算法详解应用场景: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
2016-01-25 16:15:23
262
原创 C++常用库函数atoi,itoa,strcpy,strcmp的实现
1. 整数转换成字符串 itoa 函数的实现#include "stdafx.h"#include using namespace std;void itoaTest(int num,char str[] ){ int sign = num,i = 0,j = 0; char temp[11]; if(sign<0)// 判断是否 是一个负数
2016-01-25 15:59:04
507
原创 几个 shell 的题目
1、 创建file0, file1, … , file9十个文件。 2、 对/etc/passwd文件按照“:”分隔的第一个字段排序,并输出第三行到第五行。 3、 比较两个文件是否相同(忽略空行)。 4、 从光盘制作iso文件,做完后把光盘弹出。 5、 产生一个1G大小的文件。 6、 显示系统的网卡信息。 7、 统计当前系统TCP连接的总数。 8、 将/home目录下所
2016-01-25 15:41:22
578
转载 学习STL map, STL set之数据结构基础
STL map和set的使用虽不复杂,但也有一些不易理解的地方,如:或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构。C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封
2016-01-25 10:48:59
417
原创 STL容器的实现原理
List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持下标访问,而list是以链表形式实现的,不支持下标访问。Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,
2016-01-25 10:45:26
544
原创 C++笔试题总结(二)
16. 关联、聚合(Aggregation)以及组合(Composition)的区别?涉及到UML(建模语言)中的一些概念:关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:从实现的角度讲,聚合可以表示为:class A {...} class B { A
2016-01-09 18:24:37
446
原创 C++笔试题总结(一)
1.求下面函数的返回值(微软)int func(x){int countx = 0;while(x){countx ++;x = x&(x-1);}return countx;}假定x = 9999。 答案:8思路:将x转化为2进制,看含有的1的个数。2. 什么是“引用”?申明和使用“引用”要注意哪些问题?答:引用就是某个目标变量的“
2016-01-09 18:14:32
532
转载 Socket编程实践(13) --UNIX域协议
UNIX域协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 几乎是TCP的两倍(由于UNIX域套接字不需要经过网络协议栈,不需要打包/拆包,计算校验和,维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程, 而且UNIX域协议机制本质上就是可靠的通讯, 而网络协议是为不可靠的通讯设计的). UNIX域套接字可以在同一台主机上各进程之
2016-01-04 12:38:25
373
转载 Socket编程实践(12) --UDP编程基础
UDP特点 无连接,面向数据报(基于消息,不会粘包)的数据传输服务; 不可靠(可能会丢包, 乱序, 重复), 但因此一般情况下UDP更加高效;UDP客户/服务器模型 UDP-API使用[cpp] view plaincopy#include #inclu
2016-01-04 12:37:28
365
转载 Socket编程实践(11) --epoll原理与封装
常用模型的特点 Linux 下设计并发网络程序,有典型的Apache模型(Process Per Connection,PPC), TPC(Thread Per Connection)模型,以及 select/polL模型和epoll模型。 1 、PPC/TPC 模型 这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我(详见本系列博客)
2016-01-04 12:36:15
516
转载 Socket编程实践(10) --select的限制与poll的使用
select的限制用select实现的并发服务器,能达到的并发数一般受两方面限制:1)一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n(number)来调整或者使用setrlimit函数设置,但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/file-max 查看[cpp]
2016-01-04 12:35:01
439
转载 Socket编程实践(9) --套接字IO超时设置方法
引:超时设置3种方案1. alarm超时设置方法[cpp] view plaincopy//代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) { return ; } signal(SIGALRM, sigHandlerForSigAlr
2016-01-04 12:33:41
923
转载 Socket编程实践(8) --Select-I/O复用
五种I/O模型介绍(1)阻塞I/O[默认] 当上层应用App调用recv系统调用时,如果对等方没有发送数据(Linux内核缓冲区中没有数据),上层应用Application1将阻塞;当对等方发送了数据,Linux内核recv端缓冲区数据到达,内核会把数据copy给用户空间。然后上层应用App解除阻塞,执行下一步操作。 (2)非阻塞I/
2016-01-04 12:32:26
508
转载 Socket编程实践(7) --Socket-Class封装(改进版v2)
本篇博客定义一套用于TCP通信比较实用/好用Socket类库(运用C++封装的思想,将socket API尽量封装的好用与实用), 从开发出Socket库的第一个版本以来, 作者不知道做了多少改进, 每次有新的/好的想法尽量实现到该库当中来; 而且我还使用该库开发出作者第一个真正意义上的基于Linux的Server程序[MyHttpd, 在后续的博客当中, 我一定会将MyHttpd的实现原理与实现
2016-01-04 12:31:13
531
转载 Socket编程实践(6) --TCP服务端注意事项
僵尸进程处理1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程[cpp] view plaincopysignal(SIGCHLD,onSignalCatch);
2016-01-04 12:28:43
766
转载 Socket编程实践(5) --TCP粘包问题与解决
TCP粘包问题由于TCP协议是基于字节流且无边界的传输协议, 因此很有可能产生粘包问题, 问题描述如下 对于Host A 发送的M1与M2两个各10K的数据块, Host B 接收数据的方式不确定, 有以下方式接收: 先接收M1, 再接收M2(正确方式) 先接收M2, 再接收M1(错误) 一次性收到20k数据(错误)
2016-01-04 12:27:35
503
基于STM32的usb鼠标
2015-12-12
基于NRF24L01无线模块的RFID刷卡系统
2015-12-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人