# The sum of all elements between k1'th and k2'th smallest elements

Introduction

Efficiently calculating the sum of items between the k1'th and k2'th smallest

elements in an array is a key challenge in several fields, including data analysis,

algorithm design, and statistics. In this, we'll look at three different approaches

to tackling this challenge. We will look at the traditional sorting methodology, a

selection algorithm-based method, and a segment tree-based solution. Each

technique has distinct trade-offs in terms of time, space, and implementation

complexity.

For example, consider the array below:

arr = [7, 10, 4, 3, 20, 15]

We want to calculate the sum of all entries in this array that are between the second

and fifth smallest.

Solution:

1. Sorting the array in non-decreasing order yields:

arr = [3, 4, 7, 10, 15, 20]

2. Retrieve the k1th and k2th smallest elements:

Given that k1 = 2 and k2 = 5, the second smallest element (k1'th) is 4, and the fifth

smallest element (k2'th) is 15.

3. Calculate the sum of components between the k1 and k2 smallest items:

• Now, we traverse the sorted array and add up all entries that fall between 4 and 15.
• Elements that fall between 4 and 15 are 4, 7, 10, 15.
• Therefore, the total of these components is 4 + 7 + 10 + 15 = 36.

So, in this case, the sum of all items between the second and fifth smallest entries in

the array [7, 10, 4, 3, 20, 15] is 36.

Method 1: Sorting-Based Approach

The sorting-based method is a simple way to calculate the sum of items between an

array's k1th and k2th smallest members. Let's look at each stage of this strategy and

see how it works:

1. Sort the Array:

The first step is to sort the array in non-decreasing order. It can be accomplished

with efficient sorting algorithms like quick sort or merges ort. Sorting the array makes

it easy to identify the k1'th and k2'th smallest items, which will be positioned at

indices k1-1 and k2-1 after sorting.

2. Get the k1 and k2 smallest elements:

After sorting the array, we may access the k1'th and k2'th smallest items from their

corresponding places. These items reflect the lower and upper limits of the range for

which we must compute the total.

3. Calculate the Sum:

To calculate the sum, identify the k1'th and k2'th smallest items in the sorted array.

Then, sum all elements between these limits, inclusive. It entails iterating through

the sorted array and adding elements between [k1-1, k2-1].

Pseudocode

Time Complexity:

• It takes O(n log n) time to sort the array using efficient sorting methods.
• It takes a constant amount of time to retrieve the k1 and k2 smallest items.
• Traversing the array and adding its elements takes O(n) time.
• This method has an overall time complexity of O(n log n), with the sorting step takingup the majority of the time.

Implementation

Output:

Explanation:

• We begin by sorting the array using arrays.Sort (arr) in non-decreasing order. It sorts the array in place and guarantees that the smallest items, k1 and k2, are sortedat indices k1-1 and k2-1, respectively.
• After sorting, we extract the k1'th and k2'th smallest entries from the array.
• Then, we iterate through the sorted array and calculate the sum of items fallingbetween the k1'th and k2'th smallest elements by verifying if each element comesinside the range [k1-1, k2-1].
• Finally, we return the calculated total.

Method 2: Selection Algorithm-Based Approach

The selection algorithm-based technique is an effective way to locate the k1 and k2

smallest items in an array without fully sorting it. Let's break down the phases of this

technique to see how it works.

1. Implement a selection algorithm.

• The selection procedure, such as Quickselect, is used to discover the array's k1 and k2 smallest items efficiently.
• Quickselect is a randomized method that uses Quicksort's division mechanism. Itpicks a pivot element and divides the array into two subarrays, with elements fewerthan the pivot on the left and elements greater than the pivot on the right.
• Recursively finding the suitable partition based on the indices of the k1'th and k2'thsmallest components, Quickselect efficiently narrows down the search space until itfinds the desired elements.

2. Traverse the array to calculate the sum:

• After determining the k1'th and k2'th smallest items with Quickselect, we traversethe array once to compute the sum of elements between them.
• During the traversal, we sum up all components that fall inside the range provided bythe smallest elements at k1 and k2.

3. Complexity analysis

This method is faster than the sorting-based strategy, particularly for bigger datasets,

because Quickselect has an anticipated temporal complexity of O(n). However, the

recursive nature of the selection method necessitates a more complex

implementation than the sorting-based technique.

Pseudocode

Implementation

Output:

Explanation

• The quickSelect method is a modified version of the Quickselect algorithm thatreturns the kth smallest element in an array.
• The partition method is a Quickselect utility function that partitions an array based on a pivot element.
• To locate the smallest items in the array, we utilize quickSelect on the k1 and k2positions.
• After finding the smallest items, we traverse the array once and calculate the total ofthe elements in between them.
• Finally, we return the calculated sum as the result.

Method 3: Segment Tree-Based Approach

The segment tree-based approach is an effective method for effectively resolving

range queries on an array. In this approach, we preprocess the array to create a

segment tree, which is a binary tree with each node containing information on a

specified range of elements from the original array. Each node in the segment tree

represents a range of indices and keeps aggregated information about the items in

that range, such as the sum, minimum, and maximum.

Here's how to use the segment tree-based technique to compute the sum of items

between the k1'th and k2'th smallest elements in an array:

1. Build a Segment Tree:

• We begin by creating a segment tree for the specified array. The segment tree is builtiteratively by splitting the array into smaller segments until each segment contains asingle entry. At each node of the segment tree, we store the sum of items inside therelevant index range.

2. Query the segment tree:

• Once the segment tree is built, we can easily query it to discover the sum of itemsbetween the k1 and k2 smallest elements.
• We traverse the segment tree from the root to the nodes that correspond to theranges containing the k1'th and k2'th smallest items.
• By aggregating the information contained in these nodes, we can determine the totalof components falling within the stated indices.

3. Complexity analysis

The segment tree-based technique provides efficient range query capabilities with a

time complexity of O(log n) per query after initial preprocessing. Although creating

the segment tree requires O(n log n) time, subsequent searches may be executed

quickly, making this approach acceptable for cases requiring repeated range queries.

Pseudocode

Implementation

Output:

Explanation

1. Building the Segment Tree:

During the startup phase, we create a segment tree from the provided array. The segment tree is created recursively. At each node of the tree, we record the sum of elements inside the appropriate indices.

2. Querying the segment tree:

• To get the sum of items between the k1th and k2th smallest elements, we use arange query on the segment tree.
• We traverse the segment tree, recursively querying the appropriate segments untilwe reach the necessary indices.

3. Example usage:

• In the main function, we build an instance of the SegmentTree class using the arrayprovided.
• We indicate the range of the smallest components, k1 and k2, for which we wish tocalculate the total.
• Finally, we call the query method to find the sum between the specified k1'th andk2'th smallest elements and print the result.