如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
How to calculate complexity of this program? Can there be any other solution with less complexity?
>问题链接:https://leetcode.com/contest/biweekly-contest-1/problems/campus-bikes-ii/
我想计算这个程序的复杂性,我认为我的代码的复杂性是 O(b^w(,其中 b 是总自行车的大小,w 是总工人的大小,尽管我不确定。
在我的"bikeAssign(("函数中,它基本上可以用作 dfs,首先第一个工人有 b(总自行车(选项可供选择,第二个有 b-1 选项可供选择,所以我认为时间复杂度是这样的-
(b((b-1((b-2(......(b-w( 几乎等于 O(b^w(。
空间复杂度:O(w( 对于 dfs (仅限 bikeAssign(((
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.让我知道是否有其他具有更好复杂性的解决方案。
任何帮助将不胜感激。
由于该算法递归扫描所有可能的变化,而不会重复工人收集的自行车,因此复杂性与该变化数量成正比。
所以b = bikes.size()
和w = workers.size()
的地方o(b!/(b-w)!)
.所以这个算法不能很好地扩展。
这看起来像是一个类似于旅行推销员问题的问题(但你有多个"推销员"(。
此功能的复杂性????
我们来分析一下这个复杂性——
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] 的大小。这就是有多少元素被推到dist
向量的0-index
。那是自行车的数量。所以这个函数的整体复杂度是O(b*b)
。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 具有未知值时的时间复杂性
- 关联容器的下界复杂性:成员函数与非成员函数
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 使用堆查找第K个最大元素的时间复杂性
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 并行标准::复制复杂性
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- std :: vector用作堆栈和std :: stack之间是否存在任何复杂性差异