ในบทความนี้ เราจะให้อาร์เรย์ขนาด n ซึ่งจะเป็นจำนวนเต็ม จากนั้น เราจะคำนวณผลรวมขององค์ประกอบจากดัชนี L ถึงดัชนี R และดำเนินการค้นหาหลายครั้ง หรือเราต้องคำนวณผลรวมของช่วงที่กำหนดจาก [L, R] ตัวอย่างเช่น −
Input : arr[] = {1, 2, 3, 4, 5}
L = 1, R = 3
L = 2, R = 4
Output : 9
12
Input : arr[] = {1, 2, 3, 4, 5}
L = 0, R = 4
L = 1, R = 2
Output : 15
5 แนวทางในการหาทางออก
มีสองวิธีแก้ไขปัญหานี้ วิธีแรกคือโดยวิธี Brute Force และวิธี Prefix sum (ประสิทธิภาพ)
แนวทางกำลังเดรัจฉาน
ในแนวทางนี้ เราจะข้ามผ่านช่วงที่กำหนดและพิมพ์ผลรวม
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr)/sizeof(int); // size of given array.
int L1 = 1, R1 = 3;
int L2 = 2, R2 = 4;
int sum = 0;
for(int i = L1; i <= R1; i++) // traversing through the first range.
sum += arr[i];
cout << sum << "\n";
sum = 0;
for(int i = L2; i <= R2; i++) // traversing through the second range.
sum += arr[i];
cout << sum << "\n";
} ผลลัพธ์
9 12
คำอธิบายของโค้ดด้านบน
ในแนวทางนี้ เราเพียงแค่ข้ามผ่านช่วงที่กำหนด ในกรณีนี้ โปรแกรมนี้ดีเพราะมีเวลาในการค้นหาที่ซับซ้อน O(N) โดยที่ N คือขนาดของอาร์เรย์ที่กำหนด อย่างไรก็ตาม สิ่งนี้จะเปลี่ยนแปลงเมื่อเราได้รับคำถามหลายรายการ Q จากนั้นความซับซ้อนของเราจะเปลี่ยนเป็น O(N*Q) โดยที่ Q คือจำนวนการสืบค้นและ N คือขนาดของอาร์เรย์ที่กำหนด ขออภัย ความซับซ้อนในครั้งนี้ไม่สามารถจัดการกับข้อจำกัดที่สูงขึ้นได้ ดังนั้นตอนนี้เราจะพิจารณาแนวทางที่มีประสิทธิภาพซึ่งจะใช้ได้ผลสำหรับข้อจำกัดที่สูงขึ้น
แนวทางที่มีประสิทธิภาพ
ในแนวทางนี้ เราจะสร้างอาร์เรย์ใหม่ที่ชื่อว่า prefix ซึ่งจะเป็นคำนำหน้า sum array จากนั้นเราจะตอบผลรวมของช่วงที่กำหนด
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr)/sizeof(int); // size of given array.
int L1 = 1, R1 = 3;
int L2 = 2, R2 = 4;
int sum = 0;
int prefix[n];
for(int i = 0; i < n; i++){
sum += arr[i];
prefix[i] = sum;
}
if(L1) // to avoid segmentation fault
cout << prefix[R1] - prefix[L1 - 1] << "\n";
else
cout << prefix[R1] << "\n";
if(L2) // avoiding segmentation fault.
cout << prefix[R2] - prefix[L2 - 1] << "\n";
else
cout << prefix[R2] << "\n";
} ผลลัพธ์
9 12
คำอธิบายของโค้ดด้านบน
ในแนวทางนี้ เราเก็บค่ารวมของคำนำหน้าไว้ในอาร์เรย์ที่เรียกว่าคำนำหน้า ตอนนี้อาร์เรย์นี้ทำให้โปรแกรมของเรามีประสิทธิภาพมาก เนื่องจากทำให้เราค้นหาความซับซ้อนของเวลาของ O(1) ซึ่งเป็นความซับซ้อนที่ดีที่สุดที่คุณจะได้รับ และด้วยเหตุนี้เมื่อเราได้รับจำนวนการสืบค้น Q ความซับซ้อนของเวลาในการค้นหาจะกลายเป็น O( Q) โดยที่ Q คือจำนวนการสืบค้น
บทสรุป
ในบทความนี้ เราแก้ปัญหาเพื่อค้นหาคิวรีผลรวมของช่วงโดยไม่มีการอัปเดตโดยใช้อาร์เรย์ผลรวมคำนำหน้า นอกจากนี้เรายังได้เรียนรู้โปรแกรม C ++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ ( Normal และ มีประสิทธิภาพ ) โดยที่เราแก้ไขปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ หวังว่าบทความนี้จะเป็นประโยชน์