- 博客(37)
- 资源 (16)
- 收藏
- 关注
原创 斐波那契数列生成
前言斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。
2017-07-27 10:52:10 1325
原创 素数判决和素数序列生成
前言质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。1. 素数的判定方法1bool IsSushu(const int num){ if(num < 2) return false; int temp(num); for(int i=2; i<temp; ++i) { if
2017-07-27 10:11:00 967
原创 Windows中多线程‘饥饿’浅谈
前言饥饿:如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”。1. 饥饿产生的原因(1)其它线程吞噬所有的 CPU 时间。(2)线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。2. 饥饿怎么处理(1)首先,系统调度依据优先级来选择线程,但是如果优先级较低的线程长期不能得到
2017-07-25 16:18:14 1648
原创 设计模式之单例模式&线程安全
前言单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。这种设计模式在写日志记录类的时候有使用。它的UML图如下所示客户通过调用静态函数getInstance()函数获得类对象的实例,且每次调用的时候都是使用的同一个实例。1. 饥饿模式写法class Singleton
2017-07-25 15:22:27 363
原创 Matlab实现CT、MRI多模态图像配准
引言这里使用Matlab里面自带的函数进行图像配准,在配准之前设置好配准的参数,调用imregister()函数就可以得到配准的图像。1. 编码这里使用到的Matlab工具函数为moving_reg = imregister(moving,fixed,transformType,optimizer,metric)[moving_reg,R_reg] = imregister(mo
2017-07-23 15:32:34 14860 3
原创 独立向量信号互信息计算——Matlab实现
引言信息熵公式:其中I(X)表示X的信息量p(xi)是xi发生的概率英文里面叫做probability mass function,一个随机产生的事件所包含的信息本体数量,只与事件发生的机率相关。事件发生的机率越低,在事件真的发生时,接收到的信息中,包含的信息本体越大。含义是概率为 0 的事件对应的信息大, 反之信息量少.取对数的原因是使得乘积变为求和。两个独立事件
2017-07-17 09:27:29 9150 13
原创 图像相似性度量——互信息计算Matlab实现
前言之前写了一篇关于计算互信息的文章,基本的原理已经在那篇文章里面写出来了,这里就不在赘述了。在这片文章中将介绍采用的是直方图计算的方式,比之前的方法快了很多,软件的代码是Matlab实现的,这里贴出来与大家分享。1. 代码%将图像B经过几何变换之后再计算互信息%x:水平方向上的位移%y:垂直方向上的位移%ang:图像的旋转角度%A:参考图像%B:浮动图像function
2017-07-17 00:11:37 11637 2
原创 线程死锁的原因和解决办法
前言死锁问题是多线程特有的问题,它可以被认为是线程间切换消耗系统性能的一种极端情况。在死锁时,线程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,其结果是系统任务永远无法执行完成。死锁问题是在多线程开发中应该坚决避免和杜绝的问题。1. 线程死锁的原因(1)互斥条件:一个资源每次只能被一个线程使用。(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
2017-07-16 17:11:08 11570
原创 C++ auto_ptr智能指针
前言auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:不是C++11标准中定义的,且这只是一种简单的智能指针)。使用auto_ptr主要是为了防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函数将不会调用,这样就会造成资源泄漏的隐患。1. auto
2017-07-12 16:57:44 633
原创 C++实现内存检测原理浅谈
前言之前已经介绍过了在Windows环境下和Linux环境下分别检测内存泄露使用的方法,但是这些内存检测的函数或是工具他们具体是依据什么样的原理来进行实现的呢?这里将在这篇文章中进行简单的分析和解读。1. 动态分配的原理当我们在程序中写下new和delete时,我们实际上调用的是C++语言内置的new operator和delete operator。所谓语言内置就是说我们不能更改其含
2017-07-12 00:05:07 1594
原创 Linux下使用valgrind工具对C++编程检测内存泄露
前言之前在这篇文章中已经讲过了对Windows平台下内存泄露问题的检测。今天这篇文章里面将主要对Linux下C++编程造成的内存泄露进行检查,使用到的工具是valgrind,当然在Linux下还有一些其它的工具可以作为内存泄露检测,这就挑选了一个强大且符合问题查找习惯的工具。1. 安装valgrind对于没有安装valgrind的用户可以使用sudo命令直接进行安装sudo apt
2017-07-11 21:35:32 1015
原创 排序算法——归并排序
前言将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。1. 编码//displaytemplate struct Disp{ void operator()(T value) {
2017-07-11 12:45:12 285
原创 排序算法——计数排序
前言计数排序的思想:在给定的数组中,依次寻找比当前数字小的元素的个数(count),统计之后直接使用t就可以定位到该数所在的位置,因为比它小的元素的个数已经通过count计算出来了,所以直接填充就可以了。1. 编码//displaytemplate struct Disp{ void operator()(T value) { cout << val
2017-07-11 10:53:24 355
原创 排序算法——堆排序
前言对于推排序它像合并排序而不像插入排序,堆排序的运行时间为O(nlogn)。像插入排序而不像合并排序,它是一种原地排序算法:在任何时候,数组中只有常数和元素存储在输入数组以外。这样堆排序就拥有了两种排序算法的优点。堆算法中涉及到的主要算法有:维持最大堆(Max_Heapify)和建立堆(Build_Max_Heap)。1. 编码实现这里为了使得数组的下标是从1开始计算的,在数组的
2017-07-11 00:35:03 336
原创 排序算法——直接选择排序
前言算法基本思想:假设数据元素存放在数组L中,初始时,有序序列为空,将L[0]~L[n-1]作为无序区;每次从无序区中选出关键字最小的数据元素L[min],与无序区的第一个元素交换,使得有序区长度增长1,无序区减1.1. 编码template struct Disp{ void operator()(T value) { cout << value <
2017-07-11 00:34:34 288
原创 排序算法——快速排序
前言快速排序采用了分治法,即将原问题划分成为若干个规模更小且与原问题相似的子问题,然后递归地解决这些子问题,最后将他们组合起来。快速排序的思想是:假设数据元素存放在数组L中,当前序列为L[left]~L[right],left和right是当前序列的上下界;在序列中,任选一个数据元素L[pos](一般选择L[left],并成为枢轴)作为基准元素;然后,依次从序列的两端交替向序列中间扫描,将
2017-07-10 19:46:07 350
原创 排序算法——冒泡排序
前言冒泡排序基本思想:假设数据元素存放于数组L中,初始化时,有序区为空,无序区为0~n-1;在无序区中,每次均从头至尾一次比较相邻的两个元素j和j+1,若存在逆序,则交换两者。每执行这一过程成为一趟冒泡排序。1. 编码template struct Disp{ void operator()(T value) { cout << value << "\
2017-07-10 19:32:23 324
原创 排序算法——希尔排序
前言希尔排序又称缩小增量排序,是时间效率较高的插入排序方法。算法的基本思想:先确定一个增量d(也叫间隙gap),然后按照增量的倍数所对应的数组下标值,从待排序序列中抽取数据元素组成若干子序列,然后对子序列分别做直接插入排序,这样的操作过程就是一趟希尔排序。进行下一趟希尔排序时,先确定一个更小的增量,然后再作以上操作,直到增量为1,做最后一次直接插入排序,由于序列基本已经有序,此时只需要很少
2017-07-10 19:25:54 336
原创 排序算法——折半插入排序
前言之前已经介绍过了插入排序的原理了。但是对于插入位置的选择就可以通过二分查找法的方式进行求取,加快算法运行。1. 编码template struct Disp{ void operator()(T value) { cout << value << "\t"; }};//折半插入排序void InsertSort2(std::vect
2017-07-10 19:16:21 342
原创 排序算法——插入排序
前言算法的思想:将数据分成两部分,一部分是有序的部分,另外一部分为无序的部分。然后每次从无序区中取出一个元素,按照其大小插入到前面有序的区间中,直到全部无序的元素取完为止。就如上图所示,蓝色的是有序的,红色的是无序的。算法就是从无序元素中抽取一个插入到有序的区间中去。1. 编码template struct Disp{ void operator()(T valu
2017-07-10 19:07:09 292
原创 C++11 unique_ptr独占的智能指针
unique_ptr是一个独占型指针,让不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另外一个unique_ptr。unique_ptr p1(new int(0));unique_ptr p2 = p1; //错误unique_ptr不允许复制,但可以通过函数返回给其他的unique_ptr,还可以通过std::move来转移到其他的unique
2017-07-06 15:53:37 882
原创 C++11 shared_ptr共享智能指针
前言std::shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。在最后一个shared_ptr析构的时候,内存才会释放。1. shared_ptr基本使用方法1.1 初始化#include //智能指针初始化std::shared_ptr p(new int(20));cout << *p << endl;std::shared_ptr
2017-07-06 15:30:47 1310
原创 C++11 可变模板参数
前言C++11 增强了模板功能,在C++11之前,类模板和函数只能含有固定数量的模板参数,现在C++11中的新特性可变参数模板允许模板定义中包含0到任意个模板参数。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面加上省略号“...”。其中的省略号的作用是:(1)声明一个参数包,这个参数包中可以包含0到人一个模板参数(2)
2017-07-06 11:07:39 596
原创 C++11 Lambda表达式
前言lambda表达式是C++11最重要的也是最常用的一个特性之一。其实在C#3.5中就引入了lambda,java至今还没有引入,要等到Java8中才有lambda表达式。lambda表达式源于函数式编程的理念,也是现代编程语言的一个特点。lambda表达式具有如下的优点:(1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,
2017-07-05 15:30:11 401
原创 C++11 std::function和std::bind绑定器
前言C++11增加了std::function和std::bind,使得使用标准库函数时变得方便,而且还能方便地实现延迟求值。C++中,存在“可调用对象”这么一个概念。准确来说,可调用对象有如下的定义:(1)是一个函数指针(2)是一个具有operator()成员函数的类对象(仿函数)(3)是一个可被转换为函数指针的类对象(4)是一个类成员(函数)指针1. std::func
2017-07-05 13:06:38 2788 1
原创 Windows下C++软件调试——检测内存泄露
前言之前在面一家公司的时候被问及到:当你接收同事的项目,项目之中可能存在内存泄露,而且代码能够正常的运行不会报错。在这种情况下找出该项目中可能存在的内存泄露问题(比如原同事只new了但是没有delete),该如何进行检测。这样的问题确实很实用,因为在软件编写的过程中不仅仅需要完成软件功能,更加重要的是代码的健壮性。1. Win32平台下对于堆上内存操作(new,malloc)的检测,可
2017-07-04 21:26:44 3808
原创 TCP 的超时与重传
1. TCP的管理定时器TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认,它就重传该数据。对任何实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。对每个连接,TCP管理4个不同的定时器。1) 重传定时器:使用于当希望收到另一端的
2017-07-04 17:13:29 2014 1
原创 TCP 窗口协议
这里使用可视化展现窗口协议在上面这个图中,我们将字节从1至11进行标号。接收方通告的窗口称为提出的窗口(offered window),它覆盖了从第4字节到第9字节的区域,表明接收方已经确认了包括第3字节在内的数据,且通告窗口大小为6。由于窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个
2017-07-04 17:02:29 763
原创 TCP连接建立与结束(三次握手与4次挥手)
1. 概述TCP的连接建立需要进行三次的数据交互,在结束时需要进行4次的数据交互,具体的流程图如下图所示注意Seq:是发送方当前报文的顺序号码ack:是发送方期望对方在下次返回报文中给回的Seq2. 连接建立与结束2.1 连接建立建立连接需要进行三次数据传输,也就是三次握手第一次握手:客户端向服务端发送连接请求包,标志位SYN(同步序号)置为1,顺序号码
2017-07-04 16:57:50 968
原创 TCP半工作模式
TCP连接有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接。TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全"来说的。1. 半开连接从协议定义的角度来说,TCP的半开连接是指TCP连接的一端异常崩溃,或者在未通知对端的情况下关闭连接,这种情况下不可以正常收发数据,否则会产生RST(后面内容我们在介绍RS
2017-07-04 16:44:55 1163
原创 TCP同时打开和同时关闭
1. 同时打开两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。每一方必须发送一个SYN,且这些SYN必须传递给对方。这需要每一方使用一个对方熟知的端口最为本地端口。当出现同时打开的情况时,状态迁移图就与标准的连接状态迁移图不一样了。两端几乎同时发送SYN并进入SYN_SENT状态。当每一端收到SYN时,状态变为SYN_RCVD,同时它们都再发SYN并对收到的SYN进行
2017-07-04 16:41:25 2426 1
原创 TCP:传输控制协议
TCP被誉为是可靠的数据传输协议,它是通过下面的方式来提供可靠性的:(1)应用数据被分割成TCP认为最合适发送的数据块。这和UDP完全不同。应用程序产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段。(2)当TCP发出一个端之后,它启动一个定时器,等待目的端确认接收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。(3)当TCP接收到发自TCP连接另一端的数
2017-07-03 18:17:54 553
原创 UDP:用户数据报协议
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据域真正发送的单个IP数据报可能没有什么联系。下图是将UDP报文封装成为一份IP数据报的格式UDP首部(8字节)格式:UDP检验和覆盖UDP首部和UDP数据。回想IP首部的检验和,他只是覆
2017-07-03 18:11:13 488
转载 CRC校验原理
1. CRC校验原理CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而
2017-07-03 18:05:31 421
原创 IP数据报格式详解
1. IP数据报报文格式由首部和数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。首都中的源地址和目的地址都是 IP 协议地址。2. 相关字段详解①版本:占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。日前广泛使用的 IP协议版本号为 4 (即 IPv4)。IPv6 目前
2017-07-03 16:38:14 5612
原创 ARP 地址解析协议
1. ARP协议在网络通信中,每一台主机和路由都能了解局域网内的IP地址和MAC地址的对应关系,这是实现IP包封装(encapsulation)到帧的基本条件。IP地址与MAC地址的对应是通过ARP协议传播到局域网的每个主机和路由。每一台主机或路由中都有一个ARP cache,用以存储局域网内IP地址和MAC地址如何对应。ARP协议(ARP介于连接层和网络层之间,ARP包需要包裹在一个
2017-07-03 14:36:47 623
原创 网络协议概述
这篇文章主要描述TCP/IP模型和OSI标准模型之间的关系,首先看一下在一端的应用层给另外一端的应用层发送数据,需要经过的模型层。如下图所示这张图展示了应用层数据之间传输的流程。标准的OSI模型和TCP/IP模型之间的对应关系和相关的协议是这样的下面将对TCP/IP中的层做介绍:对于TCP/IP中的各个模型的解释是这样的(1)物理层所谓的物理层,是指光纤、电
2017-07-03 11:12:14 1049
Opencv调试看图插件
2016-10-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人