以下代码的时间复杂度是多少,如何将其更改为线性或对数时间复杂度?

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如何检查列表中的项目是不是为浮点数,如果是,将其更改为字符串? [复制]

iOS 开发:如何在点击 UITableViewCell 时将其更改为可编辑的 UITextField?

spring security 重定向登录时端口 8080 来自哪里?如何将其更改为使用端口 443?