![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构设计模式
文章平均质量分 84
robert_chao
欢迎关注我的博客 https://www.lelecoding.cn
展开
-
算法系列(九)平衡二叉查找树AVL树
在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。高度为 h 的 AVL 树,节点数 N 最多2^h − 1; 最少N(h)=N(h− 1) +N(h− 2) + 1。原创 2016-06-10 18:27:01 · 3529 阅读 · 0 评论 -
算法系列(八)数据结构之二叉查找树
在算法系列(七)数据结构之树的基本结构和二叉树的遍历 中介绍了基本的树结构,二叉树的实现和遍历。这篇文章重点学习一下二叉查找树。概述二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree)二叉搜索树。二叉查找树(BST)是二叉树的一个重要的应用,它在二叉树的基础上加上了这样的一个性质:对于树中的每一个节点来说,如果有左儿子的话原创 2016-06-09 01:03:14 · 3519 阅读 · 0 评论 -
算法系列(七)数据结构之树的基本结构和二叉树的遍历
一、概述在算法系列(六)数据结构之表队列和栈 一文中介绍了数据结构中的基本线性数据结构。对于大量的数据,链表访问时间太慢,而数组插入删除时间太慢。我们讨论一下数据结构树。 树结构大部分操作平均运行时间都为O(logN)二、树的定义树是由n(n>=1)个有限节点组成一个具有层次关系的集合。每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根原创 2016-06-06 22:55:21 · 3774 阅读 · 0 评论 -
算法系列(六)数据结构之表队列和栈
在http://blog.csdn.net/robertcpp/article/details/51559333一文中,我们讲了排序,这一章来介绍一下基本数据结构:表、队列、栈和它们的简单实现一、表ADT1、数组实现顺序表通过对数组操作,来直接对表进行增删查改操作,这种线性表查找某个位置的元素花费的时间为O(1),但是插入删除元素花费的时间为O(n),如果对表的操作更多的是访问操作,那原创 2016-06-04 07:50:41 · 3311 阅读 · 2 评论 -
设计模式系列(三)工厂模式
工厂模式分类简单工厂模式(simple factory):类的创建模式,又叫静态工厂方法(static factory method)模式。简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。工厂方法模式(Factory Method):一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。即定义一个创建对象的接口原创 2016-06-13 21:42:02 · 2639 阅读 · 0 评论 -
算法系列(十三)图论基本概念和拓扑排序
图的定义一个图G=(V,E),由定点的集合V,和边的集合E组成。每一条边都是一副点对(v,w),边也称作弧,边上可以有权值。如果点对是有序的,那么图就是有向的。图中的一条路径是一个顶点序列w1,w2,w3......wN,如果图中包含一条从顶点到自身的边,那么这个路径就是环。有向无环图也成为DAG如果在一个无向图中每个顶点到其它顶点都存在路径,则称这个无向图是连通的。具有这样性质的原创 2016-07-11 14:49:20 · 5482 阅读 · 0 评论 -
设计模式系列(一)单例模式
一、简单介绍单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。《设计模式》书中对单例模式动机的介绍对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Win原创 2016-06-05 11:00:42 · 6848 阅读 · 1 评论 -
算法系列(十)堆实现优先队列
堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字原创 2016-06-22 15:16:06 · 3530 阅读 · 0 评论 -
算法系列(十一)BASE64算法实现和使用说明
完整的BASE64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的43。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲器中剩下的bit用0补足。然后,每次原创 2016-07-01 10:28:52 · 7198 阅读 · 0 评论 -
设计模式系列(四)建造者模式Builder
建造者模式将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。Builder:为创建Product对象的各个部件指定抽象接口。ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。Director:构造一个使用Builer接口的对象。Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,以及将这些部件装配成最终产品的接口原创 2016-06-26 14:51:41 · 3195 阅读 · 2 评论 -
模式匹配
#include#include#includeusing namespace std; char a[1000]="abcabaabcacabaabcdefg"; //原串 char b[10]="abaabcac"; //目标串 int next[10]; //存储next值void nextj(char b[]){原创 2011-11-05 19:56:37 · 836 阅读 · 0 评论 -
算法系列(一)基本概念
一、什么是算法算法是完成一个任务所需的一系列步骤,计算机解决计算机问题,我们希望从一个计算机算法中获得两个结果,给定一个输入,它应该总能够产生该问题的正确输出结果,并且在运行该算法时,能够有效的利用资源。(出自《算法基础》)算法是为求解一个问题所需要遵循的、被清楚指定的简单指令集合。(出自《数据结构与算法分析》)二、数学基础1、如果存在常数c和n0,使得当N>=n0时,T(N)原创 2016-05-29 10:17:54 · 4917 阅读 · 0 评论 -
算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
排序算法概述排序算法比较多,分两个篇幅来讲。由易道难。先总体看一下都有哪些排序算法冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序,计数排序,基数排序,希尔排序,桶排序。排序算法分类根据排序过程中待排序文件存放的位置不同,可以把排序分为内部和外部排序两大类。在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内原创 2016-05-29 22:34:39 · 1809 阅读 · 0 评论 -
算法系列(二)查找算法--基本查找和二分查找
从n个元素中A0,A1....An-1中,找到要找到的元素x,最简单的方法是遍历n个元素,找到元素x则返回x的位置,这种算法的时间复杂度为O(n)。如果这n个元素是有序的,我们不需要从头到尾遍历一遍就可以找到要查找的元素,可以使用二分法。二分查找的时间复杂度是O(lgn)二分查找的前提是元素有序(一般是升序),基本思想是拿中间元素A[m]与要查找的元素x进行比较,如果相等,则已经找到,如果原创 2016-05-29 16:58:32 · 14962 阅读 · 1 评论 -
算法系列(四)排序算法中篇--归并排序和快速排序
在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。概述冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序算法呢?当然有了,堆排序,归并排序,快速排序,它们的时间复杂度都是O(nlogn)。堆排序使用了树结构,到目我们前还没有介绍树相关的算法,这里先分析归并排序跟快速排序。归并排序基本原理原创 2016-05-30 23:04:57 · 8828 阅读 · 0 评论 -
设计模式系列(二)原型模式
在设计模式系列(一)单例模式 中详细介绍了单例设计模式,下面一起来看一下原型模式。一、概述原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的。原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据。二、原创 2016-06-08 00:35:15 · 2544 阅读 · 0 评论 -
算法系列(五)排序算法下篇--如何超越排序算法下界
概述在算法系列(四)排序算法中篇--归并排序和快速排序一文中,我们介绍了归并排序和快速排序,最坏的情况下,最快的排序算法的时间复杂度是O(nlogn),是否有更好的算法呢?到目前为止,没有特殊的规则,O(nlogn)已经是最好的排序算法了,也就是说通用排序算法的时间复杂度下界就是O(nlogn)。如果限定一些规则,是可以打破这个下界的。下面说一下尽在O(n)时间内就能实现对数组排序的算法。原创 2016-06-01 23:57:56 · 5359 阅读 · 0 评论 -
算法系列(十二)散列
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。标准库中包括Set和Map的散列实现,即HashSet类和HashMap类。HashSet的实现直接借助了HashMap。JDK中是使用原创 2016-07-08 21:36:24 · 7075 阅读 · 0 评论