问题链接: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.让我知道是否有其他方法具有更好的复杂性。
任何帮助将不胜感激。
答案 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的问题(但您有多个“推销员”)。