簡體   English   中英

以下代碼的時間復雜度是多少,如何將其更改為線性或對數時間復雜度?

[英]What is the time complexity of the following code and how can I change it into linear or logarithmic time complexity?

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) 如果不是那么請告訴時間復雜度以及如何?
其次可以在線性或對數時間復雜度內轉換上述代碼。 我是數據結構和算法領域的新手,請幫我解決這個問題。
如果您提供代碼,那就太好了。 謝謝你 :)

我不明白為什么人們對這個問題投反對票。 這很有趣。

如果所有輸入都是正數,則您想要的結果實際上是第二個最大值。 我相信你可以自己編碼。 證明是,結果必須是一個數除以最大數,同時第二個最大數除以最大數會給出最優結果,它等價於第二大數。 但是要小心,如果有多個最大數字,您需要檢查下一個最大的數字。

如果某些數字為負數,則可能有點棘手。 我假設模數的結果總是正的。 (雖然在 C 中它不會以這種方式工作,但在這種情況下您可以簡單地忽略這些負數)。 首先我們需要一個數組的副本,而所有的負數都被轉換為正數。 其次,我們需要兩個數組中的三個數字,原始數組中第二個最大的正數和最大的負數(最接近 0 的那個),以及第二個數組中的最大數(都轉換為正數)。 比較前兩個數字與第三個數字的模數,輸出較大的一個。

我讓你的原始代碼工作,所以你有一個起點。

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;
}

這不適用於所有輸入。 你仍然需要考慮負數等等。 但它可能會給你一個起點。 這是一個演示

祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM