
数据结构&算法
文章平均质量分 51
gqltt
这个作者很懒,什么都没留下…
展开
-
算法之美~回溯算法
为了有规律地枚举所有可能的解,避免遗漏和重复,把问题求解的过程分为多个阶段。每个阶段,都会面对一个 岔路口,先随意选择一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一岔路口,另选一种继续走。0-1背包问题有很多变体,这里介绍一种比较基础的。有n个物品,每个物品重量不等,并且不可分割,现在期望选择几件物品,装到背包中。在不超过背包所能装载重量的前提下,如何让背包中物品的总重量最大?在一个8×8的棋盘,希望往里放8个棋子(皇后),每个棋子所在的行、列、对角线都不能有另外一个棋子。原创 2023-05-02 17:52:23 · 168 阅读 · 0 评论 -
算法之美~分治算法
给10GB的订单排序,可以先扫描一遍订单,根据订单的金额,将10GB的文件划分为几个金额区间。每次合并操作,都计算逆序对个数,把这个计算出来的逆序对个数求和,就是这个数组的逆序对个数了。可以将数组分成前后两半A1和A2,分别计算A1和A2的逆序对个数K1和K2,然后再计算A1和A2之间的逆序对个数K3。分治算法(divide and conquer)的核心思想其实是,分而治之,也就是将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归第解决这些子问题,然后再合并其结果,就得到原问题的解。原创 2023-05-02 10:45:17 · 918 阅读 · 0 评论 -
算法之美~贪心算法
为了让背包中所装物品的总价值最大,如何选择在背包中装哪些豆子?,针对一组数据,定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。依照贪心算法,求出的最短路径是S->A->E->T,路径长度是1+4+4 = 9。,每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据。如上例子,每次选择单价最高的,也就是重量相同的情况下,对价值贡献最大的豆子。如上例子,限制值就是重量不超过100kg,期望值就是物品的总价值。,举几个例子验证一下贪心算法的正确性。原创 2023-01-31 16:33:40 · 277 阅读 · 0 评论 -
算法之美~递归
每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等函数执行完成返回时出栈。如果递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。n = 2时,f(2) = f(1) + f(0),这样还需要f(0) = 1,但是不符合逻辑。eg.假设有n个台阶,每次可以跨1个或2个台阶,请问走这n个台阶有多少种走法?这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样;递归求解问题的分解过程,去的过程叫“递”,回来的过程叫“归”。递归终止条件,假设只有f(1) = 1。原创 2023-01-31 14:29:36 · 253 阅读 · 0 评论 -
算法之美~堆
堆化(heapify):把新元素插入堆的最后,然后调整堆,让其重新满足堆的特性。堆化非常简单,就是顺着节点所在的路径,向上或向下,对比,然后交换。堆中每个节点的值都必须>=(或=子树中每个节点的值;小顶堆:每个节点的值都原创 2023-01-17 16:41:19 · 466 阅读 · 0 评论 -
算法之美~时间复杂度
采用大O标记复杂度的时候,可以忽略系数,即O(Cf(n)) = O(f(n))。因此,在对数阶时间复杂度的表示方法里,可以忽略对数的“底”,统一表示为O(logn)。这段代码的时间复杂度为O(log3n),由于log3n = log32 * log2n,所以O(log3n) = O(C * log2n),一般情况下,只要算法中不存在循环、递归,即使有成千上万行代码,其时间复杂度也是O(1)O(1)是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。n,这段代码的时间复杂度为O(log。原创 2023-01-16 17:20:30 · 534 阅读 · 0 评论 -
查找N个数中第K大的数
方法一:将一组数放入数组中,升排序。并返回第 ( length - k )个元素这里消耗的时间就是排序用的时间,用快速排序则为:O( N log N )代码: /** * 先排序后获取 * @return * * Date :2012-7-4 * Author :GongQiang */ public int sortThenGet(原创 2012-07-04 17:23:27 · 3435 阅读 · 0 评论 -
全排列
递归(分治法思想): 设(ri)perm(X)表示每一个全排列前加上前缀ri得到的排列. 当n=1时,perm(R)=(r) 其中r是唯一的元素,这个就是出口条件. 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),...(rn)perm(Rn)构成. public class 全排列 { /** * @param原创 2012-10-23 17:13:54 · 661 阅读 · 0 评论 -
Struts2 的Action 命名重复检测
原因:在实际项目中发现 的 name 重复时候,Struts2 并不会报错而是随意找一个去执行!为了避免重复的情况发生,特地写了一个检测的程序:package barcode;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Map;i原创 2012-10-22 16:27:07 · 1103 阅读 · 0 评论 -
穷举法破解集合小游戏~
游戏网站:http://www.setgame.com/puzzle/set.htm游戏规则:1、三种颜色(红、绿、紫)2、三种外形(方形、椭圆形、花形)3、三种背景阴影(实心、点、轮廓)4、三种个数(1、2、3)找出其中 3 个,满足:要么其中属性全相同,要么属性全不相同。 破解思路:穷举所有3个一组的情形,找出满足的。源代码:package com.gq原创 2012-10-19 11:12:12 · 1101 阅读 · 0 评论 -
数独游戏破解
游戏规则:1、每行都是 1~92、没列都是 1~93、每块都是 1~9 解答思路:从坐标 [0][0] 开始,算出其允许填入的数字集合(每行允许数字集合、每列允许数字集合 和 每块允许数字集合 的交集)。从左到右,从上到下依次尝试(即,递归),当无法向 [下一步] 进行时候,则回溯(恢复状态,再尝试另一个值)。这样直到最后解答完成。 源代码:packag原创 2012-10-19 10:58:43 · 1413 阅读 · 0 评论 -
后缀表达式转变成表达式树
后缀表达式:ab+cde+**转换的表达式树:转换步骤:如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两颗树 T1 和 T2 (T1 先弹出)并形成一棵新的树,该树的根就是操作符,它的左、右儿子分别是 T2 和 T1。然后将这颗新树压入栈中。代码示例import java.util.Stack;/**原创 2012-06-27 11:40:24 · 2389 阅读 · 0 评论 -
中缀到后缀的转换
中缀表达式:a+b*c+(d*e+f)*g转换成后缀表达式:abc*+de*f+g*+转换步骤:当读到一个操作数(如:a)时,立即把它放到输出中;当遇到操作符(如:+)时,将其放入栈中;当遇到右括号时,弹出栈元素直至遇到左括号。将左括号弹出但不输出;如果遇到其他操作符[ +, * , ( ] ,那么弹出栈中的元素直到发现优先级更低的元素为止。有一个例外,除非是处理原创 2012-06-26 16:45:31 · 1143 阅读 · 0 评论 -
二叉堆
满足如下结构性和堆序性,即为二叉堆。结构性质:堆是一棵被完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入。这样的树称为完全二叉树。容易证明,一棵高为 h 的完全二叉树有 2h 到 2h+1-1 个节点。这意味着完全二叉树的高是⌊ log N ⌋,显然它是 O( log N )。一个重要的观察发现,因为完全二叉树这么有规律,所以它可以用一个数组表示而不需要使用链。原创 2012-07-05 14:23:47 · 5113 阅读 · 2 评论 -
二叉查找树
使二叉树成为二叉查找树的性质是,对于树中的每个节点 X ,它的左子树中所有项的值小于 X 中的值,而它右子树中所有项的值大于 X 中的值。注意,这意味着该树所有的元素可以用某种一致的方式排序。首先定义一个节点类: private static class BinaryNode{ T element; BinaryNode left; BinaryNode原创 2012-07-06 14:51:44 · 1261 阅读 · 0 评论 -
排序
1、插入排序 public static > void insertionSort( T[] a ){ int j; for( int p=1; p<a.length; p++ ){ T tmp = a[p]; for( j=p; j>0 && tmp.compareTo( a[j-1] )<0; j-- ){ a[j] = a[j-1]; }原创 2012-07-05 10:34:59 · 1127 阅读 · 1 评论