如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案

How to calculate complexity of this program? Can there be any other solution with less complexity?

本文关键字:复杂性 任何 是否 其他 解决方案 何计算 计算 程序      更新时间:2023-10-16

>问题链接: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)