我正在使用数据结构学习优化问题。
为此我已经考虑了手头的问题。
我有一个像movies[] = { 2,3,4,5,6,7,2,4,9 }
我有一个总和值:k = 5
现在我发现返回"k"
的数组元素的组合
例如:
2 + 3 = 5
3 + 2 = 5
以下代码可以做到:
#include<iostream>
#include<tuple>
using namespace std;
std::tuple<int, int> movies_combo(int k,int movies[]) {
int value_1 = 0, value_2 = 0;
int size = sizeof(movies);
//First lets sort the array in ascending order
//For optimized solution
double mid = sizeof(movies) / 2;
//Second lets find the sum of combination of array elements which gives "k"
for (int i = 0; i < (size-1); i++) {
for (int j = 0; j < (size - 1); j++) {
if (movies[i] + movies[j] == k) {
cout << "The two movies are: " << movies[i] << "and" << movies[j] << endl;
}
}
}
return make_tuple(value_1, value_2);
}
int main() {
int movies[] = { 2,3,4,5,6,7,2,4,9 };
int k = 6;
int value_1, value_2;
tie(value_1,value_2) = movies_combo(k, movies);
//cout << "The two movies are: " << value_1 << "and" << value_2 << endl;
}
现在我的时间复杂度为O(n ^ 2)。
我可以通过在开头对数组进行排序并消除值&gt;来进一步降低复杂性。 ķ。但这仅适用于几种情况,而不是优化的一般解决方案。
我希望有数据结构和算法方法在这种情况下可以非常方便地降低对数级别示例的复杂性:nlogn或logn。
如果有人对降低时间复杂度有任何想法,请告诉我。
答案 0 :(得分:3)
您可以及时 O(nlogn),甚至更好 O(n)。
O(nlogn)方法:
1 。及时排序元素 O(nlogn)时间。
2 。对于每个元素movies[i]
,在数组中从位置i+1
应用 binary search 直到要搜索的数组结尾元素k - movies[i]
。
3 。如果找到,那么你的元组是movies[i] + (k - movies[i]) = k
O(n)方法:
1 。存储哈希表中的所有元素。
2 。对于每个元素movies[i]
,在哈希表中搜索k - movies[i]
,如果发现你有元组。
3 。由于哈希表中的搜索需要 O(1)时间,因此此方法需要时间 O(n)。