摘要: 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的, 阅读全文
posted @ 2017-06-13 14:35 不会就问咯 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 分类: 设计模式(21) 分类: 设计模式(21) 目录(?)[+] 目录(?)[+] 目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Singleton(单例) 阅读全文
posted @ 2017-06-13 14:33 不会就问咯 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 今天依然在放假中,在此将以前在学校写的四叉树的东西拿出来和大家分享。 四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割。四叉树的结构比较简单,并且当空间数据对象分布比较均匀时,具有比 阅读全文
posted @ 2017-06-13 14:30 不会就问咯 阅读(1146) 评论(0) 推荐(0) 编辑
摘要: 1、 概述 在进行算法设计时,我们常用的两种线性数据结构是数组和链表。它们各有优缺点。数组特点是元素在内存中紧挨着存储,因而优点是定位快(O(1)),缺点是插入删除慢(O(n));而链表则不同,它通过指针将不同位置的元素链接起来,因而优缺点与数组正好相反:定位慢(O(n)),插入删除快(O(1))。 阅读全文
posted @ 2017-06-13 14:29 不会就问咯 阅读(552) 评论(0) 推荐(0) 编辑
摘要: 1、 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。 Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”。 Trie树可以利用字符串的公共前缀来节约 阅读全文
posted @ 2017-06-13 14:26 不会就问咯 阅读(621) 评论(0) 推荐(0) 编辑
摘要: 1、 概述 并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 2、 基本操作 并查集是一种非常简单的数据结构,它主要涉及两个基本操作,分别为: A. 合并两个不相交集合 B. 判断两个元素 阅读全文
posted @ 2017-06-13 14:23 不会就问咯 阅读(560) 评论(0) 推荐(0) 编辑
摘要: 1、概述 树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,怎样才能快速地获取连续几个数的和? 2、树状数组基本操作 传统数组(共n个元素)的元素修改和连续元素 阅读全文
posted @ 2017-06-13 14:22 不会就问咯 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 1、 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Binary Sort Tree)能够支持多种动态集合操作,它可以用来表示有序集合、建立索引等,因而在实际应用中,二叉排序树是一种非常重要的数据结构。 从算法复杂度角度考虑,我们知道,作用于二叉查找树上的基本操作(如查找 阅读全文
posted @ 2017-06-13 14:20 不会就问咯 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 后缀数组是一种解决字符串问题的有力工具。相比于后缀树,它更易于实现且占用内存更少。在实际应用中,后缀数组经常用于解决字符串有关的复杂问题。 本文大部分内容摘自参考资料[1][2]。 2. 后缀数组 2.1 几个概念 (1)后缀数组SA 是一个一维数组,它保存1..n 的某个排列SA[1] 阅读全文
posted @ 2017-06-13 14:19 不会就问咯 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级。Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质。因而,Treap=tree+heap。这里需要注意的是,Treap并不是二叉堆,二叉堆必须是完全二叉树,而Treap 阅读全文
posted @ 2017-06-13 14:18 不会就问咯 阅读(443) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树种查找、插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一 阅读全文
posted @ 2017-06-13 14:17 不会就问咯 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用。本文介绍了位图的实现方法及其应用场景。 2. 位图实现 (1)自己实现 在位图中,每个元素为“0”或“1”,表示其对应的元素不存在或者存在。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 阅读全文
posted @ 2017-06-13 14:16 不会就问咯 阅读(619) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 红黑树是一种自平衡二叉查找树。它的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对 阅读全文
posted @ 2017-06-13 14:15 不会就问咯 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 1、概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,它基本能保证每个操作的复杂度为O(lgN)。 2、线段树基本操作 线段树的基本操作主要包括构造线段树,区间查询和区间修改。 (1) 线段树构造 首先介绍构造线段树的方法:让根节点表示 阅读全文
posted @ 2017-06-13 14:14 不会就问咯 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。 2. 堆的基本操作 堆是一棵完全二叉树,高度为O(lg n),其基本操作至多与树的高度成正比。在介绍堆的基本 阅读全文
posted @ 2017-06-13 14:11 不会就问咯 阅读(512) 评论(0) 推荐(0) 编辑
摘要: 我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子。 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸。先来看看经典的三柱汉诺塔。 一、三柱汉诺塔(Hanoi_Three): 我想大家对于三柱汉诺塔的理解以及算法的实现应该是很熟练了。 我在这里简单的过一遍三柱汉诺塔 阅读全文
posted @ 2017-06-13 14:09 不会就问咯 阅读(1069) 评论(0) 推荐(0) 编辑
摘要: A*算法 是一种启发式的搜索算法。 了解BFS、DFS或者Dijkstra算法的人应该知道。这些算法都是一种向四周盲目式搜索的方法。 启发式搜索: 启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在 阅读全文
posted @ 2017-06-13 14:09 不会就问咯 阅读(416) 评论(0) 推荐(0) 编辑
摘要: 这篇文章是David MacKay利用信息论,来对快排、堆排的本质差异导致的性能差异进行的比较。 信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具。 从信息论的角度来分析算法效率是一件很有趣的事,它给我们分析排序算法带来了一种新的思路。 运用了信息论的概念,我们很容易理解为什么快排的速度 阅读全文
posted @ 2017-06-13 14:08 不会就问咯 阅读(563) 评论(0) 推荐(0) 编辑
摘要: 本文主要讲述KMP已经KMP的一种改进方法。若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经得到的部分匹配的结果将模式向右滑动尽可能远的一段距离后,继续进行比较。 设S为目标串,T为模式串,设 阅读全文
posted @ 2017-06-13 14:07 不会就问咯 阅读(1694) 评论(0) 推荐(0) 编辑
摘要: 摘要 本文论述了在算法分析领域一个重要问题——时间复杂度分析的基础内容。本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导。从而帮助大家从本质上认清这个概念。前言 通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法 阅读全文
posted @ 2017-06-13 14:06 不会就问咯 阅读(499) 评论(0) 推荐(0) 编辑