Java 图形级连接处理占用大量空间和时间

Java 图形级连接处理占用大量空间和时间,java,graph-theory,Java,Graph Theory,我正在编写一个代码,用于查找图的K级连通性 G = (V,E). 如果图G中任意两个随机选择的顶点之间至少有两条不相交的路径,则该图称为二级连通性 当图形较小(顶点数较少)时,DFS或任何搜索都需要少量时间,但当处理大型图形(如100个顶点)时,搜索技术将需要大量时间和内存 下面是我使用Java查找连接级别的代码: public static List<List<Integer>> list_of_all_path; // record all the paths of

我正在编写一个代码,用于查找图的K级连通性

G = (V,E).
如果图
G
中任意两个随机选择的顶点之间至少有两条不相交的路径,则该图称为二级连通性

当图形较小(顶点数较少)时,DFS或任何搜索都需要少量时间,但当处理大型图形(如100个顶点)时,搜索技术将需要大量时间和内存

下面是我使用Java查找连接级别的代码:

public static List<List<Integer>> list_of_all_path; // record all the paths of the graph

public static int connectivity_level_CR(Graph g) {
    list_of_all_path = new ArrayList<List<Integer>>();

    int minimum_level = 10000000; // high number

    for (int z = 0; z < vNumber; z++) {
        for (int l = 0; l < vNumber; l++) {
            if (z != l) {
                g.printPaths(z, l);
                if (listOfLists.size() < minimum_level) {
                    minimum_level = listOfLists.size(); // record the minimum number of paths between two nodes
                }
            }        
        }
    }
    if (!(is_the_network_connected(g))) minimum_level = 0; // if the network is disconnected, the connectivity level is zero
    return minimum_level;
}

public void printPaths(int s, int d) {
    listOfLists.clear();
    Boolean[] visited = new Boolean[vNumber];
    Integer[] path = new Integer[vNumber];
    int path_index = 0;
    count_paths = 0;
    for (int i = 0; i < vNumber; i++) {
        visited[i] = false;
    }

    printPathsUtil(s, d, visited, path, path_index);
}

//find the paths in the graph
int count_paths = 0;

public void printPathsUtil(int s, int d, Boolean[] visited, Integer[] path, int path_index) {
    visited[s] = true;
    path[path_index] = s;
    path_index++;

    if (s == d) {
        //List<Integer> intList = Arrays.asList(path);
        //listOfLists.add(intList);
        List<Integer> path_of = new ArrayList<Integer>();

        for (int i = 0; i < path_index; i++) {
            //System.out.print(path[i] + " ");
            path_of.add(path[i]);
        }
        listOfLists.add(path_of);
        //list_of_all_path.add(path_of);      
        //System.out.println();
    } else {  
        ArrayList<Integer> list = adj[s];
        for (Integer i : list) {
            if (!visited[i])
                printPathsUtil(i, d, visited, path, path_index);
        }
    }

    path_index--;
    visited[s] = false;
}
所有路径的公共静态列表;//记录图形的所有路径
公共静态int连接\u级别\u CR(图g){
list of_all_path=new ArrayList();
int最小_级别=10000000;//高数字
对于(intz=0;z
该代码是已知的,并且存在于internet上。代码只是依次选择一个节点,
V
,并开始搜索和计算所有路径。因此,该代码将返回任意两个随机节点之间的最小不相交路径数,该路径数为K连通性级别

我的问题是:

如上所示,搜索方法不适用于大型图, 那么,有没有任何方法、代码或数学理论可以用少量的时间和内存返回大型图的K连通性级别呢


假设大图包含100个顶点,并且是强连通的,这意味着它至少具有2级连通性。

不相交路径是指“没有公共顶点”还是“没有公共边”?我认为您的代码电子邮件考虑了两个顶点之间多条路径的相同边。例如,我认为
printPathsUtil(0,2,布尔[4],整数[4],0)
列表中添加了2条路径(我假设它应该是
所有路径的列表
),给定
adj=[{1},{0,2,3},{1,3},{2,1}
-发生这种情况是因为递归忽略了过去,并将较小的问题视为新问题。在顶点1和3之间有两条路径。但是只有一条边从0到1。不相交的路径是这样的:A->B->c->e A->B->K->e,所以从A到e的路径不相似,所以是的,我必须走中间较小的路径,这是我的问题,需要大量的时间和空间。你现在给出的路径在两个定义中都不是不相交的,因为它们有共同的边A->B。因此,将它们计算为两条不相交的路径是错误的。我的问题是,就你的问题而言,A->B->C和A->D->B->E->C是否被认为是不相交的。(存在独立于顶点和独立于egde的定义。连接定义使用哪一个?)是的,即使A->B是公共的,但被视为两个不同的路径也被视为不相交的路径“不相交路径”是指“没有公共顶点”还是“没有公共边”?我认为您的代码电子邮件考虑了两个顶点之间多条路径的相同边。例如,我认为
printPathsUtil(0,2,布尔[4],整数[4],0)
列表中添加了2条路径(我假设它应该是
所有路径的列表
),给定
adj=[{1},{0,2,3},{1,3},{2,1}
-发生这种情况是因为递归忽略了过去,并将较小的问题视为新问题。在顶点1和3之间有两条路径。但是只有一条边从0到1。不相交的路径是这样的:A->B->c->e A->B->K->e,所以从A到e的路径不相似,所以是的,我必须走中间较小的路径,这是我的问题,需要大量的时间和空间。你现在给出的路径在两个定义中都不是不相交的,因为它们有共同的边A->B。因此,将它们计算为两条不相交的路径是错误的。我的问题是,就你的问题而言,A->B->C和A->D->B->E->C是否被认为是不相交的。(存在独立于顶点和独立于egde的定义。连接定义使用哪一个?)是的,即使A->B是公共的,但被视为两条不同的路径,也被认为是不相交的