如何计算该程序的复杂度?是否可以有其他任何一种复杂性更低的解决方案?

时间:2019-06-03 09:21:56

标签: c++ algorithm time-complexity space-complexity

问题链接:https://leetcode.com/contest/biweekly-contest-1/problems/campus-bikes-ii/

我想计算该程序的复杂度,我认为我的代码的复杂度为O(b ^ w),其中b是自行车总数,w是工人总数,尽管我不确定

在我的基本为dfs的“ bikeAssign()”函数中,首先,第一个工人可以选择b(总自行车)选项,第二个工人可以选择b-1选项,所以我认为时间复杂度是这样的-

(b)(b-1)(b-2) ...... (bw)几乎等于O(b ^ w)

空间复杂度:仅适用于dfs(bikeAssign())的O(w)

public:
    int assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
        int w = workers.size();
        int b = bikes.size();
        vector<vector<int> > dist;

        //complexity O(w*b)
        for( vector<int> worker : workers ) {
            vector<int> v;
            for( vector<int> bike : bikes ) {
                v.push_back( abs(worker[0]-bike[0]) + abs(worker[1]-bike[1]) );
            }
            dist.push_back(v);
        }

        vector<int> vis(b,0);
        //complexity O(b^w) My calculation
        return bikeAssign(dist, vis, 0, w );
    }


    // COMPLEXITY OF THIS FUNCTION ????

    int bikeAssign( vector<vector<int> > &dist, vector<int> &vis, int cnt, int w ) {
        if( cnt == w )
            return 0;

        int res = INT_MAX;
        for( int i=0;i<dist[0].size();i++ ) {
            if( vis[i] == 0 ) {
                vis[i] = 1;
                res = min( res, dist[cnt][i] + bikeAssign( dist, vis, cnt+1, w) );
                vis[i] = 0;
            }
        }

        return res;
    }
};

此解决方案已被接受,但是我对复杂性感到困惑。有人可以帮我弄清楚- 1.该程序的复杂性并有解释。 2.让我知道是否有其他方法具有更好的复杂性。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

  

此功能的复杂性????

让我们分析这种复杂性-

for( int i=0;i<dist[0].size();i++ ) {
      if( vis[i] == 0 ) {
            vis[i] = 1;
            res = min( res, dist[cnt][i] + bikeAssign( dist, vis, cnt+1, w) );
            vis[i] = 0;
      }
}

此for循环运行O(dist[0].size())次。让dSize = dist[0].size();

因此,这里的复杂度为O(dSize)。但是它针对每个dSize运行(从for循环的参数为每个元素运行一次开始)。因此,这里的总体复杂度为O(dSize*dSize)

什么是dSize?好的,dSize是 dist [0] 的大小。这就是将多少元素推到0-index向量的dist中。那是自行车的数量。因此,此功能的总体复杂度为O(b*b)

答案 1 :(得分:1)

由于此算法以递归方式扫描工人收集的所有可能的variation without repetition自行车,因此复杂度与变化量成正比。

o(b!/(b-w)!)b = bikes.size()中是w = workers.size()。因此,该算法无法很好地扩展。

这似乎类似于traveling salesman problem的问题(但您有多个“推销员”)。