Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหา k ตัวเลขที่ใกล้เคียงที่สุดในอาเรย์ที่ไม่เรียงลำดับใน C++


พิจารณาว่าเรามีอาร์เรย์ A ที่มีองค์ประกอบน้อย อาร์เรย์ไม่ได้รับการจัดเรียง เรามีค่าอื่นสองค่า X และ k งานของเราคือการหาจำนวน k ขององค์ประกอบที่ใกล้ที่สุดของ X จากอาร์เรย์ A หากองค์ประกอบ X มีอยู่ในอาร์เรย์ ก็จะไม่แสดงในผลลัพธ์ ถ้า A =[48, 50, 55, 30, 39, 35, 42, 45, 12, 16, 53, 22, 56] และ X =35, k =4 ผลลัพธ์จะเป็น 30, 39, 42, 45 .

เพื่อแก้ปัญหานี้ เราจะใช้โครงสร้างข้อมูลฮีป ขั้นตอนจะมีลักษณะดังนี้ -

  • สร้างความแตกต่างสูงสุดหนึ่งกองด้วยองค์ประกอบ k ตัวแรก

  • สำหรับทุกองค์ประกอบที่เริ่มจากองค์ประกอบที่ k+1 ให้ทำซ้ำขั้นตอนเหล่านี้

    • ค้นหาความแตกต่างระหว่างองค์ประกอบปัจจุบันจาก x

    • หากความแตกต่างมากกว่ารูทของฮีป ให้ข้ามองค์ประกอบปัจจุบัน

    • มิฉะนั้นให้แทรกองค์ประกอบปัจจุบันลงในฮีปหลังจากลบรูทแล้ว

  • ในที่สุดฮีปจะมีองค์ประกอบที่ใกล้เคียงที่สุด k

ตัวอย่าง

#include <iostream>
#include<queue>
using namespace std;
void findKClosestNumbers(int arr[], int n, int x, int k) {
   priority_queue<pair<int, int> > priorityQ;
   for (int i = 0; i < k; i++)
      priorityQ.push({ abs(arr[i] - x), i });
   for (int i = k; i < n; i++) {
      int diff = abs(arr[i] - x);
      if (diff > priorityQ.top().first)
         continue;
      priorityQ.pop();
      priorityQ.push({ diff, i });
   }
   while (priorityQ.empty() == false) {
      cout << arr[priorityQ.top().second] << " ";
      priorityQ.pop();
   }
}
int main() {
   int arr[] = {48, 50, 55, 30, 39, 35, 42, 45, 12, 16, 53, 22, 56};
   int x = 35, k = 5;
   int n = sizeof(arr) / sizeof(arr[0]);
   findKClosestNumbers(arr, n, x, k);
}

ผลลัพธ์

45 42 30 39 35