首頁 >後端開發 >C++ >在C++中的合併排序樹

在C++中的合併排序樹

王林
王林轉載
2023-09-12 17:33:031306瀏覽

在C++中的合併排序樹

We are given an integer array, a set of segment start and end pointers and a key value and the problem statement here is to find all the values in the given range which are smal which are smal than are smal or equal to the given key value.

Let us understand with example

Input − arr[] = {7, 8 , 1, 4 , 6 , 8 , 10 }

Segment 1: start = 2, end = 4, k = 2

Segment 2: start = 1, end = 6, k = 3

#Output − Count of number which are smaller than or equal to key value in the given range are 2 6

Explanation − [8, 1, 4] represents the range from from 2 to 4 and 2 is the 2nd smallest number in the range [7, 8 , 1, 4 , 6 , 8 ]代表從1到6的範圍,6是範圍內第三小的數字

輸入 - arr[] = {2 , 7 , 9, 4 , 6 , 5 , 1 |

段落1:起始位置=3,結束位置=6,k=4

段落2:起始位置=2 ,結束位置=5,k=3

輸出 - 在給定範圍內小於或等於關鍵值的數字的數量為:9 7

解釋 - [9, 4 , 6 , 5]代表從3到6的範圍,9是給定範圍內第四小的數字 [7 , 9, 4 , 6 ] 表示從2到4的範圍,7是給定段範圍中第3小的數字

下面程式中使用的方法如下:

  • 宣告一個整數型別的陣列。計算數組的大小。宣告一個向量類型的變量,形成整數類型的對。開始FOR循環,將資料從數組推送到向量中。

  • 對給定的向量進行排序。建立一個整數類型的向量數組,大小為MAX。

  • 呼叫函數generateTree(1, 0, size - 1, vec, tree),並將getSmallestIndex設定為queryWrapper(2, 5, 2, size, vec, tree)。

  • 列印input[getSmallestIndex]。

  • 將getSmallestIndex設定為呼叫函數queryWrapper(1, 6, 4, size, vec, tree)。

  • 在函式generateTree(int treeIndex, int leftIndex, int rightIndex, vector > &a, vector tree[])內部內p

    • 檢查IF leftIndex to rightIndex,然後設定 tree[treeIndex].push_back(a[leftIndex].second) and return

    • Set midValue to (leftIndex rightIndex) / 2and call generateTree(2 * treeIndex, leftIndex, mid, a, tree), generateTree(2 * treeIndex 1, midValue 1, rightIndex, a, tree) and merge(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(), tree[2 * treeIndex 1 ].begin(). Set tree[2 * treeIndex 1].end(),back_inserter(tree[treeIndex]))

  • #Inside the function as int calculateKSmallest(int startIndex, int endIndex, int queryStart, int queryEnd, int treeIndex, int key, vector tree[])

    • Check IF startIndex to endIndex the return tree[

      ]
    • Set mid to (startIndex endIndex) / 2, last_in_query_range to (upper_bound(tree[2 * treeIndex].begin(),tree[2 * treeIndex].end(), queryEnd) - tree[2 * treeIndex].begin())
    • set first_in_query_range to (lower_bound(tree[2 * treeIndex].begin(),tree[2 * treeIndex]. end(), queryStart) - tree[2 * treeIndex].begin()) and M to last_in_query_range - first_in_query_range
    • Check IF M greater than equals to key then return cal
    • Check IF M greater than equals to key then return cal

      KSmall( mid, queryStart,queryEnd, 2 * treeIndex, key, tree)

  • ELSE, then return calculateKSmallest(mid 1, endIndex, queryStart, queryEnd, 2 * treeIndex 1, key - M, tree).
    • Inside the function int queryWrapper(int queryStart, int queryEnd, int key, int n, vector > &a , vectortree[])

  • return call to the function calculateKSmallest(0, n - 1, queryStart - 1, queryEnd - 1, 1, key, tree)

Example

#include <bits/stdc++.h>
using namespace std;
const int MAX = 1000;
void generateTree(int treeIndex, int leftIndex, int rightIndex, vector<pair<int, int> > &a, vector<int> tree[]){
   if (leftIndex == rightIndex){
      tree[treeIndex].push_back(a[leftIndex].second);
      return;
   }
   int midValue = (leftIndex + rightIndex) / 2;
   generateTree(2 * treeIndex, leftIndex, midValue, a, tree);
   generateTree(2 * treeIndex + 1, midValue + 1, rightIndex, a, tree);
   merge(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(), tree[2 * treeIndex + 1].begin(),
   tree[2 * treeIndex + 1].end(), back_inserter(tree[treeIndex]));
}
int calculateKSmallest(int startIndex, int endIndex, int queryStart, int queryEnd, int treeIndex, int key, vector<int> tree[]){
      if (startIndex == endIndex){
         return tree[treeIndex][0];
      }
      int mid = (startIndex + endIndex) / 2;
      int last_in_query_range = (upper_bound(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(), queryEnd) - tree[2 * treeIndex].begin());
      int first_in_query_range = (lower_bound(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(),queryStart) - tree[2 * treeIndex].begin());
      int M = last_in_query_range - first_in_query_range;
      if (M >= key){
         return calculateKSmallest(startIndex, mid, queryStart, queryEnd, 2 * treeIndex, key, tree);
      }
      else {
         return calculateKSmallest(mid + 1, endIndex, queryStart,queryEnd, 2 * treeIndex + 1, key - M, tree);
      }
}
int queryWrapper(int queryStart, int queryEnd, int key, int n,
   vector<pair<int, int> > &a, vector<int> tree[]){
      return calculateKSmallest(0, n - 1, queryStart - 1, queryEnd - 1, 1, key, tree);
}
int main(){
   int input[] = { 7, 8 , 1, 4 , 6 , 8 , 10 };
   int size = sizeof(input)/sizeof(input[0]);
   vector<pair<int, int> > vec;
   for (int i = 0; i < size; i++) {
      vec.push_back(make_pair(input[i], i));
   }
   sort(vec.begin(), vec.end());
   vector<int> tree[MAX];
   generateTree(1, 0, size - 1, vec, tree);

   cout<<"Count of number which are smaller than or equal to key value in the given range are:"<<endl;

   int getSmallestIndex = queryWrapper(2, 4, 2, size, vec, tree);
   cout << input[getSmallestIndex] << endl;
   getSmallestIndex = queryWrapper(1, 6, 3, size, vec, tree);
   cout << input[getSmallestIndex] << endl;
   return 0;
}
輸出#######如果我們執行上述程式碼,將會產生下列輸出###
Count of number which are smaller than or equal to key value in the given range are:
4
6
###

以上是在C++中的合併排序樹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除