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

作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4.4节中。 1. 引言     本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,...

2018-01-25 22:40:10

阅读数:173

评论数:0

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

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

2018-01-24 19:25:53

阅读数:91

评论数:0

快速排序

在企业的面试或是考研的面试中,快速排序可以说是出现频率最高的一个问题,本文就快排做一个总结以帮助大家理解。 快速排序介绍 快速排序(Quick Sort)使用分治法策略。它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数...

2018-01-21 23:17:30

阅读数:52

评论数:0

直接插入排序

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

2018-01-21 21:14:11

阅读数:37

评论数:0

冒泡排序法和选择排序法

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

2018-01-21 20:18:49

阅读数:59

评论数:0

选择排序

      选择排序介绍 选择排序(Selection sort)是一种简单直观的排序算法。其基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均...

2018-01-21 20:17:08

阅读数:57

评论数:0

冒泡排序

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

2018-01-21 19:24:46

阅读数:42

评论数:0

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

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

2018-01-19 19:10:32

阅读数:143

评论数:0

Manacher 算法

0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。 如果一个字符串正着读和反着读是一样的,那它就是回文串。下面是一些回文串的实例: 12321 a aba abba aaaa tattarrattat(牛津英语词典中最长的回文单词) 1. Brute-f...

2018-01-18 19:27:08

阅读数:73

评论数:0

字符串匹配的KMP算法

字符匹配场景 字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morri...

2018-01-15 19:05:12

阅读数:42

评论数:0

KMP字符串模式匹配详解

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

2018-01-15 19:00:42

阅读数:64

评论数:0

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

左值、右值 在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该...

2018-01-14 17:40:47

阅读数:46

评论数:0

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

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

2018-01-14 16:25:04

阅读数:37

评论数:0

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

在C++对象模型之内存布局(1)一文中分别讲了无多态和有多态时单继承的对象内存布局,这篇文章将深入讲解多重继承和多继承.多重继承理论讲解:多重继承,顾名思义,就是继承关系大于2,即至少有父类,子类,孙子类三代关系,先定义以下三个类:类B公有继承A,类C公有继承B,图一是类C的内存布局(图一)其实多...

2018-01-13 10:08:37

阅读数:37

评论数:0

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

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

2018-01-13 09:54:38

阅读数:46

评论数:0

C/C++内存对齐详解

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

2018-01-10 20:53:33

阅读数:51

评论数:0

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

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

2018-01-08 22:50:03

阅读数:40

评论数:0

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

一、简介         Bridge模式是为了解决将将抽象部份与它的实现部分分离,即将抽象(Abstraction)与实现(AbstractionImp)分离,使得二者可以独立地变化,从而尽可能地提高系统模块内部的内聚(Cohesion)、尽可能降低模块间的耦合(Coupling)...

2018-01-05 23:08:43

阅读数:49

评论数:0

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

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

2018-01-04 23:03:28

阅读数:859

评论数:0

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

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

2018-01-04 22:47:57

阅读数:50

评论数:0

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