最小化给定数组中对应索引处不相等元素的数量


比较每个索引处的元素,并对其进行调整以使其匹配,从而减少给定数组之间对应索引处不一致元素的数量。在同时迭代数组时根据需要进行调整。结果,数组将变得更加相似,不相等元素的比例将减少。通过减少其对应位置的差异,此过程旨在提高数组之间的相似性。最终目标是生成在每个索引处具有相同元素的数组,这将减少不相等元素的数量。

使用的方法

  • 哈希方法

  • 排序方法

哈希方法

在哈希方法中,我们首先为其中一个数组创建一个哈希表,以便在比较数组之间的文件时减少不相等元素的数量。此时,当我们遍历第二个数组时,我们查看哈希表中每个元素的频率。如果找到该元素,则保留它;如果没有找到,则使用哈希表中最接近的匹配元素来代替它。通过此过程,对应索引处不相等元素的数量减少,并且两个数组变得更加相似。此方法的效率是一个优势,因为它可以在线性时间复杂度 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 次查看

开启您的职业生涯

通过完成课程获得认证

开始
广告