ในบทความนี้ เราได้รับปัญหา เราได้รับอาร์เรย์ และมีคำถามสองประเภทที่เราต้องตอบ
- พิมพ์ 0 − เราต้องคำนวณจำนวนองค์ประกอบที่มากกว่าหรือเท่ากับ x(ค่าที่กำหนด)
- ประเภทที่ 1 − เราต้องคำนวณจำนวนขององค์ประกอบที่มากกว่า x(ค่าที่กำหนด) อย่างเคร่งครัด
นี่เป็นตัวอย่างง่ายๆ −
Input :arr[] ={ 10, 15, 30 , 40, 45 } and Q =3 Query 1:0 50 Query 2:1 40 Query 3:0 30Output :0 1 3 คำอธิบาย:x =50, q =0 :ไม่มีองค์ประกอบใดที่มากกว่าหรือเท่ากับ 50.x =40, q =1 :45 มากกว่า 40.x =30, q =0 :สามองค์ประกอบ 30, 40, 45 มากกว่าหรือเท่ากับ 30ก่อน>แนวทางในการหาทางออก
เราสามารถใช้สองวิธีในการค้นหาวิธีแก้ปัญหา ขั้นแรกเราจะใช้วิธีแก้ปัญหาแบบเดรัจฉานแล้วตรวจสอบว่าสามารถทำงานได้สำหรับข้อจำกัดที่สูงขึ้นหรือไม่ หากไม่เป็นเช่นนั้น เราจะดำเนินการเพิ่มประสิทธิภาพโซลูชันของเรา
แนวทางกำลังเดรัจฉาน
ในแนวทางนี้ เราจะสำรวจผ่านอาร์เรย์สำหรับข้อความค้นหา q ทั้งหมด และค้นหาตัวเลขที่ตรงตามเงื่อนไขที่กำหนด
ตัวอย่าง
#includeใช้เนมสเปซ std; คิวรีเป็นโมฆะ (int * arr, int n, ประเภท int, int val) { จำนวน int =0; // ตอบ if (!type) { // เมื่อถามถึง type 0 เคียวรี (int i =0; i =val) count++; } } อื่น { // เมื่อถามประเภทที่ 1 (int i =0; i val) count++; } } cout <<จำนวน <<"\n";}int main() { int ARR[] ={ 10, 15, 30, 40, 45 }; int n =sizeof(ARR)/sizeof(ARR[0]); // ขนาดของแบบสอบถามอาร์เรย์ของเรา (ARR, n, 0, 50); // แบบสอบถาม 1 ข้อความค้นหา (ARR, n, 1, 40); // แบบสอบถาม 2 แบบสอบถาม (ARR, n, 0, 30); // แบบสอบถาม 3 คืนค่า 0;} ผลลัพธ์
013ในแนวทางข้างต้น เราเพียงแค่สำรวจผ่านอาร์เรย์และคำนวณคำตอบสำหรับข้อความค้นหา วิธีนี้ใช้ได้กับตัวอย่างที่กำหนด แต่ถ้าเราพบข้อจำกัดที่สูงกว่า วิธีนี้จะล้มเหลวเนื่องจากความซับซ้อนของเวลาโดยรวมของโปรแกรมคือ O(N*Q) โดยที่ N คือขนาดของอาร์เรย์ของเรา และ Q คือจำนวนการสืบค้น ดังนั้นตอนนี้เราจะปรับแนวทางนี้ให้เหมาะสมเพื่อให้ใช้ได้กับข้อจำกัดที่สูงขึ้นเช่นกัน
แนวทางที่มีประสิทธิภาพ
ในแนวทางนี้ เราจะใช้การค้นหาแบบไบนารีเพื่อค้นหาขอบเขตบนและขอบเขตล่างของค่าที่กำหนด ก่อนอื่นเราจัดเรียงอาร์เรย์โดยใช้การค้นหาแบบไบนารี จากนั้นจึงใช้ฟังก์ชันขอบเขตล่างและขอบเขตบนตามลำดับ
ตัวอย่าง
#includeใช้เนมสเปซ std;void ขอบเขตล่าง (int *arr, int n, int val) { int l =-1, r =n; ในขณะที่ (r - l> 1) { // ไบนารีค้นหาคำตอบ int mid =(l+r)/2; if(arr[กลาง]>=val) r =กลาง; อื่น ล. =กลาง; } if(r ==n) // ถ้า r ไม่ถูกขยับ แสดงว่าไม่มีองค์ประกอบที่ตรงตามเงื่อนไข cout <<"0\n"; อื่น cout < 1) { // ไบนารีค้นหาคำตอบ int mid =(l+r)/2; if(arr[กลาง]> val) r =กลาง; อื่น ล. =กลาง; } if(r ==n)// ถ้า r ไม่ถูกขยับ แสดงว่าไม่มีองค์ประกอบใดที่เป็นไปตามเงื่อนไข cout <<"0\n"; อื่น cout < ผลลัพธ์
012รหัสด้านบนทำงานบนการค้นหาแบบไบนารีที่ลดความซับซ้อนของเวลาของเราอย่างมาก ดังนั้นความซับซ้อนขั้นสุดท้ายของเราจึงกลายเป็น O(NlogN) โดยที่ N คือขนาดของอาร์เรย์ของเรา
คำอธิบายของโค้ดด้านบน
ในแนวทางนี้ เราจะใช้การค้นหาแบบไบนารีเพื่อค้นหาขอบเขตบนและขอบเขตล่างของค่าที่กำหนด สำหรับการค้นหาแบบไบนารี ขั้นแรกให้จัดเรียงอาร์เรย์ของเรา เนื่องจากใช้งานได้เฉพาะกับอาร์เรย์ที่จัดเรียงแล้ว เราสร้างฟังก์ชันขอบล่างและขอบบนที่ช่วยให้เราค้นหาตัวเลขแรกที่ตรงตามเงื่อนไขประเภท 0 ประเภทที่ 1 ตามลำดับ ขณะที่เราจัดเรียงอาร์เรย์แล้ว เราพบตัวเลขตัวแรกที่ช่วยเงื่อนไข ดังนั้นองค์ประกอบหลังจากองค์ประกอบนี้ก็จะเป็นไปตามเงื่อนไขด้วย ดังนั้นเราจึงพิมพ์ความแตกต่างของดัชนีขององค์ประกอบนี้ด้วย N(ขนาดของอาร์เรย์ของเรา)
บทสรุป
ในบทความนี้ เราจะแก้ปัญหาเพื่อแก้ปัญหา Queries ให้มากกว่าหรือน้อยกว่าการใช้ Binary search นอกจากนี้เรายังได้เรียนรู้โปรแกรม C ++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ ( Normal และ มีประสิทธิภาพ ) โดยที่เราแก้ไขปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์