最小集合覆盖解的时间复杂度分析

时间:2015-08-17 02:42:24

标签: java algorithm data-structures time-complexity

关于问题

  

有n人和k种不同类型的菜肴。每个人都有   对每道菜都有一些偏好。他喜欢与否。我们要   喂所有人。每个人都应该得到他的至少一道菜   chioce。我们可以提供不同类型菜肴的最小数量   购买?

其中一个解决方案是,

  public class OptimumDish {

  private Set<Integer> result = new HashSet<Integer>();

  public void print(){
    for(int r:result)
      System.out.print(r + " ");
  }

  // Find the optimum dish by navigating all available options
  public void find(int[][] m, int r, int c, int mr, int mc, Stack<Integer> dishes) {

    dishes.push(c);

    if (r == mr) {
      // Reached last person. Get the unique dishes
      Set<Integer> d = new HashSet<>(dishes);
      if(result.size() == 0 || result.size() > d.size())
        result = d;
    }
    else if (r < mr) {
      // Check next person's preferred dish
      for (int i = 0; i <= mc; i++) {
        if (m[r + 1][i] == 1) {
          find(m, r+1, i, mr, mc, dishes);
          break;
        }
      }
    }

    dishes.pop();

    // Current dish may not be the optimum.
    // Check other dish for the same person
    for (int i = c + 1; i <= mc; i++) {
      if (m[r][i] == 1) {
        find(m, r, i, mr, mc, dishes);
      }
    }
  }

  public static void main(String[] args) {

    int[][] m = { 
        { 0, 1, 1, 0, 0, 0, 0 },
        { 0, 1, 0, 1, 0, 0, 0 },
        { 0, 1, 1, 0, 0, 1, 0 },
        { 1, 0, 0, 1, 0, 0, 0 },
        { 0, 0, 1, 0, 1, 0, 0 },
        { 0, 0, 0, 1, 0, 0, 1 }
        };

    int mr = m.length - 1;
    int mc = m[0].length - 1;
    int c = 0;

    for (int i = 0; i <= mr; i++) {
      if (m[0][i] == 1) {
        c = i;
        break;
      }
    }

    OptimumDish od = new OptimumDish();
    Stack<Integer> dishes = new Stack<>();
    od.find(m, 0, c, mr, mc, dishes);
    od.print();
  }
}

此问题属于&#39;最小设置封面&#39;。由于它是NP完全问题,因此无法在多项式时间内求解。根据解决方案,它可以在多项式时间内求解?

请告诉我这个解决方案的时间复杂度是多少?为O(n ^ 4)+。感谢。

0 个答案:

没有答案