Java常用图形算法

原创 2017年02月16日 16:03:12

本文介绍常用算法戴克斯特拉算法(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 {


}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java方面图形/图像处理

Java图像处理类库 Java Image Filters Java Image Filters 是由 Jhlabs 开发的一组用来处理 Java 图像的类库,提供各种常用的图像处...
  • it_man
  • it_man
  • 2012年05月27日 11:24
  • 29545

图的常用算法的Java实现

/** * Title: 图的遍历、最小生成树、最短路径 * * * Description: * * 采用邻接矩阵做为图存储结构,有权无向图,不相连的值为 -1 ...

Java中的集合关系图及常见操作

下面是一张下载的Java中的集合类型的继承关系图,便于正确的理解和使用相应的集合类型。   有序否 允许元素重复否 Collection ...
  • zztfj
  • zztfj
  • 2012年05月13日 23:07
  • 10066

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Java实现图的深度和广度优先遍历算法

最近要学习写网络爬虫,所以把图的深度和广度搜索都再温习一下。

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

四分位数 箱线图

四分位数 箱线图 建议采用Origin来制作箱线图 作用 箱线图(Boxplot)也称箱须图(Box-whisker Plot),它是用一组数据中的最小值、第一四分位数、中位数、第三四分位数和最大...

Java源代码常用图形的绘制.rar

  • 2013年10月30日 14:42
  • 10KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java常用图形算法
举报原因:
原因补充:

(最多只允许输入30个字)