代码改变世界

随笔分类 -  数据结构和算法

快速排序及优化

2012-08-06 17:27 by coodoing, 1167 阅读, 收藏, 编辑
摘要: 快速排序(Qucik Sort)可以说是应用最广泛的排序算法之一。它的基本思想是分治法:选择一个pivot(中轴点),将小于pivot放在左边,将大于 pivot放在右边,针对左右两个子序列重复此过程,直到序列为空或者只有一个元素。实现快速排序的具体过程如下(采用左端点做pivot(《算法导论》):数组划分:Partition(关键,它对数组A[p..r]进行就地重排:将小于pivot放在左边,将大于 pivot放在右边)具体算法实现:quickSort(int[] arr, int low, int high) 1: static void quickSort(int[] arr, i... 阅读全文

归并排序

2012-08-05 19:41 by coodoing, 405 阅读, 收藏, 编辑
摘要: 1、算法介绍 归并排序(Merging Sort)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的;然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。2、算法动画演示3、算法步骤1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。2、设定两个指针,最初位置分别为两个已经排序序 阅读全文

【转】计算机科学经典论文

2012-08-04 22:19 by coodoing, 414 阅读, 收藏, 编辑
摘要: 从Jao的Programming Musing 看到的:Babar Kazar 整理了一堆经典论文。Jao强烈建议每个严肃的程序员读每篇论文,说它们都或多或少有意思。粗粗扫了一下,很多论文都没读过。挑了些俺多少知道一点的介绍。· An axiomatic basis for computer programming C. A. R. Hoare Tony Hoare名下的公理化语义(Axiomatic Semantics)。著名的Hoare Triples, P{C}Q, 就是从这里来的。论文不长,双列6页。前辈们就是这样的,6页纸就能开宗立派。不像俺,6页纸连介绍部分都写不周全。哪 阅读全文

计数排序,基数排序和桶排序

2012-08-04 20:11 by coodoing, 12664 阅读, 收藏, 编辑
摘要: 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是O(n)。这些排序因为其待排序元素本身就含有了定位特征,因而不需要比较就可以确定其前后位置,从而可以突破比较排序算法时间复杂度O(nlgn)的理论下限。计数排序(Counting sort) 计数排序(Counting sort)是一种稳定的排序算法。计数排序是最简单的特例,由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存,适用性不高。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。. 阅读全文

位图法

2012-08-04 13:26 by coodoing, 1410 阅读, 收藏, 编辑
摘要: 判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。位图法比较适合于这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的新数组,然后再次扫描原数组,遇到几就给新数组的第几位置上1。如遇到5就给新数组的第六个元素置1,这样下次再遇到5想置位时发现新数组的第六个元素已经是1了,这说明这次的数据肯定和以前的数据存在... 阅读全文

堆排序

2012-08-03 17:12 by coodoing, 876 阅读, 收藏, 编辑
摘要: 1、堆排序定义 n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质): (1) ki≤K2i且ki≤K2i+1 (2)Ki≥K2i且ki≥K2i+1(1≤i≤ ) 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 大顶堆和小顶堆 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。 注意: ①堆中... 阅读全文

分支限界法-01背包问题

2012-08-02 22:47 by coodoing, 37070 阅读, 收藏, 编辑
摘要: 1、分支限界法介绍 分支限界法类似于回溯法,也是在问题的解空间上搜索问题解的算法。一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间中满足约束条件的所有解;而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。 由于求解目标不同,导致分支限界法与回溯法对解空间的... 阅读全文

回溯算法-01背包问题

2012-08-02 19:10 by coodoing, 4059 阅读, 收藏, 编辑
摘要: 1、问题描述 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。因此,该问题称为0-1背包问题。 2、算法分析 0-1背包问题是子集选取问题。一般情况下,0-1背包问题是NP难的。0-1... 阅读全文

动态规划-01背包问题

2012-08-02 19:05 by coodoing, 1299 阅读, 收藏, 编辑
摘要: 1、问题描述 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。因此,该问题称为0-1背包问题。 2、算法分析 0-1背包问题的最优子结构,设(y1,y2,...,yn)是所给0-1背包... 阅读全文

优雅数据结构-BloomFilter

2012-07-31 20:14 by coodoing, 337 阅读, 收藏, 编辑
摘要: Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。一. 实例为了说明Bloom Filter存在的重要意义,举一个实例:假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL。给一个URL,怎样知道蜘蛛是否已经访问过呢?稍微想想,就会有如下几种方案:1. 将访问过的URL保存到数据库。2. 用HashSet将访问过的URL保存起来。那只需接近O(1)的代价就可以 阅读全文

回溯算法-8皇后问题

2012-07-31 19:53 by coodoing, 528 阅读, 收藏, 编辑
摘要: 8皇后问题表述:在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。求不同的解的个数。 解向量:(x1, x2, … , xn) 显约束:xi = 1,2, … ,n 隐约束: 1)不同列:xi != xj ... 阅读全文

回溯算法-算法介绍

2012-07-31 17:24 by coodoing, 1922 阅读, 收藏, 编辑
摘要: 回溯法 1、有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。 2、回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。 3、回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含(剪枝过... 阅读全文

贪心算法-单源最短路径

2012-07-31 17:09 by coodoing, 2042 阅读, 收藏, 编辑
摘要: 给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其它各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。Dijkstra算法是解单源最短路径问题的贪心算法。其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u 阅读全文

贪心算法-最优装载问题

2012-07-31 10:20 by coodoing, 5442 阅读, 收藏, 编辑
摘要: 贪心选择算法为算法分析中一种常用算法,通过一系列的选择来得到一个问题的解。它所作的每一个选择都是当前状态下某种意义的最好选择,即贪心选择。希望通过每次所作的贪心选择导致最终结果是问题的一个最优解。这种启发式的策略并不总能奏效,然而在许多情况下确能达到预期的目的。对于可利用贪心算法解决的问题需要同时满足:最优子结构性质和贪心选择性质。1.贪心选择性质所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。在动态规划算法中,每步所作的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能 阅读全文

动态规划-最长公共子序列的备忘录算法

2012-07-30 17:25 by coodoing, 1530 阅读, 收藏, 编辑
摘要: LCS问题是常见的可利用动态规划算法进行解决的问题。这里利用备忘录算法对求解过的子问题进行备份存储,避免了相同子问题的重复求解。LCS问题子问题的递归关系式如下:具体代码实现如下: 1: static int LCS_Memo(int[][] c,char[] X,char[] Y,int i,int j) 2: { 3: if( (i == 0) || (j == 0) ) 4: c[i][j]=0; 5: else if(X[i-1] == Y[j-1]) 6: ... 阅读全文

动态规划-矩阵连乘

2012-07-30 16:41 by coodoing, 707 阅读, 收藏, 编辑
摘要: 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…,n-1。考察这n个矩阵的连乘积A1A2…An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,则可以依此次序反复调用2个矩阵相乘的标准算法(有改进的方法,这里不考虑)计算出矩阵连乘积。若A是一个p×q矩阵,B是一个q×r矩阵,则计算其乘积C=AB的标准算法中,需要进行pqr次数乘。 矩阵连乘积的计算次序不同,计算量也不同,举例如下: 先考察3个矩阵{A1,A2,A3}连乘,设这三个矩阵的维数分别为10 阅读全文

部分面试题分析

2012-07-29 20:24 by coodoing, 391 阅读, 收藏, 编辑
摘要: 1、两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]; 要求: 1.不准用除法运算 2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等)3.满足时间复杂度O(n),空间复杂度O(1) 1: private static int[] transform(int[] a, int[] b) { 2: int i = 0; 3: b[b.length - 1] = 1; 4: for (i = b.lengt... 阅读全文

冒泡排序

2012-07-29 13:39 by coodoing, 291 阅读, 收藏, 编辑
摘要: 1、原理介绍冒泡排序算法也是一种非常简单的排序算法,第一趟排序:n个数中,K1开始,依次比较两个相邻的关键字Ki和Ki+1(i=1,2,…,n-1),若Ki>Ki+1,则交换相应记录Ri和Ri+1的位置, 否则,不进行交换。经过这样一遍处理后,其中关键字最大的记录移到了第n个位置上。第二趟排序:对前面的n-1个记录进行第2遍排序,重复上述处理过程,第2遍之后,前n-1个记录中关键字最大的记录移到了第n-1个位置上,继续进行下去,直到不需要再交换记录为止。(最少比较次数为n-1是因为设置了change变量)2.可视化演示具体实现:First Pass: ( 5 1 4 2 8 ) ( 1 阅读全文

选择排序

2012-07-29 13:17 by coodoing, 226 阅读, 收藏, 编辑
摘要: 1、算法原理介绍: 选择排序思路,第一趟排序:从n个数中选择最小的1个放在第一个位置,第二趟:从剩下的n-1个数中选择一个最小的数放在第2个位置,依次类推。冒泡排序是比较相邻的交换相邻的,而选择排序不是。 2、可视化操作: 3、java代码 1: static void selectionSort(int[] arr,int len) 2: { ... 阅读全文

【转】各种树:trie树、B树、B-树、B+树、B*树

2012-07-29 12:56 by coodoing, 559 阅读, 收藏, 编辑
摘要: 红黑树rbtree 二叉排序树map 就是采用红黑树存储的,红黑树(RB Tree)是平衡二叉树,其优点就是树到叶子节点深度一致,查找的效率也就一样,为logN.在实行查找,插入,删除的效率都一致,而当是全部静态数据时,没有太多优势,可能采用hash表各合适。hash_map是一个hash table占用内存更多,查找效率高一些,但是hash的时间比较费时。总 体来说,hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小, hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元 阅读全文