簡體   English   中英

有沒有辦法合並兩個(或多個)for循環以降低整體時間復雜度?

[英]Is there any way to merge two (or multiple) for loops to reduce the overall time complexity?

實際上我已經解決了比較計算結果並返回最小值的問題。 雖然我成功地實現了邏輯並很好地執行了代碼,但未能降低時間復雜度。

#include<iostream>
#include<algorithm>
#include<climits>

using namespace std;

int checkMinimum(int array[], int index)
{
  int result = INT_MAX;

  for(int i = 0; i < index; ++i)
    for(int j = 0; j < index; ++j)
      if(i != j && (min(result, ((array[i] & array[j]) ^ (array[i] | array[j]))) < result))
        result = min(result, ((array[i] & array[j]) ^ (array[i] | array[j])));

  return result;
}

void getMinimum()
{
  int index;
  cin >> index;
  int array[index];

  for(int i = 0; i < index; ++i)
    cin >> array[i];

  cout << checkMinimum(array, index) << endl;
}

int main()
{
  int limit;
  cin >> limit;
  while(limit--)
    getMinimum();

  return 0;
}

在研究了 for 循環並嘗試將它們合並在一起之后根本無濟於事,因為很難將循環的條件滿足為一個。

#include<iostream>
#include<algorithm>
#include<climits>

using namespace std;

int checkMinimum(int array[], int index)
{
  int result = INT_MAX;

  for(int i = 0, j = index - 1; i != j; ++i, --j)
    if((min(result, ((array[i] & array[j]) ^ (array[i] | array[j]))) < result))
      result = min(result, ((array[i] & array[j]) ^ (array[i] | array[j])));

  return result;
}

void getMinimum()
{
  int index;
  cin >> index;
  int array[index];

  for(int i = 0; i < index; ++i)
    cin >> array[i];

  cout << checkMinimum(array, index) << endl;
}

int main()
{
  int limit;
  cin >> limit;
  while(limit--)
    getMinimum();

  return 0;
}

那么我怎樣才能降低這個的時間復雜度呢?

(array[i] & array[j]) ^ (array[i] | array[j])等價於array[i] ^ array[j] ( & , ^ , |都是按位運算;寫出真值表一點點)。

為了最小化異或,最重要的是高位一致。 假設輸入有幾個數字0xxxx和幾個數字1xxxx 嘗試使用0xxxx1xxxx的配對是沒有意義的; 即使xxxx部分完全相同,異或也是10000 ,而任何0xxxx與任何0xxxx的異或,或任何1xxxx與任何1xxxx的異或最多為01111 ,小於10000

在每個組中的下一位重復此邏輯,之后的下一位,可以顯示具有最小 XOR 的對以排序順序彼此相鄰出現。 因此,您可以對數組進行排序並計算n − 1相鄰對的最小值。

暫無
暫無

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

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