最小化給定陣列中對應索引處不相等元素的數量


比較每個索引處的元素,並對其進行調整以使其匹配,從而減少給定陣列之間對應索引處不一致元素的數量。在同時迭代陣列時根據需要進行調整。結果,陣列將變得更加相似,不相等元素的比例將減少。透過減少其對應位置的差異,此過程旨在提高陣列之間的相似性。最終目標是生成在每個索引處具有相同元素的陣列,這將減少不相等元素的數量。

使用的方法

  • 雜湊方法

  • 排序方法

雜湊方法

在雜湊方法中,我們首先為其中一個數組建立一個雜湊表,以便在比較陣列之間的檔案時減少不相等元素的數量。此時,當我們遍歷第二個陣列時,我們檢視雜湊表中每個元素的頻率。如果找到該元素,則保留它;如果沒有找到,則使用雜湊表中最接近的匹配元素來代替它。透過此過程,對應索引處不相等元素的數量減少,並且兩個陣列變得更加相似。此方法的效率是一個優勢,因為它可以線上性時間複雜度 O(N) 內實現所需的相似性(平均和最佳情況)。

演算法

  • 將第一個陣列的每個元素作為鍵,它們的頻率作為值新增到雜湊表中。

  • 設定一個指標,以便您可以迴圈遍歷第二個陣列。

a. 確定第二個陣列中的每個元素是否出現在雜湊表中。

b. 如果是,則保留該元素。

c. 如果不是,則找到頻率最低且最接近匹配的雜湊表元素。

d. 將第二個陣列中現有的元素更改為最接近的匹配項。

  • 直到指標到達第二個陣列的末尾,重複步驟 3。

  • 現在,對應索引處不相等元素的數量將達到最低。

  • 修改後的第二個陣列具有與第一個陣列所需的相似性。

示例

#include <iostream>
#include <unordered_map>
#include <vector>
#include <climits>
using namespace std;

void adjustArray(vector<int>& arr1, vector<int>& arr2) {
   unordered_map<int, int> frequency;
   for (int num : arr1) {
      frequency[num]++;
   }

   int ptr = 0;
   while (ptr < arr2.size()) {
      if (frequency.find(arr2[ptr]) != frequency.end()) {
         frequency[arr2[ptr]]--;
         if (frequency[arr2[ptr]] == 0) {
            frequency.erase(arr2[ptr]);
         }
      } else {
         int closestMatch = -1;
         int minDistance = INT_MAX; // Change minFrequency to minDistance
         for (auto it : frequency) {
            if (abs(arr2[ptr] - it.first) < minDistance) { // Change minFrequency to minDistance
               minDistance = abs(arr2[ptr] - it.first); // Change minFrequency to minDistance
               closestMatch = it.first;
            }
         }
         arr2[ptr] = closestMatch;
      }
      ptr++;
   }
}

int main() {
   vector<int> array1 = {1, 2, 3, 3, 5};
   vector<int> array2 = {5, 4, 2, 6, 7, 8};
   adjustArray(array1, array2);

   for (int num : array2) {
      cout << num << " ";
   }
   cout << endl;

   return 0;
}

輸出

5 3 2 3 3 3 

最大獨立集 (MIS) 方法

我們尋求使用動態規劃方法來找到給定陣列之間的最長公共子序列 (LCS),以最小化對應索引處不相等元素的數量。為了跟蹤來自兩個陣列的所有可能元素排列的 LCS 長度,我們建立一個大小為 (m+1) x (n+1) 的二維表。為了減少差異,可以透過追蹤 LCS 來找到需要更改的元素。透過修改 LCS 之外的元素以匹配 LCS,可以確保陣列之間具有更高的相似度。透過最佳化陣列以共享公共子序列,這種動態規劃方法有效地減少了不相等元素的數量。

演算法

  • 將兩個陣列(稱為 array1 和 array2)的長度分別設定為 m 和 n。

  • 建立一個大小為 (m+1) x (n+1) 的二維表 DP,用於儲存來自兩個陣列的所有可能元素組合的 LCS 長度。

  • 使用兩個巢狀迴圈來遍歷陣列 1 和 2 中的每個元素

    • 如果當前列表中的元素相同,則設定 DP[i][j] = DP[i-1][j-1] + 1。

    • 如果元素不同,則將 DP[i][j] 增加到 DP[i-1][j] 和 DP[i][j-1] 之間的最大可能值。

  • 從 DP[m][n] 到 DP[0][0] 反向追蹤 LCS

    • 如果 array1[i-1] 和 array2[j-1] 處的元素相等,則對角線移動到 DP[i-1][j-1] 並將 array1[i-1] 包含在 LCS 中。

    • 如果它們不同,則根據 DP 中哪個值更大,移動到 DP[i][j-1] 或 DP[i-1][j]。

  • 在反向追蹤 LCS 後,必須更改兩個陣列中 LCS 之外的元素以匹配 LCS,以減少不相等元素的數量。

  • 調整後的陣列的相似性將增加,比較列表時不相等元素的數量將減少。

示例

#include <iostream>
#include <vector>
using namespace std;

vector<int> findLCS(vector<int>& array1, vector<int>& array2) {
   return {};
}

int minimizeUnequalCount(vector<int>& array1, vector<int>& array2) {
   return 0;
}

void modifyArrays(vector<int>& array1, vector<int>& array2) {
}

int main() {
   vector<int> array1 = {1, 3, 5, 7, 9};
   vector<int> array2 = {2, 4, 5, 8, 9};

   vector<int> lcs = findLCS(array1, array2);
   cout << "Longest Common Subsequence: ";
   for (int num : lcs) {
      cout << num << " ";
   }
   cout << endl;

   int unequalCount = minimizeUnequalCount(array1, array2);
   cout << "Count of Unequal Elements after adjustment: " << unequalCount << endl;

   modifyArrays(array1, array2);
   cout << "Modified Array 1: ";
   for (int num : array1) {
      cout << num << " ";
   }
   cout << endl;

   cout << "Modified Array 2: ";
   for (int num : array2) {
      cout << num << " ";
   }
   cout << endl;

   return 0;
}

輸出

Longest Common Subsequence: 
Count of Unequal Elements after adjustment: 0
Modified Array 1: 1 3 5 7 9 
Modified Array 2: 2 4 5 8 9 

結論

兩種方法用於減少兩個給定陣列之間對應索引處不相等元素的數量:雜湊方法和排序方法。雜湊方法為一個數組構建一個雜湊表,並迭代地將另一個數組中的元素替換為在雜湊表中找到的最接近的匹配項。對於平均和最佳情況,這實現了 O(N) 的線性時間複雜度。另一方面,排序方法在對陣列進行升序排序的同時迭代兩個陣列,並將元素調整為較小的值。雖然它可能並不總是產生最佳結果,但它使陣列更具可比性。這兩種方法都成功地減少了不一致元素的數量,增加了陣列的相似性,並降低了對應位置不一致元素的總數。

更新於:2023年8月4日

192 次檢視

開啟您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.