《算法图解》中涉及的算法的总结及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表示法. ...
随机推荐
- C++ windows 多线程 互斥锁
#include <opencv2/core/version.hpp> #include <opencv2/calib3d/calib3d.hpp> #include < ...
- HDOJ-2054
A == B ? Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- ElasticSearch基础+文档CRUD操作
本篇博客是上一篇的延续,主要用来将年前学习ES的知识点做一个回顾,方便日后进行复习和汇总!因为近期项目中使用ES出现了点小问题,因此在这里做一个详细的汇总! [01]全文检索和Lucene (1)全文 ...
- monkey基本命令及脚本编写
Monkey 是Android自带的黑盒测试工具,一般通过随机触发界面事件,来确定应用是否会发生异常,多用于android应用的稳定性.压力测试 基本命令: adb shell monkey [op ...
- Java - HashMap分别按Key和Value进行排序
我们都知道,Java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...
- springboot2 -广播式WebSocket
1.WebSocket,STOMP,SockJS含义 WebSocket:WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. SockJS:SockJS 是 We ...
- roguelike地牢生成算法
文章原地址 上一个地图生成算法,这一次是一个地牢的生成算法,是一个国外的人写的算法,用dart语言写,我把它改成了unity-c#. 原作者博客地址:Rooms and Mazes: A Proced ...
- Flex Builder 装SVN
由于Flex Builder没有内置SVN支持,很是不便.为了方便,给Flex Builder也装了SVN插件.由于FB基于Eclipse,安装方法都是一样的. 选择 Help -> Soft ...
- 萌新三分讲解+基础题ZOJ3203【三分凸性】
(温馨提示:图片外部食用更加) mid=(left+right)>>1,midmid=(mid+right)>>1; 举凸性函数的例子: 首先我们一定要明确问题:求极值,这里是 ...
- 51nod1393
思路:一个位num0-num1值=某位num0-num1值相等就代表这段区间内01数字相等,然后还要判断当前位置num0==num1这个情况 #include <bits/stdc++.h> ...