「java图论算法」算法 图论

博主:adminadmin 2022-12-05 08:33:06 63

今天给各位分享java图论算法的知识,其中也会对算法 图论进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

一个java算法问题,求高手解决!

这是一个关于 图 的算法。

告诉你一个不太靠谱的方法,但是是最佳实践的方法:

根据当地的路况和交通规则随时变换派送规则。

比如:

在北京派送的话,要考虑下雨天路段积水问题,要考虑交通管制问题,要考虑上下班高峰期问题,要考虑派送路程上的交通事故问题,要考虑走换线还是走高速的问题,等等。

呵呵,开个玩笑。

你可以找一本 《数据结构》的书,重点看图论那一章,书里有详细讲解图中最短路径的算法。

就能解决你的问题了。

判断有向图是否连通+dfs+java

方法1:

如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度=2。

n算法:

第一步:删除所有度=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。

第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。

如果最后还有未删除顶点,则存在环,否则没有环。

n算法分析:

由于有m条边,n个顶点。

i)如果m=n,则根据图论知识可直接判断存在环路。(证明:如果没有环路,则该图必然是k棵树 k=1。根据树的性质,边的数目m = n-k。k=1,所以:mn)

ii)如果mn 则按照上面的算法每删除一个度为0的顶点操作一次(最多n次),或每删除一个度为1的顶点(同时删一条边)操作一次(最多m次)。这两种操作的总数不会超过m+n。由于mn,所以算法复杂度为O(n)。

在Java中,对象什么时候可以被垃圾回收?

1. 引用计数器算法

解释

系统给每个对象添加一个引用计数器,每当有一个地方引用这个对象的时候,计数器就加1,当引用失效的时候,计数器就减1,在任何一个时刻计数器为0的对象就是不可能被使用的对象,因为没有任何地方持有这个引用,这时这个对象就被视为内存垃圾,等待被虚拟机回收

优点

客观的说,引用计数器算法,他的实现很简单,判定的效率很高,在大部分情况下这都是相当不错的算法

其实,很多案例中都使用了这种算法,比如 IOS 的Object-C , 微软的COM技术(用于给window开发驱动,.net里面的技术几乎都是建立在COM上的),Python语言等.

缺陷

无法解决循环引用的问题.

这就好像是悬崖边的人采集草药的人, 想要活下去就必须要有一根绳子绑在悬崖上. 如果有两个人, 甲的手拉着悬崖, 乙的手拉着甲, 那么这两个人都能活, 但是, 如果甲的手拉着乙, 乙的手也拉着甲, 虽然这两个人都认为自己被别人拉着, 但是一样会掉下悬崖.

比如说 A对象的一个属性引用B,B对象的一个属性同时引用A A.b = B() B.a = A(); 这个A,B对象的计数器都是1,可是,如果没有其他任何地方引用A,B对象的时候,A,B对象其实在系统中是无法发挥任何作用的,既然无法发挥作用,那就应该被视作内存垃圾予以清理掉,可是因为此时A,B的计数器的值都是1,虚拟机就无法回收A,B对象,这样就会造成内存浪费,这在计算机系统中是不可容忍的.

解决办法

在语言层面处理, 例如Object-C 就使用强弱引用类型来解决问题.强引用计数器加1 ,弱引用不增加

Java中也有强弱引用

2. 可达性分析算法

解释

这种算法通过一系列成为 "GC Roots " 的对象作为起始点,从这些节点开始向下搜索所有走过的路径成为引用链(Reference Chain) , 当一个对象GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达),则证明此对象是不可用的

优点

这个算法可以轻松的解决循环引用的问题

大部分的主流java虚拟机使用的都是这种算法

3. Java语言中的GC Roots

在虚拟机栈(其实是栈帧中的本地变量表)中引用的对象

在方法区中的类静态属性引用对象

在方法区中的常量引用的对象

在本地方法栈中JNI(即一般说的Native方法)的引用对象

求图论算法java实现

求图论算法java实现

package test;

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Comparator;

import java.util.HashMap;

import java.util.Map;

import java.util.PriorityQueue;

import java.util.Queue;

 

public class MinSpanningTree {

    class Edge {//内部类定义边的数据结果

        int u, v, weight;

    }

 

    ArrayListedge Edges = new ArrayListedge();

    Mapinteger, integer="" nodeFather = new HashMapinteger, integer=""();

    int cnt = 0, nodeCnt = 0;

 

    public MinSpanningTree(String path) {

        try {

 

            BufferedReader br = new BufferedReader(new FileReader(path));

            String str;

            String[] strArray;

 

            while ((str = br.readLine()) != null) {

                strArray = str.split("\\s");

                Edges.add(cnt, new Edge());

                Edges.get(cnt).u = Integer.parseInt(strArray[0]);

                Edges.get(cnt).v = Integer.parseInt(strArray[1]);

                Edges.get(cnt).weight = Integer.parseInt(strArray[2]);

                if (!nodeFather.containsKey(Edges.get(cnt).u)) {

                    nodeFather.put(Edges.get(cnt).u, Edges.get(cnt).u);//初始化,father[i]=i;

                    ++nodeCnt;

                }

                if (!nodeFather.containsKey(Edges.get(cnt).v)) {

                    nodeFather.put(Edges.get(cnt).v, Edges.get(cnt).v);

                    ++nodeCnt;

                }

                ++cnt;

            }

            br.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

    public boolean union(int u, int v) {//并操作

        int a = find(u);

        int b = find(v);

        if (a != b) {

            nodeFather.put(a, b);

            return true;

        }

        return false;

    }

 

    public int find(int x) {//查操作

        if (x != nodeFather.get(x)) {

            nodeFather.put(x, find(nodeFather.get(x)));

        }

        return nodeFather.get(x);

    }

 

    public ArrayListedge getMinSpanningTree() {

        ArrayListedge result = new ArrayListedge();

        Queueedge FsQueue = new PriorityQueueedge(1000,//设置优先队列,使按边权值从小到大排序

                new Comparatoredge() {

                    public int compare(Edge EdgeOne, Edge EdgeTwo) {

                        if (EdgeOne.weight  EdgeTwo.weight)

                            return 1;

                        else if (EdgeOne.weight  EdgeTwo.weight)

                            return -1;

                        else

                            return 0;

                    }

                });

 

        for (int i = 0; i  cnt; ++i) {

            FsQueue.add(Edges.get(i));

        }

 

        while (!FsQueue.isEmpty()) {//遍历每一条边

            Edge Edge = FsQueue.poll();

            if (union(Edge.u, Edge.v)) {

                result.add(Edge);

            } else {

                continue;

            }

        }

        return result;

    }

 

    public static void main(String[] args) {

        MinSpanningTree mstree = new MinSpanningTree("c:/treedata.txt");

        ArrayListedge result = mstree.getMinSpanningTree();

        for (int i = 0; i  result.size(); ++i) {

            System.out.println(result.get(i).u + " " + result.get(i).v + " "+ result.get(i).weight);

        }

    }

}

java中的算法,一共有多少种,哪几种,怎么分类。

就好比问,汉语中常用写作方法有多少种,怎么分类。

算法按用途分,体现设计目的、有什么特点

算法按实现方式分,有递归、迭代、平行、序列、过程、确定、不确定等等

算法按设计范型分,有分治、动态、贪心、线性、图论、简化等等

作为图灵完备的语言,理论上”Java语言“可以实现所有算法。

“Java的标准库'中用了一些常用数据结构和相关算法.

像apache common这样的java库中又提供了一些通用的算法

java图论算法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于算法 图论、java图论算法的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-05,除非注明,否则均为首码项目网原创文章,转载请注明出处。