Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Minimumkan bilangan elemen yang tidak sama pada indeks yang sepadan antara tatasusunan yang diberikan

Minimumkan bilangan elemen yang tidak sama pada indeks yang sepadan antara tatasusunan yang diberikan

王林
王林ke hadapan
2023-08-26 12:57:181232semak imbas

Minimumkan bilangan elemen yang tidak sama pada indeks yang sepadan antara tatasusunan yang diberikan

Bandingkan elemen pada setiap indeks dan laraskannya sehingga ia sepadan untuk mengurangkan bilangan elemen tidak konsisten pada indeks yang sepadan antara tatasusunan yang diberikan. Laraskan seperlunya sambil melelaran secara serentak melalui tatasusunan. Tatasusunan akan menjadi lebih serupa dan perkadaran unsur yang tidak sama akan berkurangan akibatnya. Dengan mengurangkan perbezaan mereka pada kedudukan yang sepadan, proses ini bertujuan untuk meningkatkan persamaan antara tatasusunan. Objektif utama adalah untuk menghasilkan tatasusunan dengan elemen yang sama pada setiap indeks, yang akan mengurangkan bilangan elemen yang tidak sama rata.

使用的方法

  • Pendekatan Hashing

  • Pendekatan Isih

哈希方法

Dalam Pendekatan Hashing, kami mulakan dengan membuat jadual cincang untuk salah satu tatasusunan untuk mengurangkan bilangan komponen yang tidak sama rata apabila membandingkan fail antara tatasusunan. Pada ketika itu, semasa kita mengulangi melalui tatasusunan momen, kita melihat kekerapan setiap komponen dalam jadual cincang. Sekiranya komponen itu dijumpai, ia disimpan; sekiranya tidak, komponen penyelaras terdekat daripada jadual cincang digunakan sebagai gantinya. Hasil daripada proses ini, terdapat lebih sedikit unsur tidak sama pada indeks yang sepadan dan kedua-dua tatasusunan menjadi lebih serupa. Kecekapan kaedah ini adalah satu kelebihan kerana ia boleh mencapai persamaan yang diingini dalam kerumitan masa linear O(N) untuk kes purata dan terbaik.

Algoritma

  • Setiap elemen tatasusunan pertama harus ditambah sebagai kunci dan frekuensinya sebagai nilai pada jadual cincang.

  • Sediakan penunjuk supaya anda boleh mengitar tatasusunan kedua.

a. Tentukan sama ada setiap elemen dalam tatasusunan kedua terdapat dalam jadual cincang.

b. Jika ya, biarkan elemen itu sahaja.

如果没有的话,找到最接近的匹配项中频率最低的哈希表元素。

d. Tukar elemen sedia ada dalam tatasusunan kedua kepada padanan terdekat.

  • 直到指针达到第二个数组的末尾,重复步骤3再次执行

  • 由于数组的存在,相应索引处的不相等元素数量现在将达到最低水平

  • Persamaan yang diingini dengan tatasusunan pertama terdapat dalam tatasusunan kedua yang diubah suai.

Contoh

#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 

Pendekatan Set Bebas Maksimum (MIS)

我们使用动态规划方法来寻找给定数组之间的最长公共子序列(LCS),小年定数组之间。不相等元素的数量。为了跟踪两个数组中所有可能排列的元素的LCS长度,我们创建了一个二维表。为了减少差异,需要改变的元素可以通过回溯LCS来过回溯LCS来来找徚。元素以匹配LCS,确保数组之间更高的相似度。通过优化数组以共享一个公共子序列,这种动态规划技术有效地降低了不相等元素的数量。

Algoritma

  • Tetapkan panjang dua tatasusunan, yang digelar tatasusunan1 dan tatasusunan2, masing-masing kepada m dan n.

  • Untuk menyimpan panjang LCS bagi semua kemungkinan gabungan elemen daripada kedua-dua tatasusunan, buat DP jadual 2D bersaiz (m+1) x (n+1).

  • 使用两个已解决的循环来强调1和2号群集中的每个组件:

    • Tetapkan DP[i][j] = DP[i-1]. [j-1] 1 jika komponen pada senarai semasa adalah sama.

    • Sekiranya komponen berbeza-beza, naikkan DP[i][j] kepada nilai yang boleh difikirkan paling penting antara DP[i-1][j] dan DP[i][j-1].

  • Ikuti LCS ke belakang dari DP[m][n] ke DP[0][0]:

    • 如果array1[i-1]和array2[j-1]的元素被提升了,将array1[i-1]的角落移动到DP[i-1][j-1]并将1]合并到最长公共子序列中

    • 根据DP中哪个尊重度更高,移动到已清空的DP[i][j-1]或者向上移动到DP[i-1][j](如伏果
  • Elemen di luar LCS dalam kedua-dua tatasusunan mesti ditukar supaya sepadan dengan LCS selepas menjejak kembali LCS untuk mengurangkan bilangan elemen yang tidak sama rata.

  • Persamaan tatasusunan yang dilaraskan akan meningkat, dan bilangan komponen yang tidak sama apabila membandingkan senarai akan berkurangan.

Example

#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 

Conclusion

有两种技术可用于减少两个给定数组之间对应索引处不相等元素的数量:哈希方法和排序方法。哈希方法为一个数组构建哈希表,并迭代地用哈希表中找到的最接近的匹配替换另一个数组中的元素。对于平均和最佳情况,这将实现O(N)的线性时间复杂度。另一方面,排序方法在迭代两个数组时按升序对它们进行排序,并将元素调整为较小的值。尽管它可能不总是产生最佳结果,但它使数组更具可比性。这两种方法都成功地减少了不一致元素的数量,增加了数组的相似性,并降低了对应位置的不一致元素的总数。

Atas ialah kandungan terperinci Minimumkan bilangan elemen yang tidak sama pada indeks yang sepadan antara tatasusunan yang diberikan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam