使用C++將陣列對的XOR最小化以構成迴文


在計算機科學領域,高效地解決最佳化問題對於開發最優演算法和系統至關重要。其中一個問題就是最小化陣列中對的XOR(異或)以使其成為迴文。這種情況很重要,因為它提供了一個機會來確定重新排序陣列中專案的最佳方法,這可以導致更低的XOR值和迴文的建立。本文探討了兩種使用C++程式語言解決這個問題的方法。

語法

首先,讓我們定義一下我們將在下面的程式碼示例中使用的函式的語法:

int minimizeXORToPalindrome(int arr[], int n);

演算法

我們將使用的演算法旨在最小化陣列中對的XOR以將其轉換為迴文。以下是常規步驟:

  • 將陣列按非遞減順序排序。

  • 初始化兩個指標,left和right,分別指向陣列的第一個和最後一個元素。

  • 初始化一個變數xorSum,用於儲存對的XOR和。

  • 當left小於或等於right時,執行以下操作:

  • 計算left和right處元素的XOR,並將其新增到xorSum。

  • 將left向前移動一步,將right向後移動一步。

  • 返回xorSum。

方法一:反轉和XOR

第一種方法涉及反轉陣列並對相應的元素進行XOR運算以最小化XOR值。

示例

#include <algorithm>
#include <iostream>

int minimizeXORToPalindrome(int arr[], int n) {
   std::sort(arr, arr + n);  // Step 1: Sort the array
   int xorSum = 0;
   int left = 0, right = n - 1;
    
   while (left <= right) {
      xorSum += arr[left] ^ arr[right];  // Step 4: XOR the elements
      left++;
      right--;
   }
    
   return xorSum;  // Step 5: Return the XOR sum
}

int main() {
   int arr[] = {5, 3, 8, 6, 2};
   int n = sizeof(arr) / sizeof(arr[0]);
    
   int result = minimizeXORToPalindrome(arr, n);
   std::cout << "Minimized XOR value to make the array palindrome: " << result << std::endl;
    
   return 0;
}

輸出

Minimized XOR value to make the array palindrome: 15

解釋

minimizeXORToPalindrome函式接受一個數組(arr)和其大小(n)作為輸入。

在函式內部,我們首先使用std::sort(arr, arr + n)將陣列按非遞減順序排序。這是演算法的步驟1。

最初,讓我們將變數xorSum設定為零,因為它的功能稍後將儲存XOR對的和。

此外,定義了兩個名為left和right的新變數,它們分別指向輸入陣列中的第一個和最後一個元素。

最後,只要輸入條件宣告left應該小於或等於right;它使用其主體塊中的while語句迭代執行。

在迴圈中,我們使用^運算子計算left和right處元素的XOR,並將其新增到xorSum。這是演算法的步驟4。

我們將left加1,將right減1,以向陣列的中心移動。

一旦left大於right,while迴圈退出。

最後,我們返回xorSum,它表示使陣列成為迴文的最小XOR值。

在主函式中,我們提供了一個minimizeXORToPalindrome函式的使用示例:

  • 我們建立一個值為{5, 3, 8, 6, 2}的陣列arr。

  • 我們使用sizeof運算子計算陣列的大小(n)。

  • 我們呼叫minimizeXORToPalindrome函式,將陣列及其大小作為引數傳遞,並將結果儲存在result變數中。

  • 最後,我們列印使陣列成為迴文的最小XOR值。

方法二:高效配對

第二種方法側重於以高效的方式配對元素以最小化XOR值。

示例

#include <algorithm>
#include <iostream>  // Include the <iostream> header for std::cout and std::endl
#include <ostream>   // Include the <ostream> header for std::endl

int minimizeXORToPalindrome(int arr[], int n) {
   std::sort(arr, arr + n);  // Step 1: Sort the array
   int xorSum = 0;
    
   for (int i = 0; i < n / 2; i++) {
      xorSum += arr[i] ^ arr[n - 1 - i];  // Step 4: XOR the elements
   }
    
   return xorSum;  // Step 5: Return the XOR sum
}

int main() {
   int arr[] = {5, 3, 8, 6, 2};
   int n = sizeof(arr) / sizeof(arr[0]);
    
   int result = minimizeXORToPalindrome(arr, n);
   std::cout << "Minimized XOR value to make the array palindrome: " << result << std::endl;
    
   return 0;
}

輸出

Minimized XOR value to make the array palindrome: 15

解釋

minimizeXORToPalindrome函式接受一個數組(arr)和其大小(n)作為輸入。

在函式內部,我們首先使用std::sort(arr, arr + n)將陣列按非遞減順序排序。這是演算法的步驟1。

我們首先設定我們的xorSum變數並賦值為零。值得注意的是,此變數對於儲存我們所有XOR對和至關重要。

接下來是使用for迴圈遍歷我們總陣列大小的一半——從索引0到n/2-1。

在這個迴圈中,步驟四是我們繼續計算arr[i](從開頭開始的第i個元素)和arr[n-1-i](從結尾開始的第i個值)之間的XOR值。

我們將此XOR值新增到xorSum。

迴圈結束後,我們已經高效地配對所有元素以最小化XOR值。

最後,我們返回xorSum,它表示使陣列成為迴文的最小XOR值。

我們提供的程式碼展示了有效利用minimizeXORToPalindrome功能,類似於以前版本中顯示的此功能集的先前迭代。

我們的過程首先啟動在主方法操作中包含大小計算的陣列的建立,並透過minimizseXORTOPalindrome進一步強調呼叫。

我們總結了反饋,傳達了將原始集合元素轉換為迴文結構配置所需的最高效協商的XOR級別。

結論

在本文中,我們探討了兩種最小化陣列中對的XOR並將其轉換為迴文的方法。透過在C++中採用這些方法,程式設計師可以有效地重新排序陣列中的元素,減少XOR值並建立一個迴文。這種最佳化技術在各種領域(如資料操作和演算法設計)中都非常有價值,可以為相關問題提供更有效的解決方案。

更新於:2023年7月25日

瀏覽量:62

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.