如何使用回溯查找图形着色的时间复杂度?

Posted

技术标签:

【中文标题】如何使用回溯查找图形着色的时间复杂度?【英文标题】:How to find Time complexity of Graph coloring using backtracking? 【发布时间】:2018-04-17 20:55:01 【问题描述】:

我必须使用回溯找出图形着色问题的时间复杂度。我在某处发现它是 O(n*m^n),其中 n=无顶点,m= 颜色数。

假设下面给出我的代码如何求时间复杂度?

bool isSafe (int v, bool graph[V][V], int color[], int c)

    for (int i = 0; i < V; i++)
        if (graph[v][i] && c == color[i])
            return false;
    return true;


bool graphColoringUtil(bool graph[V][V], int m, int color[], int v)

    if (v == V)
        return true;

    for (int c = 1; c <= m; c++)
    
        if (isSafe(v, graph, color, c))
        
           color[v] = c;

           if (graphColoringUtil (graph, m, color, v+1) == true)
             return true;

           color[v] = 0;
        
    

    return false;

bool graphColoring(bool graph[V][V], int m)

    int *color = new int[V];
    for (int i = 0; i < V; i++)
       color[i] = 0;

    if (graphColoringUtil(graph, m, color, 0) == false)
    
      printf("Solution does not exist\n");
      return false;
    

    printSolution(color);
    return true;

void printSolution(int color[])

    printf("Solution Exists:"
            " Following are the assigned colors \n");
    for (int i = 0; i < V; i++)
      printf(" %d ", color[i]);
    printf("\n");
 

【问题讨论】:

【参考方案1】:

graphutil 方法将自己执行 n 次。它在 c 循环中,并且 c 上升到 m 。 现在 c 循环由于递归而进行了 n 次(即 m^n),并且递归进行了 n 次,所以总共将是 O(nm^n )

【讨论】:

根据我的计算,它也是 O((n*m)^n) 但是否有一些来源可以证实这一点。我看到geeksforgeeks.org/m-coloring-problem-backtracking-5 只提到了 O(m^n),所以我还是很困惑。 以上答案是错误的。它的实际时间复杂度是 m^n。

以上是关于如何使用回溯查找图形着色的时间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章

如何分析回溯 dfs时间复杂度

如何提出回溯问题的时间复杂度?

纠正用于回溯图着色算法的 Java 递归代码

“回溯”和“分支和绑定”之间的区别

暴力穷举和回溯法(八皇后问题)

回溯算法的复杂度