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

หาค่า Floor ในอาร์เรย์ที่จัดเรียงแล้วด้วย C++


ในปัญหานี้ เราได้รับอาร์เรย์ที่จัดเรียงแล้ว arr[] และค่าจำนวนเต็ม x ภารกิจของเราคือการสร้างโปรแกรมหา floor ในอาร์เรย์ที่จัดเรียงแล้ว

Floor ของ X ในอาร์เรย์ที่จัดเรียงแล้ว arr คือองค์ประกอบที่ใหญ่ที่สุดของอาร์เรย์ arr[] ซึ่งน้อยกว่าหรือเท่ากับ x

มาดูตัวอย่างเพื่อเข้าใจปัญหา

Input: arr[] = {2, 5, 6, 8, 9, 12, 21, 25}, x = 10 Output: 9

คำอธิบาย - ในอาร์เรย์ด้านบน 9 คือตัวเลขที่ใหญ่ที่สุดซึ่งน้อยกว่าหรือเท่ากับ 10

วิธีการแก้ปัญหา

วิธีแก้ปัญหาแบบง่ายคือการเดินทางผ่านอาร์เรย์โดยตรงและหาองค์ประกอบที่ตรงตามเงื่อนไข ขณะเดินทางผ่านอาร์เรย์

เราจะตรวจสอบแต่ละองค์ประกอบ หากมันมากกว่า x ให้คืนค่าองค์ประกอบก่อนหน้าเป็น floor ของ x

ตัวอย่าง

โปรแกรมสาธิตการทำงานของวิธีแก้ปัญหาของเรา

#include <iostream> using namespace std; int findFloorSortedArray(int arr[], int n, int x){    if (x >= arr[n - 1])       return (n-1);    if (x < arr[0])       return -1;    for (int i = 1; i < n; i++)       if (arr[i] > x)          return (i - 1);    return -1; } int main(){    int arr[] = {2, 5, 6, 8, 9, 12, 21, 25};    int n = sizeof(arr) / sizeof(arr[0]);    int x = 10;    int floorIndex = findFloorSortedArray(arr, n - 1, x);    if (floorIndex == -1)       cout<<"The floor of "<<x<<" doesn't exist in the array";    else       cout<<"The floor of "<<x<<" in the array is "<<arr[floorIndex];    return 0; }

เอาต์พุต

The floor of 10 in the array is 9

วิธีการสลับ

วิธีสลับในการแก้ปัญหาคือการใช้ binary searching algorithm เนื่องจากอาร์เรย์จัดเรียงแล้วและภารกิจของเราเกี่ยวกับการหาค่า ในวิธีนี้ เราจะค้นหาองค์ประกอบที่ดัชนีกลางของอาร์เรย์ จากนั้นตามองค์ประกอบกลาง เราจะค้นหาตัวเลขในครึ่งแรก (ครึ่งที่น้อยกว่า) หรือครึ่งหลัง (ครึ่งที่มากกว่า) ของอาร์เรย์ และดำเนินต่อไปจนกว่าจะเดินทางผ่านอาร์เรย์ทั้งหมดหรือพบองค์ประกอบที่ตรงกลางของ sub-array

ตัวอย่าง

โปรแกรมสาธิตการทำงานของวิธีแก้ปัญหาของเรา

#include <iostream> using namespace std; int findFloorSortedArray(int arr[], int start, int end, int x){    if (start > end)       return -1;    if (x >= arr[end])       return end;    int mid = (start + end) / 2;    if (arr[mid] == x)       return mid;    if (mid > 0 && arr[mid - 1] <= x && x < arr[mid])       return mid - 1;    if (x < arr[mid])       return findFloorSortedArray(arr, start, mid - 1, x);    return findFloorSortedArray(arr, mid + 1, end, x); } int main(){    int arr[] = {2, 5, 6, 8, 9, 12, 21, 25};    int n = sizeof(arr) / sizeof(arr[0]);    int x = 10;    int floorIndex = findFloorSortedArray(arr, 0, n - 1, x);    if (floorIndex == -1)       cout<<"The floor of "<<x<<" doesn't exist in the array";    else       cout<<"The floor of "<<x<<" in the array is "<<arr[floorIndex];    return 0; }

เอาต์พุต

The floor of 10 in the array is 9