以下哪个代码的时间复杂度较低?请解释如何计算它

时间:2017-06-27 20:50:48

标签: arrays time-complexity subset space-complexity tradeoff

以下是计算给定数组子集的代码:

  1. 位操作方法: 如何分析?

     vector<vector<int>> subsets(vector<int>& nums)
      {
         sort(nums.begin(), nums.end());
    
         int num_subset = pow(2, nums.size()); 
         vector<vector<int> > res(num_subset, vector<int>());
    
         for (int i = 0; i < nums.size(); i++)
             for (int j = 0; j < num_subset; j++)
                 if ((j >> i) & 1)
                     res[j].push_back(nums[i]);
    
         return res;  
      }
    
  2. 回溯方法: 如何分析

         vector<vector<int>> subsets(vector<int>& nums)
          {
            sort(nums.begin(), nums.end()); // sort the original array
            vector<vector<int>> subs;
            vector<int> sub;  
            genSubsets(nums, 0, sub, subs);
            return subs; 
          }
    
        void genSubsets(vector<int>& nums, int start, vector<int>& sub,vector<vector<int>>& subs)
          {
            subs.push_back(sub);
            for (int i = start; i < nums.size(); i++) {
             sub.push_back(nums[i]);
             genSubsets(nums, i + 1, sub, subs);
             sub.pop_back();
           }
         }
    

1 个答案:

答案 0 :(得分:0)

矢量操作: - push_backpop_back都是O(1) - 大小参数为n的构造函数为O(n)

位操作方法:

  • sortO(n log n)
  • res的构建是O(nums_subset) = O(2^n)
  • 外循环执行n次,内部执行nums_subset = 2^n次。

    enter image description here

回溯方法:

  • 同样,sortO(n log n)
  • 每次genSubsets次调用都会循环nums.size() - start次,每次执行一次递归调用,循环次数减少一次。

    enter code here

哪个更大?通过斯特林的近似,

enter image description here

所以回溯的成本更高。