倒排索引
摘要:1、数据库中的索引是对字段的内容操作,可以认为是对字段取值建一个排序结构,这样在查找的时候就不用遍历查找了。2、考虑现实当中的一种需求,对于某个关键字我想知道在哪个文档出现,上面的索引技术不能解决这个问题。怎么办?3、这要使用倒排索引,对每个关键字建立一个索引,标示在哪个文档里出现。比如:中国 对应...
阅读全文
posted @
2015-04-19 21:44
Andy Niu
阅读(200)
推荐(0) 编辑
排序算法
摘要:#ifndef SORT_H__#define SORT_H__#include namespace Niuzb{ namespace Algorithm { template void Swap(T& lhs,T& rhs) { T tmp(lhs); lhs = rhs; rh...
阅读全文
posted @
2015-03-08 10:47
Andy Niu
阅读(217)
推荐(0) 编辑
二叉树的遍历
摘要:structNode{intvalue;Node*left;Node*right;Node(intval):value(val),left(NULL),right(NULL){}};#include#include#includeusingnamespacestd;voidpreOrder(Node...
阅读全文
posted @
2015-03-07 16:33
Andy Niu
阅读(282)
推荐(0) 编辑
逻辑结构和物理结构
摘要:1、逻辑结构分为集合结构,线性结构(1对1),树形结构(1对多),图形结构(多对多)2、物理结构分为顺序存储结构(基于连续内存),链式存储结构(基于节点)。注:B树也是树形结构,是二叉搜索树的扩展。二叉搜索树节点本身只有一个元素,有两个孩子。B树是多路查找树,节点本身有多个元素,交叉有多个指针指向...
阅读全文
posted @
2015-02-07 10:17
Andy Niu
阅读(534)
推荐(0) 编辑
计算机整数的表示
摘要:1、无论是int,还是uint在底层的存储方式是一样的,都会存在溢出和借位的现象,可以认为是个环,有以下几个情况: a、两个数相加,溢出会变成一个小的数。 b、两个数相减,不够减,借一位。 c、求一个负数,拿0减去对应的正数。注意:正6是0x0000 0006;负6可不是0x1000 0006,而是0 - 0x0000 0006 = 0xffff fffa2、对于int,uint存储方式相同,不同的只是编译器把它当成什么数来解释。比如: int a = 0xffff fff9; unsigned int b = 0xffff fff9; 对于a,把它当成int解释,就是-7;对于b...
阅读全文
posted @
2014-03-12 15:30
Andy Niu
阅读(403)
推荐(0) 编辑
遍历结果推导二叉树
摘要:1、根据前序与中序,推导二叉树。举例来说:前序ABC,中序CAB,由前序直到A为根节点,由中序知道A的左边为左孩子,右边为右孩子。C为左孩子,B为右孩子。2、思考,由前序和后续,能否退出二叉树? 前序ABC,后序CBA。由前序ABC知道A为根节点,后面分成两块,每一块都是前序,前面一块为左孩子,后面一块为右孩子。由后序知道A为根节点,前面分成两块,每一块都是后序,前面一块为左孩子,后面一块为右孩子。都是分成两块,对于分成的两块,前面一块元素集合相同,后面一块元素集合相同。注意,集合不考虑元素的顺序。这样,就有两种情况: a、前面一块为BC,后面一块为空 b、前面一块为空,后面一块为BC ...
阅读全文
posted @
2013-11-29 19:07
Andy Niu
阅读(1778)
推荐(0) 编辑
二叉树非递归遍历
摘要:1、二叉树递归遍历很简单,以前序遍历为例说明:1 void PrefixOrder(Node* node) 2 {3 if(node!=NULL)4 {5 coutvaluelchild);7 PrefixOrder(root->rchild);8 }9 } 中序遍历和后序遍历类似。2、考虑二叉树非递归遍历,思路:前序遍历特点,访问当前节点,然后访问左孩子,左孩子有孩子,继续访问左孩子的左孩子节点,直到没有左孩子,访问右孩子。因此。非递归遍历的思路就是,使用while,记录当前节点,往左一条路走到底,然后原路后退,访问右节点。
阅读全文
posted @
2013-11-29 18:41
Andy Niu
阅读(214)
推荐(0) 编辑
左闭合区间
摘要:1、什么是左闭合区间? [first,last),就是包含first,但是不包含last的区间范围。2、为什么使用左闭合区间? 使用左闭合区间有两个方便的性质: a、first == last,说明没有区间元素 b、first!=last,说明区间至少有一个元素,而且多次first++,最终可以到达last c、查找target,返回的位置==last,说明在范围内没有找到target 编程中使用左闭合区间,更重要的是,提供了一致性。我们知道对于数组,和基于连续内存的集合,假如元素个数为5,可访问的范围是[0,5),注意下标5并不是有效元素。
阅读全文
posted @
2013-11-29 17:01
Andy Niu
阅读(1138)
推荐(0) 编辑
【转】二叉树的非递归遍历
摘要:原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现void
阅读全文
posted @
2013-11-15 17:49
Andy Niu
阅读(193)
推荐(0) 编辑
【转】Dijkstra算法(单源最短路径)
摘要:原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。 假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j
阅读全文
posted @
2013-11-15 17:43
Andy Niu
阅读(655)
推荐(0) 编辑
Dijkstra最短路径算法
摘要:1、现讲最优子结构性质,所谓的最有子结构性质是指:一个问题的最优解包含子问题的最优解。最短路径满足最优子结构。MinPath(i,j)表示i与j之间的最短路径。假如MinPath(i,j)={Vi...Vk...Vs...Vj},则MinPath(k,s)={Vk...Vs}。反证法很容易证明:如果MinPath(k,s)≠{Vk...Vs},说明存在一个更短的路径,那么{Vi...Vk...Vs...Vj}也不是最短路径,这与已知条件矛盾。2、思路:Dijkstra最短路径算法满足最优子结构性质,因此每个点只需要知道自己的前驱节点,逆序排一下,就知道了路上的节点。同时,还要记录最短距离。 .
阅读全文
posted @
2013-11-15 17:41
Andy Niu
阅读(536)
推荐(0) 编辑
插入排序
摘要:1、思路:假定前面的序列已经有序,当前元素插入前面有序的序列。从后往前遍历,比当前元素大的,往后移,为当前元素腾出位置。2、代码: 1 template 2 void InsertSort(vector& vec) 3 { 4 for(int i=1; i0 && target 2 int FindPosition(const vector& vec,int lhs,int rhs,T target) 3 { 4 if(rhs-lhs ==1) 5 { 6 if(target>vec[lhs]) 7 { 8 re...
阅读全文
posted @
2013-11-14 19:32
Andy Niu
阅读(280)
推荐(0) 编辑
选择排序
摘要:1、思路:对于当前第一个数,假定它是最小的,遍历后面的数,发现比当前数还小的,进行交换,这样就保证了当前第一个为最小的。2、代码: 1 template 2 void SelectSort(vector& vec) 3 { 4 for(int i=0; i 2 void SelectSort_2(vector& vec) 3 { 4 for(int i=0; i< vec.size();i++) 5 { 6 int index_Min = i; 7 for(int j=i+1;j < vec.size();j++) 8 ...
阅读全文
posted @
2013-11-14 19:27
Andy Niu
阅读(273)
推荐(0) 编辑
冒泡排序
摘要:1、思路:内层循环,比较当前元素与相邻的下一个元素,顺序不对,进行交换,这样就把最大的数沉到底部。外层循环,对于每次剩余的数,把最大的沉到底部。2、源码: 1 template 2 void BubbleSort(vector& vec) 3 { 4 for(int i=0; ivec[j+1]) 9 {10 swap(vec,j,j+1);11 }12 }13 }14 }
阅读全文
posted @
2013-11-14 19:19
Andy Niu
阅读(229)
推荐(0) 编辑
快速排序
摘要:1、思路不对,编出的代码肯定不对,因此编码之前,一定要现在草稿纸上,根据思路写出伪码。2、快速排序的思路:选一个目标,把数组分成两块,左边一块都比目标小,右边一块都比目标大。对每一块,递归做同样的事情,递归的出口时,左起点大于等于右起点。3、递归的形参表为:数组和排序的区间,排序区间也就是左起点和右起点,QuickSort(int a[], int lhs,int rhs),递归出口:if(lhs>=rhs) return;4、方法1:思路是对排序的区间做一个拷贝,取第一个为目标,从第二个开始,遍历排序区间,比目标小,从前往后。以此放在原数组区间的左边,比目标大,从后向前,一次放在原数组
阅读全文
posted @
2013-11-10 10:51
Andy Niu
阅读(399)
推荐(0) 编辑
map的实现
摘要:1、map的实现是使用平衡树,AVL树或者红黑树。2、在无序的情况下,查找为常数时间。有序的时候,查找为对数时间。二叉排序树(BST)就是为了解决这个问题。3、但是,极端情况下,BST的查找效率退化到常数时间,考虑极端不平衡的二叉树,每个节点只有左孩子。4、为了解决上面的问题,就要想办法对BST进行调整,保证查找效率。5、AVL的思路是:每个节点两个孩子节点的高度相差不大于1,这样就保证了BST比较平衡。6、红黑树的思路是:跟和叶子都是黑色,红的两个孩子都是黑色,每条路的黑色个数一样。这样,就保证了最长路径与最短路径的比小于2,也就保证了相对平衡。为什么红黑树可以保证最长路径与最短路径的比小于
阅读全文
posted @
2013-11-06 20:52
Andy Niu
阅读(622)
推荐(0) 编辑
【转】理解红黑树
摘要:树型结构一直是一种很重要的数据结构, 我们知道二叉查找树BST提供了一种快速查找, 插入的数据结构. 相比散列表来说BST占用空间更小,对于数据量较大和空间要求较高的场合, BST就显得大有用处了.BST的大部分操作平均运行时间为O(logN), 但是如果树是含N个结点的线性链,则最坏情况运行时间会变为O(N). 为了避免出现最坏情况我们给它增加一些平衡条件, 使它的高度最多为2log(N+1), 最坏情况下运行是间花费也接近O(logN), 这就是我下面要讨论的红黑树.由于红黑树的插入和删除是相对复杂的操作,所以这里我将重点讨论这两种操作.AVL树在理解红黑树之前最好先来看看AVL树, 相比
阅读全文
posted @
2013-11-04 21:08
Andy Niu
阅读(643)
推荐(0) 编辑
数据结构
摘要:1、数据结构分为逻辑结构和物理结构。2、逻辑结构:元素之间的关系,分为: a、集合结构:在同一个集合中,元素之间没关系。 b、线性结构:元素一对一的关系 c、树形结构:元素一对多的关系 d、图形结构:元素多对多的关系3、物理结构:元素的存放形式 a、顺序存放:元素存放在连续的存储单元里 b、链式存放:元素存放在任意的存储单元里,通过指针,知道与自己关联的元素。
阅读全文
posted @
2013-10-24 18:58
Andy Niu
阅读(269)
推荐(0) 编辑
哈希表
摘要:1、哈希表解决什么问题? 假设有一组记录,每条记录都是学生名,成绩的键值对,在一般的线性表中,每条记录的存放是没有规律的。如果要找Andy的成绩,因为不知道Andy这条记录的存放位置,必须遍历集合,逐个比较,找到Andy这条记录,取出成绩。时间复杂度为O(N),效率很低。哈希表就是解决这个问题的。2、如何解决的? 上面问题的关键是,根据学生名不能确定存放位置,哈希表是这样做的:设计一个映射函数,把学生名映射到存放的地址。这样就行了,给我一个学生名,我只要根据映射函数计算一下,就知道了存放位置,直接去那个地方去数据,时间复杂度为O(1)。同样当插入记录的时候,根据映射函数计算一下,这条记录应..
阅读全文
posted @
2013-10-24 18:46
Andy Niu
阅读(449)
推荐(0) 编辑
最短路径算法(Dijkstra)
摘要:1、建立矩阵,记录任意两点间的直接距离;2、两个集合,一个集合记录到每个点的最短路径,一个记录前驱节点;3、主循环,每次找当前点与其他点的距离,记录下最短距离和前驱节点,然后看看通过前驱节点和最短路径是否更近,修正最短路径和前驱节点。
阅读全文
posted @
2013-09-25 18:33
Andy Niu
阅读(433)
推荐(0) 编辑