以下代码的时间复杂度是多少,如何将其更改为线性或对数时间复杂度?
Posted
技术标签:
【中文标题】以下代码的时间复杂度是多少,如何将其更改为线性或对数时间复杂度?【英文标题】:What is the time complexity of the following code and how can I change it into linear or logarithmic time complexity? 【发布时间】:2016-03-27 11:12:53 【问题描述】:long int num,max,mod,a,i,j;
cin>>num;
long int arr[num];
for(a=0;a<num;a++)
cin>>arr[a];
max=arr[0]%arr[0];
for(i=0;i<num;i++)
for(j=0;j<num;j++)
mod=arr[i]%arr[j];
if(mod>max)
max=mod;
cout<<max;
我猜它是 o(n^n) 如果不是那么请告诉时间复杂度以及如何? 其次,上述代码可以在线性或对数时间复杂度内进行转换。 我是数据结构和算法领域的新手,请帮我解决这个问题。 如果您提供代码,那就太好了。谢谢你:)
【问题讨论】:
在等待提供代码的同时,您想喝杯咖啡吗? @Mikel 抱歉,不是 num,我写错了。 @mjp66 当然可以等.. 这与计算数组中的第二大数字有何不同? @Maikel 实际上在这里我需要找到数组中的最大 Mod 值而不是第二大数字。 【参考方案1】:我不明白为什么人们不赞成这个问题。挺有意思的。
如果所有输入都是正数,那么您想要的结果实际上是第二个最大值。我相信你可以自己编码。证明是,结果必须是一个数 mod 最大数,同时第二个最大数 mod the maximum 将给出最佳结果,它相当于第二大数。但要小心,如果最大数字不止一个,则需要检查下一个最大的数字。
如果有些数字是负数,可能会有点棘手。我假设模数的结果总是积极的。 (虽然在 C 中它不是这样工作的,但在这种情况下你可以简单地忽略这些负数)。首先我们需要一个数组的副本,同时将所有负数转换为正数。其次,我们需要两个数组中的三个数字,原始数组中的第二个最大正数和最大负数(最接近 0 的那个),以及第二个数组中的最大数(全部转换为正数)。比较前两个数字与第三个数字,输出较大的数字。
【讨论】:
我认为它被否决了,因为提问者没有表现出对任何工作源代码进行编程的大量努力。他可能发布了他的作业。【参考方案2】:我使您的原始代码正常工作,因此您有了一个起点。
template <class T>
T maxmod(vector<T> const& arr)
auto max = numeric_limits<T>::lowest();
for(auto x : arr)
for (auto y : arr)
max = std::max(max, y ? x%y : 0);
return max;
您的问题实际上很有趣,并且取决于模运算的符号约定(这是在 C++03 之前定义的实现)。通常,通过将最大搜索与一些变换相结合,应该可以在线性时间内求解。这是第一次线性尝试
template <class T>
T my_maxmod(vector<T> arr) // deep copy array because we change it
T max = *std::max_element(arr.cbegin(), arr.cend()); // O(N)
assert(max != 0); // TODO
std::transform(arr.begin(), arr.end(), arr.begin(), [max](T const& a) // O(N)
return a % max;
);
max = *std::max_element(arr.cbegin(), arr.cend()); // O(N)
return max;
这不适用于所有输入。你仍然需要考虑负数等等。但它可能会给你一个起点。这是Demo
祝你好运。
【讨论】:
以上是关于以下代码的时间复杂度是多少,如何将其更改为线性或对数时间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 使用 Gcc 编译,如何将其更改为 G++? (使用 CMake)
为啥我的 View 是 utf8 以及如何将其更改为 latin1
在 C++ 中,主函数是编程的入口点,我如何将其更改为其他函数?
Python如何检查列表中的项目是不是为浮点数,如果是,将其更改为字符串? [复制]