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

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

พิจารณาว่าเรามีอาร์เรย์ 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

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

  • สร้าง max-heap ของความต่างกับ k สมาชิกแรก
  • สำหรับทุกสมาชิกตั้งแต่ k+1 เป็นต้นไป ทำซ้ำขั้นตอนเหล่านี้
    • หาความต่างระหว่างสมาชิกปัจจุบันกับ x
    • ถ้าความต่างมากกว่ารากของ heap ให้ข้ามสมาชิกปัจจุบัน
    • มิฉะนั้น แทรกสมาชิกปัจจุบันลง heap หลังจากเอารากออก
  • สุดท้าย heap จะมี 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