二分查找(非递归)

  /**
* 二分查找(非递归)
* @param arr 从小到大的排序数组
* @param target 目标查找值
* @return
*/
public static int binarySearch(int[] arr,int target){
int left = 0;
int right = arr.length - 1;
while (left <= right){ int mid = (left + right )/2; if (arr[mid] == target){
return mid; }else if (arr[mid] > target ){
right = mid - 1; }else {
left = mid + 1; }
} return -1;
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

分治算法(汉诺塔)

/**
* 分治算法:汉诺塔
*/
public class Hannoitower { public static void main(String[] args) {
hannoitower(3,'A','B','C');
} /**
* 递归汉诺塔
* @param num 盘得个数
* @param a 代表 a塔
* @param b 代表 b塔
* @param c 代表 c塔
*/
public static void hannoitower(int num, char a , char b ,char c){ if (num == 1){
System.out.println("第1个盘从" + a + " -> " + c);
}else {
// 如果n>=2情况,需要将整个塔看作两部分,最上面的整体和最下面的一个盘
//1.首先,把上面得整体移动到b
hannoitower(num - 1,a ,c,b);
//2.其次,把最下面得盘从a移动到c
System.out.println("第" + num +"个盘从" + a + " -> " + c);
//3.最后把b塔得所有盘移动到c
hannoitower(num - 1,b,a,c); } }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
第1个盘从A -> C
第2个盘从A -> B
第1个盘从C -> B
第3个盘从A -> C
第1个盘从B -> A
第2个盘从B -> C
第1个盘从A -> C
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

总结:
分治法在每一层递归上都有三个步骤:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
合并:将各个子问题的解合并为原问题的解。

动态规划(背包问题)

动态规划算法介绍

动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法

动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 (即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )

对比汉诺塔的分治算法,是将大问题分解成小问题,每个小问题独立求解,最后合并就是大问题的解。这是我们在大脑里就可以静态的划分好的。
但是动态规划,每个小问题可能要依赖于上一个问题的解。

动态规划可以通过填表的方式来逐步推进,得到最优解.

经典场景:背包问题(01背包、完全背包)


/**
* 动态规划算法:01背包问题
*/
public class KnapsackProblem { public static void main(String[] args) {
int[] w = {1,4,3};//物品的重量
int[] val = {1500,3000,2000}; //物品的价值
int m = 4;//背包容量
int n = val.length;// 物品的数目 //创建二维数组
int[][] v = new int[n+1][m+1];
//处理二维数组的第0行第0列,赋值为0
for (int i = 0; i < v.length; i ++){
v[i][0] = 0;
}
for (int j = 0; j < v.length; j ++){
v[0][j] = 0;
} //根据规则,填充二维数组
for (int i = 1; i < v.length ; i ++){
for (int j = 1; j < v.length; j ++){
v[i][j] = 1;
}
} //打印二维数组
for (int i = 0; i < v.length ; i ++){
for (int j = 0; j < v.length; j ++){
System.out.print(v[i][j] + " ");
}
System.out.println();
}
} }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

KMP算法(next数组)

应用场景:字符串匹配问题

字符串匹配问题::
有一个字符串 str1= ““硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好””,和一个子串 str2=“尚硅谷你尚硅你”
现在要判断 str1 是否含有 str2, 如果存在,有就返回子串第一次出现的位置, 如果没有,则返回-1

一、暴力匹配算法

算法的思想:

    • 使用两个下标指示字符串的每个元素,一一进行匹配
    • 如果 i 指向的元素和 j 指向的元素不等,说明匹配失败。回溯 j 得从头再来,i 从下一个元素再次开始。

algorithm入门算法中的常见问题的更多相关文章

  1. 简明解释算法中的大O符号

    伯乐在线导读:2009年1月28日Arec Barrwin在StackOverflow上提问,“有没有关于大O符号(Big O notation)的简单解释?尽量别用那么正式的定义,用尽可能简单的数学 ...

  2. algorithm(算法)

    algorithm(算法) STL中算可以分为三种, 1.变序型队列算法,可以改变容器内的数据: 2.非变序型队列算法,处理容器内的数据而不改变他们 : 3.通用数值算法,这涉及到很多专业领域的算术操 ...

  3. 问题 1690: 算法4-7:KMP算法中的模式串移动数组

    题目链接:https://www.dotcpp.com/oj/problem1690.html 题目描述 字符串的子串定位称为模式匹配,模式匹配可以有多种方法.简单的算法可以使用两重嵌套循环,时间复杂 ...

  4. 先验算法(Apriori algorithm) - 机器学习算法

    Apriori is an algorithm for frequent item set mining and association rule learning over transactiona ...

  5. 从时序异常检测(Time series anomaly detection algorithm)算法原理讨论到时序异常检测应用的思考

    1. 主要观点总结 0x1:什么场景下应用时序算法有效 历史数据可以被用来预测未来数据,对于一些周期性或者趋势性较强的时间序列领域问题,时序分解和时序预测算法可以发挥较好的作用,例如: 四季与天气的关 ...

  6. Journal of Proteomics Research | 利用混合蛋白质组模型对MBR算法中错误转移鉴定率的评估

    题目:Evaluating False Transfer Rates from the Match-between-Runs Algorithm with a Two-Proteome Model 期 ...

  7. linux编译中的常见问题

    转linux编译中的常见问题 错误提示:Makefile:2: *** 遗漏分隔符 . 停止. 原因makefile中 gcc语句前 缺少一个 tab分割符 错误提示: bash: ./makefil ...

  8. KMP算法中next函数的理解

    首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ...

  9. document.body的一些用法以及js中的常见问题

    document.body的一些用法以及js中的常见问题 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight ...

随机推荐

  1. Socket、ServerSocket

    1.服务器端程序 package demo12.net; import java.io.IOException; import java.io.InputStream; import java.io. ...

  2. redis 过期策略你知道多少,看完文章你会不自觉说喔哦

    Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除.你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割. 你还可以进一步站在死神的角度 ...

  3. linux服务器核心知识

    电脑:辅助人脑的工具 现在的人们几乎无时无刻都会碰电脑!不管是桌上型电脑(桌机).笔记型电脑(笔电).平板电脑.智慧型手机等等,这些东西都算是电脑.虽然接触的这么多,但是,你了解电脑里面的元件有什么吗 ...

  4. Linux MPI环境配置

    参考:https://blog.csdn.net/lusongno1/article/details/61709460 注意点: 1. /etc/profile.d/user.sh和/etc/ld.s ...

  5. Java中的判断实例

    .getClass().getName() 这是最常见的一种判断类型的方法 instanceof 用于判断 对象 是否为某个类的实例 Boolean值 各种is方法 isAnnotationPrese ...

  6. e3mall商城的归纳总结3之后台商品节点、认识nginx

    一  后台商品节点 大家都知道后台创建商品的时候需要选择商品的分类,而这个商品的分类就就像一棵树一样,一层包含一层又包含一层.因此这里用的框架是easyUiTree.该分类前端使用的是异步加载模式(指 ...

  7. Vue开源项目使用探索

    前言 本文记录一次使用Vue开源项目的过程. 寻找Vue开源项目 要使用Vue开源项目就必须先找到一个,我们去Github上搜索[后台],然后使用Vue分类进行检索,找到排名第一的开源框架进行下载—v ...

  8. Laravel chunk和chunkById的坑

    Laravel chunk和chunkById的坑 公司中的项目在逐渐的向Laravel框架进行迁移.在编写定时任务脚本的时候,用到了chunk和chunkById的API,记录一下踩到的坑. 一.前 ...

  9. mac下使用命令行安装、卸载ipa包、查看日志

    mac下使用命令行安装.卸载ipa包.查看日志 https://www.cnblogs.com/lily1989/p/8383916.html

  10. unity 4种实现动态障碍方法

    此文将介绍4种实现动态障碍的方法,2种基于navmesh,2种基于astar算法. 1.基于navmesh. 1.制作场景障碍: a.有几个独立的障碍物,就定义几个user area,即,一个场景仅仅 ...