
数据结构与算法
文章平均质量分 66
FG2006
这个作者很懒,什么都没留下…
展开
-
找出数组中两个只出现一次的数字
转自:http://blog.youkuaiyun.com/ewanyou/archive/2011/05/25/6445209.aspxhttp://www.cnblogs.com/aLittleBitCool/archive/2011/04/14/2015720.html问题描述:一个数组中除了两个数字之外,其余数字均出现了两次(或偶数次)。请写出程序查找出这两个只出现一次的数字,要求时间复转载 2011-06-23 15:44:00 · 1453 阅读 · 0 评论 -
01背包问题
动态规划的基本思想:将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算。通常用来求最优解,且最优解的局部也是最优的。求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解。动态规划算法可分解成从先到后的4个步骤:1. 描述一个最优原创 2011-09-10 22:16:12 · 52394 阅读 · 19 评论 -
最长公共子序列(LCS)问题
/** * 第一步:论证是否是动态规划问题 * 首先要证明最长公共子序列问题是动态规划问题,即符合动态规划算法的两个特点:最优子结构和重叠子问题 * 最优子结构: * 记:Xi=﹤x1...xi﹥即X序列的前i个字符 (1≤i≤m)(前缀) Yj=﹤y1..原创 2011-09-10 01:59:54 · 2375 阅读 · 0 评论 -
在一个大数组中有且仅有两个数相同,怎样尽快找出这两个数(未完成)
//采用位图的方法,如果是在一个1000万大的数组中,其中只有两个数是相同的,可以在O(n)时间复杂度内找出相同的数//数组b是一块连续内存区域,用数组中的每一bit表示一个数是否存在,1表示存在,0不存在,比如,给定一个数字1025,//那么,就把b数组的第1025bit置原创 2011-09-17 15:55:25 · 7365 阅读 · 2 评论 -
字符串匹配算法
/** * KMP算法用来处理字符串匹配问题 * 原理介绍:找到匹配失败时的最合适的回退位置,而不是简单的回退到子串的第一个字符(常规的枚举查找方式,是简单的回退到子串的第一个字符),即可提高查找的效率. * 因此为了找到这个合适的位置,先对子串预处理,从而得到一个回退位置原创 2011-09-20 00:26:25 · 1500 阅读 · 0 评论 -
算法导论学习笔记——散列表
本文系转载,转自:http://www.iteye.com/topic/570646散列表是最常用的数据结构之一,特别是 ruby js等动态语言在语法层次上对它进行了支持。只是在java中,有那么点点绕(每次使用的时候,心里会疙瘩一下,不知道你们有没有这种感觉)。本转载 2011-08-26 01:20:40 · 2711 阅读 · 0 评论 -
算法导论学习笔记——二叉查找树
//SearchTree类public class SearchTree { /** * 中序遍历:根据二叉查找树的性质,中序遍历将按排列顺序输出树中的所有关键字。 * @param root */ public static void inorderTree原创 2011-08-27 04:59:52 · 1839 阅读 · 0 评论 -
算法导论学习笔记——红黑树
/** * 红黑树的5个性质: * 1)每个结点要么是红的,要么是黑的。 * 2)根结点是黑的。 * 3)每个叶结点,即空结点(NIL)是黑的。 * 4)如果一个结点是红的,那么它的俩个儿子都是黑的。 * 5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的原创 2011-08-28 02:33:30 · 2335 阅读 · 0 评论 -
求最大公约数和最小公倍数
public class GCD { //求最大公约数(非递归版本) public int gcd(int a,int b){ //不申请变量空间的情况下交换两个数 if(a<b){ a^=b; b^=a; a^=b; } int t =原创 2011-09-27 00:46:08 · 1166 阅读 · 0 评论 -
应用Hash函数(java描述)
本文系转载,转自:http://www.blogjava.net/jinfei0627/articles/219543.html应用Hash函数(java描述) 作者:冲处宇宙时间:2007.1.25 计算理论中,没有Hash函数的说法,只有单转载 2011-09-30 17:42:06 · 15311 阅读 · 0 评论 -
输入一个整型数组,求所有子数组中和的最大值
/** * 输入一个整型数组,数组里有正数也有负数。 * 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 * 求所有子数组的和的最大值。要求时间复杂度为O(n)。 * 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为原创 2011-09-04 00:45:19 · 6875 阅读 · 0 评论 -
用java实现生产者和消费者问题
package javaTest;//测试类 public class ProCon{ public static void main(String[] args){ SyncQueue queue = new SyncQueue();原创 2011-10-16 17:17:37 · 1895 阅读 · 0 评论 -
算法导论学习笔记——合并排序
/** * 采用递归方法实现排序,特点:复杂度O(nlgn),非原地排序(有非常数个元素存放在数组以外的地方) * 分解:将n个元素分成各含n/2个元素的子序列 * 解决:用合并排序法对两个子序列递归地排序 * 合并:合并两个已排序好的子序列以得到排序结果 */public class MergeSort { /** * 合并两个已排序的子序列 * @pa原创 2011-08-04 23:55:37 · 1249 阅读 · 3 评论 -
算法导论学习笔记——找数组中第i小的元素
/** * 问题:从一个由n个不同的数组构成的集合中选择其第i个顺序统计量的问题 * 解决:采用类似快速排序的思想即对输入数组进行递归划分,不同之处是,快速排序会递归处理划分的两边, * 而此方法只处理划分的一边。 * 最坏时间复杂度为:O(n^2),平均运行的原创 2011-08-11 23:32:20 · 1664 阅读 · 0 评论 -
算法导论学习补充——希尔排序
/** * 希尔排序思想:先将整个待排记录序列分割成若干子序列分别进行直接插入排序, * 待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序 * 希尔排序时间复杂度为O(n^3/2) * */public class ShellSort {原创 2011-08-12 01:25:45 · 1537 阅读 · 0 评论 -
探索推荐引擎内部的秘密:推荐引擎初探
【本文系转载,原文地址:http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy1/index.html】简介: 随着 Web 技术的发展,使得内容的创建和分享变得越来越容易。每天都有大量的图片、博客、视转载 2011-08-01 23:01:10 · 830 阅读 · 0 评论 -
算法导论学习笔记——堆排序
public class HeapSort { /** * 调整第i个堆元素为根结点的堆为最大堆,前提条件是i的左右孩子已经是最大堆,注意这里的i是在堆中的位置并非数组中的位置 * @param arr 堆数组 * @param i 调整原创 2011-08-04 23:29:47 · 1000 阅读 · 1 评论 -
算法导论学习笔记——插入排序
/** * 用递归的方法实现的插入排序算法 * 分解:n个元素的排序看成是把第n个元素插入到已排好序的n-1个元素中 * 解决:对n-1个元素以次递归 * 合并:用插入排序将第n个元素插入到排好序的n-1个元素序列中 */public class InsertSort原创 2011-08-04 23:41:03 · 1334 阅读 · 0 评论 -
输入n个整数,输出其中最小的k个
/** * 题目:输入n个整数,输出其中最小的k个。 * 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 * 这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn原创 2011-09-04 00:43:42 · 8322 阅读 · 1 评论 -
算法导论学习笔记——最大优先级队列
/** * 最大优先级队列,例如:在一台分时计算机上进行作业高度。这种队列对要执行的各作业及它们之间的相对优先关系加以记录 * 当一个作业做完或被中断时,用extractMax操作从所有等待的作业中,选择出具有最高优先级的作业;一个新作业则可以调用insert加入队列 */原创 2011-08-06 23:23:08 · 1207 阅读 · 0 评论 -
算法导论学习笔记——动态规划
本文系转载,原文地址:http://www.cppblog.com/Fox/archive/2008/05/07/Dynamic_programming.html以前在学习非数值算法的时候,曾经了解过动态规划算法(Dynamic programming),以下是对Wiki转载 2011-09-06 00:58:48 · 5113 阅读 · 1 评论 -
算法导论学习笔记——快速排序算法
/** * 快速排序算法:分解:数据arr[p..r]被划分成两个(可能空)的子数组arr[p..q-1]和arr[q+1..r] * 使得arr[p..q-1]中的每个元素都小于等于arr(q),而arr[q+1..r]中的每个元素大于原创 2011-08-06 23:59:24 · 901 阅读 · 0 评论 -
算法导论学习笔记——贪心算法
本文系转载,原文地址:http://www.cppblog.com/3522021224/archive/2007/06/16/26429.aspx一.贪心算法的基本概念 当一个问题具有最优子结构性质时,我们会想到用动态规划法去解它。但有时会有更简单有效的算法转载 2011-09-05 23:21:29 · 2457 阅读 · 1 评论 -
算法导论学习笔记——计数排序算法
/** * 计数排序假设n个输入元素中的每一个都是介于0和k之间的整数, 此处k为某个整数 *基本思想为:对每一个输入元素经,确定出小于x的元素个数,这样就可以把x直接放到它在最终输出数组中的位置上。 *算法复杂度为O(n+k),当k=O(n)时,其运行时间为O(n) *原创 2011-08-08 23:13:30 · 1044 阅读 · 1 评论 -
算法导论学习笔记——桶排序
import java.util.ArrayList;import java.util.Iterator;/** * 桶排序:桶排序的思想是把区间[0,1)划分成n个相同大小的子区间,称为桶,然后将n个输入数分布到各个桶中去。 * 因为输入数均匀且独立分布在[0,1)上,原创 2011-08-11 01:01:05 · 5026 阅读 · 1 评论 -
算法导论学习笔记——基数排序
/** * 基数排序:n个d位数进行排序,先从最低有效位进行,由于每位数字都界于0到9(只考虑整数), * 可以用计数排序对每一位进行排序,重复这一过程直到对所有的d位数字都进行了排序。 * 由于计数排序的复杂度为O(n+k),所以基数排序的时间复杂度为O(d(n+k))原创 2011-08-10 23:43:45 · 1837 阅读 · 0 评论 -
在最坏情况下,利用n + ┌lgn┐ - 2 次比较,即可找到 n 个元素中的第2小元素
/** * 与lg(n) 相关的排序算法,首先应该想到的是分治法,算法的思路如下:(为简单起见,不考虑取整的问题) * 利用折半比较,第一个与最后一个比较,然后第二个与倒数第二个比较,一直进行到中间,最坏情况就是n/2次. * 然后将每一对的较小元素放在 a[1...n/2原创 2011-08-12 00:48:21 · 2638 阅读 · 3 评论 -
全排序算法
本文系转载,原文地址:http://blog.youkuaiyun.com/smile_pxy/article/details/583351设R={r1,r2,...,rn}是要进行排列的n个元素,Ri = R-{ri}.集合 X 中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列上加前缀ri得到的排列。R的全排列可归纳定义如下:当 n = 1 时,转载 2011-11-04 22:53:44 · 2819 阅读 · 0 评论