สมมติว่าเราได้รับอาร์เรย์ 'arr' ที่มีค่าจำนวนเต็มเรียงลำดับจำนวน n ค่า นอกจากนี้เรายังได้รับ 'แบบสอบถาม' อาร์เรย์ขนาด q และเราต้องบอกว่าค่าใน 'แบบสอบถาม' มีอยู่ในอาร์เรย์ที่กำหนด 'arr' หรือไม่ หากค่าในแบบสอบถามมีอยู่ใน arr เราจะพิมพ์ "Present" พร้อมกับตำแหน่งที่ค่านั้นตั้งอยู่ มิฉะนั้น เราจะพิมพ์ "Not present" และพิมพ์ตำแหน่งใน arr โดยที่ค่าต่ำสุดที่มากกว่าค่าใน แบบสอบถามตั้งอยู่ เราต้องจำไว้ว่าอาร์เรย์มี 1 ดัชนี
ดังนั้น หากอินพุตเป็น n =8, arr ={1, 2, 3, 4, 7, 9, 12, 15} , q =3, query ={1, 5, 8} ผลลัพธ์จะเป็น
Present 1 Not present 5 Not present 6
ค่าแรกของข้อความค้นหาอยู่ในตำแหน่งที่ 1 ใน arr.
ค่าที่สองของข้อความค้นหาไม่มีอยู่ใน arr ตำแหน่งที่ค่าต่ำสุดมากกว่าค่าในแบบสอบถามคือ 5.
ในทำนองเดียวกัน ค่าที่สามของข้อความค้นหาไม่มีอยู่ใน arr ค่าที่มากกว่าอยู่ในตำแหน่งที่ 6 ของ arr.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดค่าอาร์เรย์
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- ใส่ arr[i] ต่อท้ายค่า
idx :=(ตำแหน่งขององค์ประกอบแรกในค่าที่ไม่น้อยกว่าการสืบค้น[i]) - ตำแหน่งองค์ประกอบแรกในค่า ถ้า values[idx] เหมือนกับ query[i] ดังนั้น −
- print("Present ")
มิฉะนั้น
- print("ไม่ปรากฏ ")
พิมพ์(idx + 1)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <vector> #include <iostream> using namespace std; void solve(int n, int arr[], int q, int query[]) { vector<int> values; for(int i = 0; i < n; i++){ values.push_back(arr[i]); } for(int i = 0; i < q; i++) { int idx = lower_bound (values.begin(), values.end(), query[i]) - values.begin(); if (values[idx] == query[i]) cout << "Present "; else cout << "Not present "; cout << idx + 1 << endl; } } int main() { int input_arr[] = {1, 2, 3, 4, 7, 9, 12, 15}; int query_arr[] = {1, 5, 8}; solve(8, input_arr, 3, query_arr); return 0; }
อินพุต (stdin)
int input_arr[] = {1, 2, 3, 4, 7, 9, 12, 15}; int query_arr[] = {1, 5, 8}; solve(8, input_arr, 3, query_arr);
ผลลัพธ์
Present 1 Not present 5 Not present 6