สมมติว่าเรามีอาร์เรย์ที่แสดงถึงองค์ประกอบของความก้าวหน้าทางเรขาคณิตตามลำดับ ขาดองค์ประกอบหนึ่ง เราต้องหาองค์ประกอบที่ขาดหายไป ดังนั้นหาก arr =[1, 3, 27, 81] เอาต์พุตคือ 9 เนื่องจากไม่มี 9
โดยใช้การค้นหาแบบไบนารี เราสามารถแก้ปัญหานี้ได้ เราจะไปที่องค์ประกอบตรงกลางแล้วตรวจสอบว่าอัตราส่วนระหว่างตรงกลางกับตรงกลางเท่ากับอัตราส่วนทั่วไปหรือไม่ หากไม่มี องค์ประกอบที่ขาดหายไปจะแสดงอยู่ระหว่างดัชนีกลางและกลาง + 1 หากองค์ประกอบตรงกลางเป็นองค์ประกอบที่ n/2 ใน GP องค์ประกอบที่ขาดหายไปจะอยู่ที่ครึ่งขวา มิฉะนั้นจะอยู่ที่ครึ่งซ้าย
ตัวอย่าง
#include <iostream>
#include <cmath>
using namespace std;
class Progression {
public:
int missingUtil(int arr[], int left, int right, int ratio) {
if (right <= left)
return INT_MAX;
int mid = left + (right - left) / 2;
if (arr[mid + 1] - arr[mid] != ratio)
return (arr[mid] * ratio);
if (mid > 0 && arr[mid] / arr[mid - 1] != ratio)
return (arr[mid - 1] * ratio);
if (arr[mid] == arr[0] * pow(ratio, mid))
return missingUtil(arr, mid + 1, right, ratio);
return missingUtil(arr, left, mid - 1, ratio);
}
int missingElement(int arr[], int n) {
int ratio = pow(arr[n-1]/arr[0], 1.0/n);
return missingUtil(arr, 0, n - 1, ratio);
}
};
int main() {
Progression pg;
int arr[] = {1, 3, 27, 81};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "The missing element is: " << pg.missingElement(arr, n);
} ผลลัพธ์
The missing element is: 9