Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 确定大O:在数组中找到4个不同的数字,求和为S_Arrays_Algorithm_C++11 - Fatal编程技术网

Arrays 确定大O:在数组中找到4个不同的数字,求和为S

Arrays 确定大O:在数组中找到4个不同的数字,求和为S,arrays,algorithm,c++11,Arrays,Algorithm,C++11,给定一个数字数组arr和一个数字S,找到4个不同的数字 在arr中,总计为S 编写一个函数,获取arr和S并返回一个包含4的数组 arr中此类数字的索引 我提出的解决方案涉及递归地建立索引的组合,同时确保不会多次计算组合。我还通过确保解决方案集的大小不超过4来修剪搜索树 #include <iostream> #include <vector> using namespace std; bool find_sol(vector<int> &N, ve

给定一个数字数组arr和一个数字S,找到4个不同的数字 在arr中,总计为S

编写一个函数,获取arr和S并返回一个包含4的数组 arr中此类数字的索引

我提出的解决方案涉及递归地建立索引的组合,同时确保不会多次计算组合。我还通过确保解决方案集的大小不超过4来修剪搜索树

#include <iostream>
#include <vector>
using namespace std;

bool find_sol(vector<int> &N, vector<int> &I, int S, int sum){
  if (I.size() == 4)
    if (S == sum)
      return true;
    else
      return false;
  for (int i = 0; i < N.size(); ++i){
    if (I.empty() || I[I.size()-1] < i){
      I.push_back(i);
      if (find_sol(N,I,S,sum+N[i]))
        return true;
      else {
        I.pop_back();
      }
    }
  }
  return false;
}

int main(){
  int S = 23;
  vector<int> numbers = {1,3,5,6,7,8,9};
  vector<int> indices;
  find_sol(numbers,indices,S,0);

  // prints 0, 2, 5, 6
  for (int i = 0; i < indices.size(); ++i)
    cout << indices[i] <<" ";
  cout<<endl;

  return 0;
}
#包括
#包括
使用名称空间std;
bool find_sol(向量&N、向量&I、整数S、整数和){
如果(I.大小()==4)
如果(S==总和)
返回true;
其他的
返回false;
对于(int i=0;icout您的解决方案确实是
O(nC4)=O(n^4)
,因为它会找到所有可能的组合并检查它们,并且对于每个组合,都会有不断的额外工作

可以在
O(n^2)
中首先填充一个哈希映射(
std::unordered_map
),其中键是数组中所有对的总和,值指向这些值的索引。 填充此映射的是
O(n^2)
average case

然后,再次迭代所有对,对于每个对
i,j
d
,在哈希映射中查找是否有一个带有key
S-d
的条目

警告:您还需要确保此条目不包含来自
i,j
的索引。为了能够处理它,您的映射值实际上可能是成对的向量



作为旁注,这个问题被称为,有4个元素正好与目标值相加(经典问题没有限制)

你的解决方案确实是
O(nC4)=O(n^4)
,因为它会找到所有可能的组合并检查它们——对于每一个组合,都会有不断的额外工作

可以在
O(n^2)
中首先填充一个哈希映射(
std::unordered_map
),其中键是数组中所有对的总和,值指向这些值的索引。 填充此映射的是
O(n^2)
average case

然后,再次迭代所有对,对于每个对
i,j
d
,在哈希映射中查找是否有一个带有key
S-d
的条目

警告:您还需要确保此条目不包含来自
i,j
的索引。为了能够处理它,您的映射值实际上可能是成对的向量



作为旁注,这个问题被称为,有一个4个元素正好和目标(经典问题没有限制)的松弛,你可能想回顾一下复杂性意味着什么。没有
O(4)
@Olaf我的意思是nC4的二项式系数。O(nC4)是O(n^4),所以这不是答案。这个问题可以在O(nS)时间内解决。这比O(n^2)好还是坏取决于
s
是大于还是小于
n
。有关更多信息,请参阅。您可能想查看复杂性的含义。没有
O(4)
@Olaf我指的是nC4.O(nC4)的二项式系数是O(n^4),所以这不是答案。这个问题可以在O(nS)时间内解决。它比O(n^2)好还是坏取决于
s
是大于还是小于
n
。有关更多信息,请参阅。