
算法
科学的发展-只不过是读大自然写的代码
科学的发展-只不过是读大自然写的代码
展开
-
算法理解
基本理解名称 特点 贪心算法 找到局部最优解和整体最优解的规律 动态规划 充分利用局部解间的依赖关系,把整体问题变成环环相扣的步骤 回溯法 记录回溯点,不满足的,就从前面的分支在开始,最终解往往多个,晦朔法的本质就是一种暴力破解。 分支界限 遇到分支只选最优,将竞争关系的分支删除。 对比分析名称 解 要的...原创 2020-01-09 09:40:22 · 155 阅读 · 0 评论 -
分治法-循环赛日程表
问题描述循环赛日程表:有n = 2^k个运动员要进行网球循环赛赛程表满足:每个选手必须与其他n-1个选手各赛一次每个选手一天只能参赛一次循环赛在n-1天内结束解题思路将比赛日程表设计成一个n行和n-1列的表,第i行,第j列分别填入第i个选手在第j天所遇到的选手代码package FenZhiJieXianFa;/** * 例子: * 4个选手 * --------- ...原创 2019-05-31 10:56:18 · 646 阅读 · 0 评论 -
c#-平衡二叉树实现
上一篇:平衡二叉树-c语言实现概要说明算法:定义一平衡因子(BF)当最小不平衡树根结点的平衡因子BF是大于1时,就右旋,小于-1时就左旋。插入结点后,最小不平衡子树的BF与它的子树的BF符号相反时,就需要对结点先进行一次旋转以使得符号相同后,再反向旋转一次才能够完成平衡操作。第二版代码using System;namespace 平衡二叉树2{ class Pr...原创 2019-10-23 15:46:59 · 821 阅读 · 0 评论 -
选择排序
代码package suanFa;import java.util.Arrays;public class XuanZe { /** * 选择排序算法 * * @param arr 数组(乱序) * @return */ public static int[] selectSort(int[] arr) { int length = arr.length;...原创 2019-05-29 11:14:54 · 167 阅读 · 0 评论 -
计数排序
代码package suanFa;public class Tong { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = {5,3,5,2,8,6}; //new 一个数组,每个元素代表一种成绩,,11个元素代表0-10 int[...原创 2019-05-29 11:07:30 · 292 阅读 · 0 评论 -
分治法-二分搜索
问题描述又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。代码package FenZi;public class ErFenChaZhao { public static void main...原创 2019-06-05 15:53:47 · 1302 阅读 · 0 评论 -
贪心算法-钱币找零问题
问题描述这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。代码package TanXi...原创 2019-06-05 15:37:22 · 3577 阅读 · 2 评论 -
贪心算法-马踏棋盘优化
问题描述将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。解题思路我们用一个二维数组模拟马走的方向,通过函数move(x,y),来达到马走。 如果棋盘next_x>=0 && next_x<...原创 2019-06-05 15:26:35 · 581 阅读 · 0 评论 -
分治法-循环赛日程表2
问题描述设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次;(2)每个选手一天只能参赛一次;(3)循环赛在n-1天内结束。按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i≤n,1≤j≤n-1。8个选手的比赛日程表如下图:解决思想按分治...原创 2019-05-31 11:04:42 · 1074 阅读 · 0 评论 -
分治法-棋盘覆盖
问题描述在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。L型棋盘基本原理实现的基本原理是将2^k * 2k的棋盘分成四块2(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不...原创 2019-05-31 10:45:26 · 354 阅读 · 0 评论 -
希尔排序
代码package suanFa;import java.util.Arrays;public class XiEr { /** * 希尔排序 * * @param arr 数组(乱序) * @return */ public static int[] hillSort(int[] arr) { int d = arr.length;//d为增量 ...原创 2019-05-29 11:19:07 · 149 阅读 · 0 评论 -
快速排序
代码package suanFa;import java.util.Arrays;public class KuaiShu { /** * 快速排序 * * @param arr 数组(乱序) * @param left 数组左端下标 * @param right 数组右端下标 * @return */ public static int[] quick...原创 2019-05-29 12:35:23 · 147 阅读 · 0 评论 -
堆排序
代码package suanFa;import java.util.Arrays;public class Dui { public static void main(String[] args) { // TODO Auto-generated method stub int[] array = new int[]{70, 60, 12, 40, 30, 8, 10}; ...原创 2019-05-29 12:41:19 · 107 阅读 · 0 评论 -
常用排序算法总结
1. 冒泡2. 选择3. 插入4. 希尔5. 归并6. 快速7. 堆8. 计数9. 桶10.基数算法对比名称 时间复杂度 最好情况 最坏情况 空间复杂度 排序方式 稳定性 冒泡 O(n^2) O(n) O(n^2) O(1) in-place 稳定 选择 O(n^2)...原创 2019-05-29 13:37:35 · 130 阅读 · 0 评论 -
归并排序
代码package suanFa;public class MergeSort { /* * 将一个数组中的两个相邻有序区间合并成一个 * * 参数说明: * a -- 包含两个有序区间的数组 * start -- 第1个有序区间的起始地址。 * mid -- 第1个有序区间的结束地址。也是第2...原创 2019-05-29 13:45:40 · 159 阅读 · 0 评论 -
桶排序
代码package suanFa;import java.util.ArrayList;import java.util.Collections;import java.util.LinkedList;import java.util.List;public class TongPaixu { public static void main(String[] args) { ...原创 2019-05-29 14:22:12 · 266 阅读 · 0 评论 -
基数排序
代码package suanFa;public class RadixSort{ public static void sort(int[] number, int d) //d表示最大的数有多少位 { int k = 0; int n = 1; int m = 1; //控制键值排序依据在哪一位 int[][...原创 2019-05-29 14:43:25 · 91 阅读 · 0 评论 -
插入排序
代码package suanFa;import java.util.Arrays;public class ChaRu { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = {9, 1, 12, 5, 3, 11, 7, 8}; Syst...原创 2019-05-29 14:47:42 · 156 阅读 · 0 评论 -
贪心算法-背包 问题
问题描述假定有6个物品,他的质量分别是{35,30,60,50,40,10,25}kg他们的价格分别是{10,40,30,50,35,40,30}元。如果只能带走150kg的东西,你应该如何选择?解题思路我们知道,可以通过性价比来进行判断。所以我们可以通过求出性价比,然后排序性价比,然后从性价比最大的开始选择,直到装满为止。这就是贪心算法的思路。代码package TanXin;p...原创 2019-06-03 16:56:40 · 324 阅读 · 0 评论 -
贪心算法-活动教室
代码package TanXin;import java.util.ArrayList;import java.util.List;//活动选择问题/*这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间...原创 2019-06-03 16:58:55 · 827 阅读 · 0 评论 -
贪心算法-最大整数
问题描述设有n(n≤20)个正整数(每个在int范围内),将它们连接成一排,组成一个最大的多位整数。例如n=3,3个整数分别是13、312和343,连接成最大的整数为34331213。代码package TanXin;import java.util.Scanner;// 最大整数public class ZuidaZhengShu { public static void m...原创 2019-06-05 13:52:20 · 2072 阅读 · 0 评论 -
贪心算法-均分纸牌
问题描述均分纸牌问题:有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。解题思路例如 N=4,4 堆纸牌数分别为:① 9 ② 8 ③ ...原创 2019-06-05 13:43:43 · 991 阅读 · 0 评论 -
分治法-汉诺塔
问题描述在汉诺塔游戏中,有三个分别命名为A、B、C得塔座,几个大小各不相同,从小到大一次编号得圆盘,每个原盘中间有一个小孔。最初,所有得圆盘都在A塔座上,其中最大得圆盘在最下面,然后是第二大,以此类推.代码package FenZi;public class HanNuoTa { private static int count = 1; public static void ...原创 2019-05-31 09:31:49 · 627 阅读 · 0 评论 -
动态规划-Fibonacci数列
代码package suanFa;public class ShuLie { public static int fib1(int n) { // 计算Fibonacci数列的第n项(动态规划版):O(n) if(n < 2) return n; int a = 0;//第一个值 int b = 1;//第二个值 ...原创 2019-05-30 12:50:10 · 287 阅读 · 0 评论 -
分支界限法-最短路径问题
问题描述在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。代码#include <iostream>#include <vector>#include <queue>#include <limits>#include <iterator>using namespace std;...原创 2019-05-30 10:52:44 · 2627 阅读 · 0 评论 -
气泡排序
代码package suanFa;import java.util.Arrays;public class MaoPap { /** * 冒泡排序 * * @param arr 数组(乱序) * @return */ public static int[] bubbleSort(int[] arr) { int n = arr.length; f...原创 2019-05-30 09:22:13 · 173 阅读 · 0 评论 -
基数排序
代码package suanFa;public class RadixSort{ public static void sort(int[] number, int d) //d表示最大的数有多少位 { int k = 0; int n = 1; int m = 1; //控制键值排序依据在哪一位 int[][...原创 2019-05-30 09:16:17 · 129 阅读 · 0 评论 -
设计的两个维度,一动,一静
设计的两个维度,一动,一静。程序干啥,无论啥程序,或大,或小,或简单,或复杂。无非就是处理数据。那么设计也无非就两件事。设计数据结构。设计数据处理流程。数据结构是啥?包括啥?在数据库的级别就是数据表的设计,关系的设计。那么在程序级别呢?这个不同的语言,说明可能有些差别。用c语言说吧,这更容易说明问题。就是全局变量,包括全局的数据结构。那么就剩函数内部的变量了,这些虽然也算静...原创 2019-03-26 12:17:02 · 269 阅读 · 0 评论 -
算法感悟
算法的本质在于结构。最近想把学过的算法整理一下,在这过程中有了上面的体悟。算法太多了,太复杂了,怎么找出其中的规律呢,于是有了上面的体悟。算法的关键往往是把需求编程一个数据模型,跟具体但不准确的说法是迭代或递归模型。这个模型是什么呢,如何得到这个模型呢,于是有了上面的体悟。无论是自己写算法,还是去理解被人的算法,找到一个规律,问题就清晰了,那么这个规律是什么,规律就是一个动静结合的东西。静...原创 2019-03-07 09:18:59 · 266 阅读 · 0 评论 -
八皇后问题算法解析
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问...原创 2019-03-07 09:02:49 · 1533 阅读 · 0 评论 -
关于算法的思考
机器所长,无外乎迭代,算法无外乎,用一种规则去启动迭代和记录迭代。所以关于算法,我认为不用学,有需求就会有合适的算法,但能迅速的选择一个好的算法则需要时间。...原创 2019-03-06 15:20:20 · 369 阅读 · 0 评论 -
动态规划-爬楼梯
问题描述:有一座高度为n级的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶,求出一共有多少种走法。分析:因为每1步只能走1级或者2级,所以走到第n级的前一步有且只有两种情况,第一种情况是从第n - 1级走1级,第二种情况是从第n - 2级走2级。由此我们就可以得到此问题的递归公式:F(1) = 1;F(2) = 2;F(n) = F(n - 1) + F(n - 2);代码pac...原创 2019-05-30 12:56:35 · 1017 阅读 · 0 评论 -
动态规格-数塔取数问题
数塔取数问题一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。该三角形第n层有n个数字,例如:第一层有一个数字:5第二层有两个数字:8 4第三层有三个数字:3 6 9第四层有四个数字:7 2 9 5最优方案是:5 + 8 + 6 + 9 = 28注意:上面应该是排列成一个三角形的...原创 2019-05-30 13:13:48 · 512 阅读 · 0 评论 -
动态规格-编辑距离
问题说明编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:sitten (k->s)sittin (e->i)sitting (->g)所以kitten和sitting...原创 2019-05-30 13:19:17 · 241 阅读 · 0 评论 -
分支界限法-旅行售货员问题
问题描述某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。代码package FenZhiJieXianFa;import java.util.Collections;import java.util.LinkedList; /** * 旅行售货员问题--优先队列式分支限界法 *...原创 2019-05-31 09:22:41 · 2547 阅读 · 1 评论 -
常用算法实现
1.分治法Fibonacci数列爬楼梯数塔取数问题编辑距离矩阵取数问题背包问题最大子段和最长公共子序列Lcs正整数分组2.动态规格3.贪心算法4.回溯法5.分支界限法...原创 2019-05-31 08:54:08 · 373 阅读 · 0 评论 -
动态规格-正整数分组
问题将一堆正整数分为2组,要求2组的和相差最小。例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。代码package dongtaiguihua;import java.util.Scanner;public class ZhengZhengShuFenZhu { public static void main(String[] ...原创 2019-05-31 08:47:39 · 221 阅读 · 0 评论 -
动态规格-最长公共子序列Lcs
问题给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。比如两个串为:abcicbaabdkscabab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。代码package dongtaiguihua;import java.util.Scanner;public class ZhuiDaGonggongZhiXu { p...原创 2019-05-31 08:42:50 · 198 阅读 · 0 评论 -
动态规划-最大子段和
问题N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。当所给的整数均为负数时和为0。例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。代码package dongtaiguihua;public class ZhuiDaZhiDuanHe { public stati...原创 2019-05-31 08:37:37 · 311 阅读 · 0 评论 -
动态规划-最长递增子序列
问题给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。代码package dongtaiguihua;import java.util.Scanner;public class ZhuiChangDizhengZhiXu { public static void ...原创 2019-05-31 08:21:37 · 213 阅读 · 0 评论