随笔分类 -  DS&Algorithms

Useful and efficient data structures and algorithms comes handy when needed. C++ or Java implementation and a brief explanation.
摘要:原文:http://blog.csdn.net/yysdsyl/article/details/4226630 阅读全文
posted @ 2015-05-31 09:47 rldts 阅读(125) 评论(0) 推荐(0) 编辑
摘要:总结:归约(或别的什么叫法):如果解决了问题A,就能用解决A的方法来解决问题B,那么我们说问题B可以归约为/到问题A,本文记为[B]<[A]。其含义就是问题A的求解复杂度比问题B要高,比如说A问题是求解1元2次方程,而B问题是求解1元1次方程。归约具有传递性。P问题:多项式时间内可求解的问题。P代表... 阅读全文
posted @ 2015-05-28 10:23 rldts 阅读(735) 评论(0) 推荐(0) 编辑
摘要:具体的就不在这里说了,如果有兴趣的可以把我的工程包下载下来看,留个URLhttp://pan.baidu.com/s/1bnes1HX 阅读全文
posted @ 2014-09-24 22:16 rldts 阅读(227) 评论(0) 推荐(0) 编辑
摘要:在一个由n个元素组成的集合中,第i个“顺序统计量(order statistic)”是该集合中第i小的元素。例如,在一个由n个元素组成的集合中,最小值是第1个顺序统计量,最大值是第n个顺序统计量。而“中位数(median)”总是出现在low((n+1)/2)或者high((n+1)/2)处,其中... 阅读全文
posted @ 2014-09-16 19:35 rldts 阅读(761) 评论(0) 推荐(0) 编辑
摘要:参考资料:算法导论note1:桶排序是另外一种以O(n)或者接近O(n)的复杂度排序的算法. 它假设输入的待排序元素是等可能的落在等间隔的值区间内.一个长度为N的数组使用桶排序, 需要长度为N的辅助数组. 等间隔的区间称为桶, 每个桶内落在该区间的元素. 桶排序是基数排序的一种归纳结果note2:待... 阅读全文
posted @ 2014-09-13 16:41 rldts 阅读(279) 评论(0) 推荐(0) 编辑
摘要:参考资料:算法导论性能:给定n个d位数,每一个数位可以取k种可能的值,基数排序算法时间为O(d(n+k)),当d为常数,k=O(n)时,基数排序为O(n)时间优点:稳定排序缺点:不是原地排序实现代码(用户需要提供一个RSHelper的实现即可完成排序,本例给出一个随意的实现仅作示意)RadixSor... 阅读全文
posted @ 2014-09-12 22:42 rldts 阅读(626) 评论(0) 推荐(0) 编辑
摘要:算法导论:任意一个比较排序算法,在最坏的情况下,至少要做n*lg(n)次的比较,因此堆排序与归并排序是渐近最优的比较排序算法但计数排序、基数排序和桶排序都不采用比较的方式来确定元素的顺序,因此下界n*lg(n)对它们并不适用计数排序假设被排序的元素都在范围[0, k]中,k为正整数,当k=O(n)的... 阅读全文
posted @ 2014-09-09 19:15 rldts 阅读(183) 评论(0) 推荐(0) 编辑
摘要:归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))的额外空间,时间复杂度为O(nlog(n))NOTE:新数组的创建和数据拷贝是硬伤,我尝试了一下只申请一个workspace,应该还不错吧,没有理论论证代码: 1 package sorts; 2 3 import java.... 阅读全文
posted @ 2014-09-08 14:07 rldts 阅读(115) 评论(0) 推荐(0) 编辑
摘要:参考资料:算法导论http://blog.csdn.net/insistgogo/article/details/7785038http://blog.csdn.net/michealtx/article/details/7181906http://www.oschina.net/code/snip... 阅读全文
posted @ 2014-09-07 14:31 rldts 阅读(198) 评论(0) 推荐(0) 编辑
摘要:1 package sorts; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Random; 6 7 public class PriorityQueue> { // mi... 阅读全文
posted @ 2014-09-06 12:53 rldts 阅读(284) 评论(0) 推荐(0) 编辑
摘要:堆的定义如下:n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。"ki=k(2i),ki>=k(2i+1).(i=1,2,…,[n/2])"若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,若完全二叉树中每一个节点的值都大于... 阅读全文
posted @ 2014-09-05 18:48 rldts 阅读(338) 评论(0) 推荐(0) 编辑
摘要:参考资料:http://algs4.cs.princeton.edu/33balanced/RedBlackBST.java.html算法导论第13章http://blog.csdn.net/skylinesky/article/details/6610950代码:(我添上了toString,以及改... 阅读全文
posted @ 2014-09-01 17:13 rldts 阅读(277) 评论(0) 推荐(0) 编辑
摘要:package foo;import java.io.File;import java.io.FileNotFoundException;import java.util.Queue;import java.util.Scanner;import java.util.Stack;import jav... 阅读全文
posted @ 2014-06-28 15:19 rldts 阅读(329) 评论(0) 推荐(0) 编辑
摘要:package foo;import java.util.Arrays;public class Main { /** * 二分查找 * @param key 搜索的目标 * */ private static int binarySearch(int[]... 阅读全文
posted @ 2014-06-26 21:10 rldts 阅读(189) 评论(0) 推荐(0) 编辑
摘要:插入排序的效率:O(N*N), 比较N*N/4,复制N*N/4,插入排序在随机数的情况下,比冒泡快一倍,比选择稍快,在基本有序的数组中,插入排序几乎只需要O(N),在逆序的情况下,并不比冒泡快。代码: 1 package sorts; 2 3 public class InsertionSort ... 阅读全文
posted @ 2014-06-18 17:29 rldts 阅读(183) 评论(0) 推荐(0) 编辑
摘要:package foo;import java.util.Arrays;public class Main { public static void selectionSort(int[] a, int len) { int in, out, min; fo... 阅读全文
posted @ 2014-06-17 17:54 rldts 阅读(160) 评论(0) 推荐(0) 编辑
摘要:package foo;public class Main { public static void bubbleSort(int[] a, int len) { int in, out; for (out = len - 1; out > 0; --out) { ... 阅读全文
posted @ 2014-06-16 19:10 rldts 阅读(150) 评论(0) 推荐(0) 编辑
摘要:根据中序遍历的定义:如果要访问NodeX,则必须先访问NodeX.leftChild,访问完NodeX之后,才能访问NodeX.rightChild所以,如果给你一个二叉树的中序序列,很容易就可以画出该二叉树的图形,举个例子:0, 1, 1, 2, 2, 4, 5, 6, 8, 9是一个存放int类型数据的二叉树的中序序列,可以得到二叉树的图形如下: 9 6 4 8 2 5 1 20 1 阅读全文
posted @ 2014-03-26 09:59 rldts 阅读(950) 评论(0) 推荐(0) 编辑
摘要:参考资料:http://blog.csdn.net/e3399/article/details/7543861如果要求C(n,m),例如C(5,2)=5!/(2!*3!)=10,就参考http://www.cnblogs.com/qrlozte/p/3497035.html如果要求P(n,n),例如P(3,3)=3!=6,就使用本文章提到的全排列算法如果要求P(n,m),例如P(5,2)=5!/(5-2)!=20,就先求C(n,m),然后对每一个组合求P(m,m)即可,因为P(n,m)=C(n,m)*P(m,m)1.非递归实现 next_permutation 1.1 基本思想 注:此... 阅读全文
posted @ 2013-12-30 15:10 rldts 阅读(522) 评论(0) 推荐(0) 编辑
摘要:void swap(int *a, int i, int j){ a[j] ^= a[i]; a[i] ^= a[j]; a[j] ^= a[i];}异或运算定律: 0XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 a XOR b = b XOR a // 交换律 (a XOR b) XOR c = a XOR (b XOR c) // 结合律计算过程:设a[i]为x,a[j]为y a[i] ^= a[j]; // a[i]==(x ^ y) a[j] ^= a[i]; // a[j]==(y^(x^y))==(y^... 阅读全文
posted @ 2013-12-30 13:42 rldts 阅读(399) 评论(0) 推荐(0) 编辑