自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 从头到尾彻底理解KMP (极力推荐)

作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4.4节中。1. 引言    本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱。所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟

2018-01-25 22:40:10 370

转载 C++空类编译器自动生成的6个成员函数

一、问题       在C++中,编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢? 二、详解1、空类,声明时编译器不会生成任何成员函数        对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符。        有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:默认构造函数、默认拷贝构造函数、默认析构函数、默认赋值...

2018-01-24 19:25:53 1145

转载 快速排序

在企业的面试或是考研的面试中,快速排序可以说是出现频率最高的一个问题,本文就快排做一个总结以帮助大家理解。快速排序介绍快速排序(Quick Sort)使用分治法策略。它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归

2018-01-21 23:17:30 212

转载 直接插入排序

直接插入排序介绍直接插入排序(Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。插入排序图文说明下面选取直接插入排序的一个中间过程对

2018-01-21 21:14:11 180

转载 冒泡排序法和选择排序法

  语言中,常用的算法有:冒泡排序、快速排序、插入排序、选择排序、希尔排序、堆排序以及归并排序等等。那么从这篇开始,我将分别总结下这几种排序法。先交代一下,我们将要排序的数组定义为arr[N],即数组arr[]包含N个元素。## 冒泡排序法(Bubblesort) ##所谓排序法,就是对一组无序的序列进行有序的排序(从大到小或者从小到大),那么什么叫冒泡排序法,冒泡排序法又是怎么实现...

2018-01-21 20:18:49 278

转载 选择排序

   选择排序介绍选择排序(Selection sort)是一种简单直观的排序算法。其基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。上面的说法可能还有点抽象,没关系,下面让我们用图来说明一切,相信大家肯定能看懂和理解的。...

2018-01-21 20:17:08 207

转载 冒泡排序

  冒泡排序介绍冒泡排序一种简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止! 冒泡排序图解下面以数列{20,40,30,10,60,50}为例,...

2018-01-21 19:24:46 219

转载 Linux系统 GCC搜索头文件和库文件的执行顺序

1、 gcc/g++ 查找头文件和库文件默认搜索路径echo 'main(){}'|gcc -E -v -2、头文件  gcc 在编译时寻找所需要的头文件 :  ※搜寻会从-I开始  ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH  

2018-01-19 19:10:32 988

转载 Manacher 算法

0. 问题定义最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果一个字符串正着读和反着读是一样的,那它就是回文串。下面是一些回文串的实例:12321 a aba abba aaaa tattarrattat(牛津英语词典中最长的回文单词)1. Brute-force 解法对于最长回文子串问题,最简单粗暴的办法是:找到字符串的所有子串,遍历每一个子串以

2018-01-18 19:27:08 173

转载 字符串匹配的KMP算法

字符匹配场景字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。

2018-01-15 19:05:12 155

转载 KMP字符串模式匹配详解

KMP字符串模式匹配详解KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。一.简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char S [ ], char T [ ], int pos ){/* 若串 S

2018-01-15 19:00:42 430

转载 C++11 左值、右值、引用详解

左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找

2018-01-14 17:40:47 163

转载 C++对象模型之内存布局(3)

经过两天的摸索,今天终于搞清楚C++对象模型.前两篇C++对象模型之内存布局(2)C++对象模型之内存布局(1)已经讲解了单继承,多重继承和多继承的对象模型.今天讲解菱形继承,虽然过程艰难,但是收获丰富.简单虚拟继承对象首先编写如下的测试程序:上述程序的输出如下:简单解释下:当存在虚基类时,先是子类的成员,然后才是虚基类的成员.以下是C对象的对象模型:通过在gdb下,输入指令:也可以输出C对象的对...

2018-01-14 16:25:04 137

转载 C++对象模型之内存布局(2)

在C++对象模型之内存布局(1)一文中分别讲了无多态和有多态时单继承的对象内存布局,这篇文章将深入讲解多重继承和多继承.多重继承理论讲解:多重继承,顾名思义,就是继承关系大于2,即至少有父类,子类,孙子类三代关系,先定义以下三个类:类B公有继承A,类C公有继承B,图一是类C的内存布局(图一)其实多重继承和单继承很类似,就是在父类的基础上添加成员变量和更新虚函数表.实例讲解编写了以下程序进行验证:该...

2018-01-13 10:08:37 171

转载 C++对象模型之内存布局(1)

如果想学习在linux或者在linux平台下开发,学习C/或C++是非常好的选择.俗话说,术业有专攻,学一门技术,就尽量学得深,也可以作为行走江湖,混口饭吃的一项本领.对于C,当初我是看了C与指针这门书,这本书讲解了很多我没有了解过的知识点,特别是指针讲解的很到位.最后还设计了C运行时内存模型.对于C++的学习,我看了C++ Primer之后,进阶的书为深入理解C++对象模型,这本书讲解了C++类...

2018-01-13 09:54:38 218

转载 C/C++内存对齐详解

 什么是内存对齐还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。 //32位系统#include<stdio.h>struct{ int x; char y;}...

2018-01-10 20:53:33 365

转载 设计模式C++实现(9)——命令模式

一、简介         Command命令模式为了解决的问题是:当系统请求繁多复杂时,将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的ConcreteCommand类(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间的解耦。         Command 模式的典型结构图为:       Command模式结构图中

2018-01-08 22:50:03 202

转载 设计模式C++实现(8)——桥接模式

一、简介        Bridge模式是为了解决将将抽象部份与它的实现部分分离,即将抽象(Abstraction)与实现(AbstractionImp)分离,使得二者可以独立地变化,从而尽可能地提高系统模块内部的内聚(Cohesion)、尽可能降低模块间的耦合(Coupling)。        Bridge桥接模式号称设计模式中最难理解的模式之一,关键就是这个抽象和

2018-01-05 23:08:43 211

转载 懒汉式单例和饿汉式单例优缺点

1、时间和空间比较上面两种写法:懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间。2、线程安全(1)从线程安全性上讲,不加同

2018-01-04 23:03:28 6395 2

转载 C++的单例模式与线程安全单例模式(懒汉/饿汉)

1 教科书里的单例模式  我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。  上代码:  123456

2018-01-04 22:47:57 149

转载 设计模式C++实现(7)——迭代器模式

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。同时需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪 一项等统一接口。迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让

2018-01-04 22:21:55 144

转载 设计模式C++实现(6)——备忘录模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍备忘录模式的实现。       备忘录模式:

2018-01-03 22:28:53 205

空空如也

空空如也

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

TA关注的人

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