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

ผลรวมสูงสุดที่เพิ่มขึ้นตามลำดับโดยใช้ไบนารีทรีดัชนีในโปรแกรม C ++


ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ของจำนวนเต็ม n ตัว งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมที่เพิ่มขึ้นตามลำดับโดยใช้ทรีดัชนีไบนารีใน C ++

คำอธิบายปัญหา − เราจำเป็นต้องค้นหาลำดับที่เพิ่มมากขึ้นด้วยผลรวมสูงสุดโดยใช้องค์ประกอบของอาร์เรย์

กำลังเพิ่มขึ้น − ลำดับรองซึ่งค่าขององค์ประกอบปัจจุบันมากกว่าองค์ประกอบในตำแหน่งก่อนหน้า

ต้นไม้ดัชนีไบนารี − เป็นโครงสร้างข้อมูลที่เป็นต้นไม้ชนิดหนึ่ง เราสามารถเพิ่มหรือลบองค์ประกอบออกจากต้นไม้ได้อย่างมีประสิทธิภาพ

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

อินพุต

arr[] = {5, 1, 7, 3, 8, 2}

ผลลัพธ์

20

คำอธิบาย

Subsequences:
{5, 7, 8} = 5 + 7 + 8 = 20
{1, 3, 8} = 1 + 3 + 8 = 12
{1, 7, 8} = 1 + 7 + 8 = 16

แนวทางการแก้ปัญหา

ในปัญหานี้ เราจำเป็นต้องค้นหา maxSum ที่เป็นไปได้โดยใช้ต้นไม้ไบนารีดัชนี สำหรับสิ่งนี้ เราจะสร้างแผนผังดัชนีไบนารีโดยใช้แผนที่จากองค์ประกอบของอาร์เรย์ จากนั้นใช้องค์ประกอบของอาร์เรย์โดยวนซ้ำองค์ประกอบ foreach เราต้องหาผลรวมขององค์ประกอบทั้งหมดจนถึงค่าใน BIT แล้วคืนค่าผลรวมสูงสุดของค่าทั้งหมด

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <bits/stdc++.h>
using namespace std;
int calcMaxSum(int BITree[], int index){
   int sum = 0;
   while (index > 0) {
      sum = max(sum, BITree[index]);
      index −= index & (−index);
   }
   return sum;
}
void updateTreeVal(int BITree[], int newIndex, int index, int sumVal){
   while (index <= newIndex) {
      BITree[index] = max(sumVal, BITree[index]);
      index += index & (−index);
   }
}
int calcMaxSumBIT(int arr[], int n){
   int uniqCount = 0, maxSum;
   map<int, int> BinaryIndexTree;
   for (int i = 0; i < n; i++) {
      BinaryIndexTree[arr[i]] = 0;
   }
   for (map<int, int>::iterator it = BinaryIndexTree.begin();
   it != BinaryIndexTree.end(); it++) {
      uniqCount++;
      BinaryIndexTree[it−>first] = uniqCount;
   }
   int* BITree = new int[uniqCount + 1];
   for (int i = 0; i <= uniqCount; i++) {
      BITree[i] = 0;
   }
   for (int i = 0; i < n; i++) {
      maxSum = calcMaxSum(BITree, BinaryIndexTree[arr[i]] − 1);
      updateTreeVal(BITree, uniqCount, BinaryIndexTree[arr[i]],
      maxSum + arr[i]);
   }
   return calcMaxSum(BITree, uniqCount);
}
int main(){
   int arr[] = {5, 1, 7, 3, 8, 2};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The maximum sum increasing subsequence using binary
   indexed tree is "<<calcMaxSumBIT(arr, n);
   return 0;
}

ผลลัพธ์

The maximum sum increasing subsequence using binary indexed tree is 20