《算法图解》中涉及的算法的总结及java实现
该项目源代码已经放到Github上,有兴趣可以点击AlgorithmGraphExample 进行访问
项目启动,项目使用maven搭建,如果不使用maven导入,请保证有Junit4的jar包在工程中.
将项目导入相应IDE,执行AlgorithmInGraphTest的showAlgorithm()方法,即可以执行相应的测试方法.
二分查找:
算法目的: 查找在有序数组中某给定值的位置
算法原理: 当数组中元素有序排列时,通过比较数组中间位置的值和给定值的大小,
可以确定给定值在由中央位置分割而成的两个数组的哪一个部分,依次切割就能找到给定值的位置;
算法复杂度: O(logn)
算法难点:
需要确定循环的边界条件。
算法实现:
private int doBinarySearch(int [] sortedArray,int value){
int right = sortedArray.length - 1;
int left = 0;
int middle;
//这里=号容易被忽略
while(right>= left){
middle = (left+right)/2;
if(sortedArray[middle] == value){
return middle;
}
else if(sortedArray[middle] < value){
left = middle+1;
}
else{
right = middle-1;
}
}
return -1;
}
选择排序
算法目的: 将数组正确排序
算法原理: 依次选择最小(大)的值放到对应的位置
算法复杂度: O(n^2)
算法难点::无
算法实现:
private void sort(int [] array){
for(int i = 0;i<array.length;i++){
int min = array[i];
int index = i;
for(int j = i;j<array.length;j++){
if(min > array[j]){
min = array[j];
index = j;
}
}
if(i != index){
int temp = array[i];
array[i] = array[index];
array[index] = temp;
}
}
}
快速排序--分治
算法目的: 将数组正确排序
算法原理: 准一个基准值(一般选择数组中第一个值),将数组分成两部分,前一部分比基准值小,后一部分比基准值大.
然后将分割后的两个数组继续按这个方式分割,一直到子数组只剩下一个值,那么所有子数组都是排序好的,最后汇总起来也是排序好的数组
算法复杂度: O(n^2)
算法难点::无
算法实现:
private void quickSort(int [] array,int start,int end){
if(start >= end){
return;
}
int left = start;
int right = end;
int value = array[start];
while(left < right){
while(array[right] > value && left < right)
right--;
array[left] = array[right];
while(array[left] < value && left < right)
left++;
array[right] = array[left];
}
array[left] = value;
quickSort(array,left+1,end);
quickSort(array,start,left-1);
}
广度优先搜索--图算法 最短路径
算法目的: 遍历图中节点的一种方法,可以找到两节点的最短路径
算法原理: 图的搜索算法,对每个节点:搜索其子节点(相连节点),如果该节点被搜索过,那么就跳过,否则加入到搜索节点队列;当前节点完成后,从队列中选择
第一个节点继续搜索.直到队列中不再有节点.
算法复杂度:
算法难点::无
算法实现:
int point_num = graph[0].length;
List<Integer> result = new ArrayList<Integer>();
Queue<Integer> queue = new LinkedList<Integer>();
List<Integer> searchedList = new ArrayList<Integer>(); //已经查找过的点
queue.offer(0);
searchedList.add(0);
int index = 0;
while(!queue.isEmpty()){
Integer currentPoint = queue.poll();
result.add(currentPoint);
for(int i = 0;i<graph[currentPoint].length;i++){
if(!searchedList.contains(i) && graph[currentPoint][i] == 1){
queue.offer(i);
searchedList.add(i);
}
}
}
return result;
迪杰斯特拉算法
算法目的: 在有向无环的带权值的图中,找出权值最短的路径
算法原理: 因为是有向图并且无环,作为基准的点,当时的权值都是起点到这些节点最小的时候.
算法难点::无
算法实现:
while (continueSeach) {
continueSeach = false;
for (int i = 0; i < length; i++) {
if (graph[currentNode][i] < 0) {
continue;
}
if (graph[currentNode][i] + minimumValue[currentNode] < minimumValue[i]) {
minimumValue[i] = graph[currentNode][i] + minimumValue[currentNode];
minmimumNode[i] = currentNode;
}
}
//已经检查过的节点
examinedNode.add(currentNode);
//从当前节点中选择一个最小的节点值
int minmum = Integer.MAX_VALUE;
for (int i = 0; i < length; i++) {
if (!examinedNode.contains(i) && minimumValue[i] < minmum) {
currentNode = i;
minmum = minimumValue[i];
continueSeach = true;
}
}
}
背包问题--贪心算法
算法目的: 对于一个固定重量的背包,装入一组重量和大小固定的物品,物品可以只放入部分,可以求出如何放置得出的值最大
算法原理: 物品可拆分,只要依次装入单位价值最大的物品即可.贪心算法的原理是每次的操作都是最优的,只有一个操作.
算法实现:
while(i<weighs.length){
if(currentWeight + weighs[i] < maxWeight){
currentWeight += weighs[i];
maxValue += value[i];
}else {
maxValue += value[i] ** (maxWeight - currentWeight) / weighs[i];
break;
}
i++;
}
01背包--动态规划
算法目的: 对于一个固定重量的背包,装入一组重量和大小固定的物品,物品只能完整放入或者不放入,可以求出如何放置得出的值最大
算法原理: 物品不可拆分,所以不能使用贪心算法,因为如果当次放入单位价值最大的物品可能导致后面整体价值最大的物品无法房屋.
如果较大问题的最优解包含了较小问题的最优解,那么就可以使用动态规划来做.
动态规划问题的核心是当前问题的最优解包含在小规模的最优解中,或者说大规模问题可以由小规模问题推导出来,也就是状态转移;
具体到0,1背包;状态转移为:对于第i件物品,在背包容量限定为weight的情况下,其最大价值在放这件物品与不放这件物品之间选择一个:
a:如果放的话,那么价值为当前背包容量减去该物品重量后能放置物品的最高价值与当前物品的价值累加;就是数组中a[i-1][weight-weighs[i]]
b: 如果不放的话,那么价值就应该是当前背包容量下不考虑这个物品,也就是上个物品在该背包容量的最大价值:也就是数组中a[i-1][weight]
a与b的最大值就是当前规模的最优值
算法实现:
for(int i=0;i<weighs.length;i++){
for(int j=0;j<maxWeight;j++){
//初始化
if(i==0){
if(j >= weighs[0]){
currentState[i][j] = value[0];
}
}else if(j >= weighs[i] ){
if(currentState[i-1][j-weighs[i]]+value[i] > currentState[i-1][j]){
currentState[i][j] = currentState[i-1][j-weighs[i]]+value[i];
}else{
currentState[i][j] = currentState[i-1][j];
}
}
else{
currentState[i][j] = currentState[i-1][j];
}
if(maxResult < currentState[i][j]){
maxResult = currentState[i][j];
}
}
}
《算法图解》中涉及的算法的总结及java实现的更多相关文章
- 《算法导论》第二章demo代码实现(Java版)
<算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...
- 分布式数据库中的Paxos 算法
分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...
- 排序图解:js排序算法实现
之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...
- 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密
在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...
- 面试中常用排序算法实现(Java)
当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...
- <算法图解>读书笔记:第1章 算法简介
阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...
- 面试中常用排序算法的python实现和性能分析
这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...
- 源代码方式向openssl中加入新算法完整具体步骤(演示样例:摘要算法SM3)【非engine方式】
openssl简单介绍 openssl是一个功能丰富且自包括的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算. ...
- 算法图解...pdf
电子书资源:算法图解 书籍简介 本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量.书中的前三章将帮助你打下基础,带你学习二分查找.大O表示法. ...
随机推荐
- .after()和.before()的关系
.after() 是在相邻元素后面插入元素 .next() 获得匹配元素集合中每个元素紧邻的同胞元素 用法介绍: $(selector).after(content) content 必需.规定要插入 ...
- html css鼠标样式,鼠标形状
css鼠标手型cursor中hand与pointer Example:CSS鼠标手型效果 <a href="#" style="cursor:hand"& ...
- 在OpenCV for Android 2.4.5中使用SURF(nonfree module)
http://blog.csdn.net/ruifdu/article/details/9120559 在OpenCV4Android中没有nonfree module,因此也就没有了SURF和SIF ...
- element走过的坑
1.想要更改表头颜色,只要在el-table里引入 :header-cell-style="{background:'red'}" 2.el-form自定义表单验证 , 但是左边不 ...
- 1.python真的是万恶之源么?(初识python)
python真的是万恶之源么? 计算机基础及puthon了解 1.计算机基础知识 cpu : 相当于人类大脑,运算和处理问题 内存 : 临时存储数据,单点就消失,4G,8G,16G,32G 硬盘 : ...
- PJzhang:百度网盘是如何泄露公司机密的?
猫宁!!! 参考链接:https://mp.weixin.qq.com/s/PLELMu8cVleOLlwRAAYPVg 百度网盘在中国一家独大,百度超级会员具有很多特权,尤其是在下载速度上,是普通会 ...
- 编译出现No rule to make target `out/host/linux-x86/bin/aapt', needed by `out/target/common/obj/APPS/MyTv4_intermediates/src/R.stamp'问题
查找路径发现的确没有MyTv4_intermediates/src/R.stamp,这需要生成这个文件
- [题解](最短路)luogu_P5122 Fine Dining
首先理解这里的美味值相当于给你更多时间让你经过这个草垛的, 也就是在经过草垛时可以给你的时间减少w[i],这样能否比最短路不慢 然而我们并不容易知道怎么走才是最好的,所以要想办法避免找这个方案 我们新 ...
- POJ-1062-昂贵的聘礼(枚举)
链接:https://vjudge.net/problem/POJ-1062 题意: 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为 ...
- nginx 配置步骤
D:\myphp2017\nginx\conf.nginx.conf37行 吧localhost 改为www.ff.com41行取消注释44行 加D:\myphp2017\nginx\html45 在 ...