[英]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.