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

时间:2017-03-07 21:38:21

标签: java graph-theory

我正在编写一个代码来查找图表的K级连接

G = (V,E).

如果图G中任意两个随机选择的顶点之间至少有两条不相交的路径,则该图称为2级连接。

当图形很小(顶点数量较少)时,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;
}

代码已知且存在于互联网上。代码只是依次选择其中一个节点V,并开始搜索和计算所有路径。因此,代码将返回处于K连接级别的任意两个随机节点之间的最小数量的不相交路径。

我的问题是:

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

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

0 个答案:

没有答案