สมมติว่ามีอาร์เรย์เรียงลำดับ 3 อาร์เรย์ คือ A, B และ C และสามองค์ประกอบ i, j และ k จาก A, B และ C ตามลำดับ ซึ่งทำให้ max(|A[i] – B[j]|, |B[j] – C[k]|, |C[k] – A[i]|) ถูกминимизация (หาค่าน้อยที่สุด) ดังนั้นถ้า A = [1, 4, 10], B = [2, 15, 20], และ C = [10, 12] องค์ประกอบที่ได้คือ 10, 15, 10 ทั้งสามมาจาก A, B และ C ตามลำดับ
สมมติว่าขนาดของ A, B และ C คือ p, q และ r ตามลำดับ ตอนนี้ทำตามขั้นตอนเหล่านี้เพื่อแก้ปัญหา:
- i := 0, j := 0 และ k := 0
- ทำต่อไปนี้ในขณะที่ i < p และ j < q และ k < r
- หาค่าต่ำสุดและสูงสุดของ A[i], B[j] และ C[k]
- คำนวณ diff := max(X, Y, Z) - min(A[i], B[j], C[k])
- ถ้าผลลัพธ์น้อยกว่าผลลัพธ์ปัจจุบัน ให้เปลี่ยนเป็นผลลัพธ์ใหม่
- เพิ่มตัวชี้ของอาร์เรย์ที่มีค่าต่ำสุด
ตัวอย่าง
#include <iostream>
using namespace std;
void getClosestElements(int A[], int B[], int C[], int p, int q, int r) {
int diff = INT_MAX;
int i_final = 0, j_final = 0, k_final = 0;
int i = 0, j = 0, k = 0;
while (i < p && j < q && k < r) {
int min_element = min(A[i], min(B[j], C[k]));
int max_element = max(A[i], max(B[j], C[k]));
if (max_element - min_element < diff) {
i_final = i, j_final = j, k_final = k;
diff = max_element - min_element;
}
if (diff == 0)
break;
if (A[i] == min_element)
i++;
else if (B[j] == min_element)
j++;
else
k++;
}
cout << A[i_final] << " " << B[j_final] << " " << C[k_final];
}
int main() {
int A[] = {1, 4, 10};
int B[] = {2, 15, 20};
int C[] = {10, 12};
int p = sizeof A / sizeof A[0];
int q = sizeof B / sizeof B[0];
int r = sizeof C / sizeof C[0];
cout << "Closest elements are: ";
getClosestElements(A, B, C, p, q, r);
}
ผลลัพธ์
Closest elements are: 10 15 10