《算法图解》中涉及的算法的总结及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表示法. ...
随机推荐
- 免证书发布ipa文件真机测试
首先设备得越狱 众所周知,在Xcode上开发的程序只能在模拟器中运行,如果要放到真机上则要花费99美金购买开发者证书iDP.这严重阻碍了我等草根开发者探索的脚步.写个小程序,同学间分享一下这个小小的愿 ...
- Fitnesse的一个简单实例
Fixture 代码 package eg; import org.joda.time.DateTime; public class JodaTime { int year; public Strin ...
- 正向渲染路径细节 Forward Rendering Path Details
http://www.ceeger.com/Components/RenderTech-ForwardRendering.html This page describes details of For ...
- 一种Unity2D多分辨率屏幕适配方案
http://www.cnblogs.com/flyFreeZn/p/4073655.html 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 设置Session存活时长
方式一:修改所有的session默认时长,修改tomcat目录下的conf文件夹下的web.xml文件. <session-config> <session-timeout>希 ...
- 使用命令动态更新JAR包中的文件
动态更新JAR包中的文件,经本人实际测试可正常执行! 一.查询jar包中要替换的文件位置 jar -tvf gateway.jar | grep topjui.config.js 二.在当前 ...
- TopJUI通过简单的代码实现复杂的批量提交功能
业务系统的批量提交是常用的操作功能,使用传统的EasyUI开发时需要写不少代码才能实现,该功能在TopJUI中是如何实现的呢?本篇我们将通过简单的代码,把批量操作的具体实现分享给大家参考. <a ...
- plt
设定X,Y轴的长度以及刻度的方法. import numpy as np import matplotlib.pyplot as plt data = np.arange(0,1.1,0.01) pl ...
- SecureCRT 退格键等不好用
1.MongoDB Shell中退格键使用的问题. 利用SecureCRT工具访问linux的时候,在使用MongoDB的交互式shell的时候,退格键(Backspace)无法使用,导致无法修改输入 ...
- VC 中TEXT、_T、L的区别
http://i.cnblogs.com/EditPosts.aspx?opt=1 对于从VC++6.0转到VS2005编译环境中的程序员.往往会碰到字符集之间的转换. VC6.0采用的是ANSI字符 ...