本文介绍常用算法戴克斯特拉算法(Dijkstra’s algorithm),动态规划(Dynamic programming),朴素贝叶斯分类算法。
1、戴克斯特拉算法(Dijkstra’s algorithm)
/***
* Dijkstra算法
* 算法步骤:
* 1、第一轮,可以计算出,2、3、4、5、6到原点1的距离分别为:[7, 9, -1, -1, 14]。-1表示无穷大。
* 取其中最小的,为7,即可以确定1的最短路径为0,2为下一轮的前驱节点。同时确定2节点的最短路径为7,路线:1->2。
* 2、第二轮,取2节点为前驱节点,按照前驱节点的最短距离加上该节点与前驱节点的距离计算新的最短距离,
* 可以得到3,4,5,6节点到原点的距离为:[17, 22, -1, -1],此时需要将这一轮得到的结果与上一轮的比较,3节点:17 > 9,
* 最短路径仍然为9;4节点:22 < 无穷大,刷新4节点的最短路径为22;5节点:不变,仍然为无穷大;6节点:14 < 无穷大,取14,不变。
* 则可以得到本轮的最短距离为:[9, 22, -1, 14],取最短路径最小的节点,为3,作为下一轮的前驱节点。同时确定3节点的最短路径为9,路线:1->3。
* 3、第三轮,同上,以3为前驱节点,得到4,5,6的计算距离为:[20, -1, 11],按照取最短路径的原则,与上一轮的进行比较,刷新为:[20, –1, 11],
* 选定6为下一轮的前驱节点。同时取定6的最短路径为11,路线:1->3->6。
* 4、第四轮,同上,以6为前驱节点,得到4和5的计算距离为[20, 20],与上一轮进行比较,刷新后为[20, 20],二者相等只剩下两个节点,并且二者想等,
* 剩下的计算已经不需要了。则两个节点的最短路径都为20。整个计算结束。4的最短路径为20,路线:1->3->4。5的最短路径为20,路线:1->3->6->5。
* 参考链接:http://developer.51cto.com/art/201406/443115.htm
* http://blog.csdn.net/gamer_gyt/article/details/47184081
* */
public class Dijkstra {
public static final int M = -1;
static int[][] map = {
{ 0, 7, 9, M, M, 14 },
{ 7, 0, 10, 15, M, M },
{ 9, 10, 0, 11, M, 2 },
{ M, 15, 11, 0, 6, M },
{ M, M, M, 6, 0, 9 },
{ 14, M, 2, M, 9, 0 }
};
static int n =map.length; //顶点的个数
static int[] shortest = new int[n]; //存放从start到其他节点的最短路径
static boolean[] visited = new boolean[n]; //标记当前该顶点的最短路径是否已经求出,true表示已经求出
public static void main(String[] args) {
int orig = 0; //起始点
//寻找最短路径
int[] shortPath = dijkstra_alg(orig);
if(shortPath == null){
return;
}
for(int i=0; i< shortPath.length; i++){
System.out.println("从" + (orig + 1) + "出发到" + (i + 1) + "的最短距离为:"+ shortPath[i]);
}
}
private static int[] dijkstra_alg(int orig) {
// TODO Auto-generated method stub
// 初始化,第一个顶点求出
shortest[orig] = 0;
visited[orig] = true;
for(int count = 0; count != n-1; count ++)
{
//选出一个距离初始顶点最近的为标记顶点
int k = M;
int min = M;
for(int i =0; i< n ; i++)//遍历每一个顶点
{
if( !visited[i] && map[orig][i] != M) //如果该顶点未被遍历过且与orig相连
{
if(min == -1 || min > map[orig][i]) //找到与orig最近的点
{
min = map[orig][i];
k = i;
}
}
}
//正确的图生成的矩阵不可能出现K== M的情况
if(k == M)
{
System.out.println("the input map matrix is wrong!");
return null;
}
shortest[k] = min;
visited[k] = true;
//以k为中心点,更新oirg到未访问点的距离
for (int i = 0; i < n; i++)
{
if (!visited[i] && map[k][i] != M)
{
int callen = min + map[k][i];
if (map[orig][i] == M || map[orig][i] > callen)
{
map[orig][i] = callen;
}
}
}
}
return shortest;
}
}
2、动态规划(Dynamic programming)算法:
/***
* 动态规划(Dynamic programming)是一种在数学、计算机科学和经济学中使用的,
* 通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
* 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
* 参考链接:http://developer.51cto.com/art/201406/443115.htm
* */
public class DynamicProgramming {
}
3、朴素贝叶斯分类算法
/***
* 朴素贝叶斯分类算法是一种基于贝叶斯定理的简单概率分类算法。贝叶斯分类的基础是概率推理,
* 就是在各种条件的存在不确定,仅知其出现概率的情况下, 如何完成推理和决策任务。概率推理是与确定性推理相对应的。
* 而朴素贝叶斯分类器是基于独立假设的,即假设样本每个特征与其他特征都不相关。
* 1.贝叶斯定理
* 对于事件A和事件B,满足以下关系:
* P(A|B)=P(B|A)P(A)/P(B)
* 其中P(B|A)表示事件A发生的条件下事件B发生的概率。但通常情况下,如果我们更需要知道事件B发生条件下事件A发生的概率时,
* 贝叶斯定理就及其有用。
* 2.朴素贝叶斯分类算法
* 朴素贝叶斯分类的正式定义如下:
* 1、设为一个待分类项,比如举个例子,它是否是程序猿。
* 2、有类别集合。这里可以理解为是一个人的各种特征。
* 3、计算。分别计算各个特征的概率。
* 4、如果,则。比如分析出它是程序猿的概率比不是大,那推测他就是。
* 参考链接:http://developer.51cto.com/art/201406/443115.htm
* http://blog.csdn.net/u014486880/article/details/50018561
* */
public class PredictClass {
}
关注微信公众号和今日头条,精彩文章持续更新中。。。。。