Home  >  Article  >  Backend Development  >  Find the index of the closest non-overlapping interval to the right of each given N interval

Find the index of the closest non-overlapping interval to the right of each given N interval

WBOY
WBOYforward
2023-09-08 09:01:021072browse

Find the index of the closest non-overlapping interval to the right of each given N interval

A standard interval representation usually consists of a set of paired starting and ending points. Finding the nearest non-overlapping interval to the right of each specified interval constitutes our current dilemma. This task is of huge importance in many different applications, such as resource allocation and scheduling, since it involves identifying the next interval that does not intersect or contain the current interval.

grammar

To help understand the code demonstration that is about to be shown, let's first look at the syntax that will be used, and then dive into the algorithm.

// Define the Interval structure
struct Interval {
   int start;
   int end;
};

// Function to find the index of closest non-overlapping interval
vector<int> findClosestNonOverlappingInterval(const vector<interval>& intervals) {
   // Implementation goes here
}
</interval></int>

algorithm

Solving this problem requires an organized approach, centered on iterating intervals in reverse order while maintaining an index stack pointing to their nearest non-overlapping partners. Here are the brief but effective steps of how our proposed algorithm solves this problem -

  • Create an empty stack to store the indices of non-overlapping intervals.

  • Initialize an index vector with a size equal to the number of intervals, padded with -1 to indicate that no non-overlapping intervals have been found.

  • Traverse the intervals from right to left.

  • If the stack is non-empty and there is a cross-sectional area between the current interval and the top interval, proceed to eliminate (pop) that top-most index from the stack.

    李>
  • To ensure accurate representation, if the stack is empty, the index position is assigned -1 in the vector representing the current interval. This means that there are no non-overlapping intervals on the right.

  • It is strongly recommended to ensure that the stack we specify has elements before attempting this task; otherwise an error will occur. After confirming that we have one or more elements on said structure, we can do this by having the vector of the current interval set its index value to the same as the corresponding element at the topmost position on the structure we identified and its corresponding index information. Include it in the same structure to perform operations.

  • Repeat steps 3-7 until all intervals have been processed.

  • Return the index vector.

method

To resolve this dilemma, we will look at two different strategies.

Method 1: Brute force cracking

One possible strategy to solve this problem is to use violence. Essentially, this requires examining each individual interval and then comparing it to all intervals to the right of it until no intersection option becomes obvious. However. It is worth noting that utilizing this method results in a time complexity of O(N^2). Where N represents the total number of intervals participating in the inspection process.

grammar

vector<int> findClosestNonOverlappingInterval(const vector<Interval>& intervals) {
   vector<int> result(intervals.size(), -1);
   for (int i = 0; i < intervals.size(); i++) {
      for (int j = i + 1; j < intervals.size(); j++) {
         if (intervals[i].end < intervals[j].start) {
            result[i] = j;
            break;
         }
      }
   }
   return result;
}
The Chinese translation of

Example

is:

Example

#include 
#include 

using namespace std;

// Define the Interval structure
struct Interval {
   int start;
   int end;
};

vector<int> findClosestNonOverlappingInterval(const vector<Interval>& intervals) {
   vector<int> result(intervals.size(), -1);
   for (int i = 0; i < intervals.size(); i++) {
      for (int j = i + 1; j < intervals.size(); j++) {
         if (intervals[i].end < intervals[j].start) {
            result[i] = j;
            break;
         }
      }
   }
   return result;
}

int main() {
   // Define intervals
   vector intervals = {{1, 3}, {2, 4}, {5, 7}, {6, 9}, {8, 10}};

   // Find the index of closest non-overlapping interval for each interval
   vector closestIndices = findClosestNonOverlappingInterval(intervals);

   // Print the results
   for (int i = 0; i < intervals.size(); i++) {
      cout << "Interval [" << intervals[i].start << ", " << intervals[i].end << "] ";
      if (closestIndices[i] != -1) {
         cout << "has closest non-overlapping interval at index " << closestIndices[i] << endl;
      } else {
         cout << "has no non-overlapping interval to the right" << endl;
      }
   }
   return 0;
}

Output

Interval [1, 3] has closest non-overlapping interval at index 2
Interval [2, 4] has closest non-overlapping interval at index 2
Interval [5, 7] has closest non-overlapping interval at index 4
Interval [6, 9] has no non-overlapping interval to the right
Interval [8, 10] has no non-overlapping interval to the right

Method 2: Optimal solution

One very successful approach involves utilizing the stack as a means of monitoring recent non-overlapping intervals. The time complexity of this strategy is O(N) since our task only requires us to peruse the interval once.

grammar

vector<int> findClosestNonOverlappingInterval(const vector<Interval>& intervals) {
   vector<int> result(intervals.size(), -1);
   stack<int> st;
   for (int i = intervals.size() - 1; i >= 0; i--) {
      while (!st.empty() && intervals[i].end >= intervals[st.top()].start) {
         st.pop();
      }
      if (!st.empty()) {
         result[i] = st.top();
      }
      st.push(i);
   }
   return result;
}
The Chinese translation of

Example

is:

Example

#include 
#include 

using namespace std;

// Define the Interval structure
struct Interval {
   int start;
   int end;
};

vector<int> findClosestNonOverlappingInterval(const vector<Interval>& intervals) {
   vector<int> result(intervals.size(), -1);
   for (int i = 0; i < intervals.size(); i++) {
      for (int j = i + 1; j < intervals.size(); j++) {
         if (intervals[i].end < intervals[j].start) {
            result[i] = j;
            break;
         }
      }
   }
   return result;
}

int main() {
   // Define intervals
   vector intervals = {{1, 3}, {2, 4}, {5, 7}, {6, 9}, {8, 10}};
   
   // Find the index of closest non-overlapping interval for each interval
   vector closestIndices = findClosestNonOverlappingInterval(intervals);
   
   // Print the results
   for (int i = 0; i < intervals.size(); i++) {
      cout << "Interval [" << intervals[i].start << ", " << intervals[i].end << "] ";
      if (closestIndices[i] != -1) {
         cout << "has closest non-overlapping interval at index " << closestIndices[i] << endl;
      } else {
         cout << "has no non-overlapping interval to the right" << endl;
      }
   }
   return 0;
}

Output

Interval [1, 3] has closest non-overlapping interval at index 2
Interval [2, 4] has closest non-overlapping interval at index 2
Interval [5, 7] has closest non-overlapping interval at index 4
Interval [6, 9] has no non-overlapping interval to the right
Interval [8, 10] has no non-overlapping interval to the right

in conclusion

Our exploration goal is to find the best position in C of the closest non-overlapping interval index to the right of each given interval. First, we discuss syntactic complexity in depth, while proposing an algorithm and proposing two potential solutions. As part of our investigation, we show how our brute force approach and stack-based optimization approach work with successfully tested executable code. This method allows you to easily identify the closest non-overlapping intervals for any particular set.

The above is the detailed content of Find the index of the closest non-overlapping interval to the right of each given N interval. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:tutorialspoint.com. If there is any infringement, please contact admin@php.cn delete