Advertisement
jamjam7

OverlappingIntervals

Apr 16th, 2015
1,097
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. /*
  2.     The C++ program joins overlapping intervals
  3.     Uses Merge Sort
  4.     Sample invervals: (8, 9);  (3, 4); (2, 5); (1, 2); (6, 7)
  5.     Answer: (1, 5); (6, 7); (8, 9)
  6.     Requirement: start < end, i.e. (6, 5) is not valid interval
  7. */
  8. #include <iostream>
  9. using namespace std;
  10.  
  11. const int n = 5;
  12.  
  13. struct interval {
  14.     int start; 
  15.     int end;   
  16.     bool flag;  
  17. };
  18.  
  19. bool overlap(interval a, interval b);
  20. interval join(interval a, interval b);
  21. void mergesort(interval *a, int low, int high);
  22. void merge(interval *a, int low, int high, int mid);
  23.  
  24. int main() {
  25.  
  26.     unsigned i, j;
  27.  
  28.     interval x[n] =
  29.     {
  30.         {8, 9},
  31.         {3, 4},
  32.         {2, 5},
  33.         {1, 2},
  34.         {6, 7}
  35.     };
  36.  
  37.     for (i=0; i<n; i++) x[i].flag = 1; //Initial values
  38.  
  39.     mergesort(x,0,n-1);
  40.  
  41.     cout << "Sorted intervals:\n";
  42.     for (i=0; i<n; i++) {
  43.         cout << x[i].start << ' ' << x[i].end << '\n';
  44.     }
  45.    
  46.     int k = 0;
  47.     for (i=0; i<n-1; i++) {
  48.         if (x[i].flag) {
  49.             for (j=i+1; j<n; j++) {
  50.                 if (overlap(x[i], x[j])) {
  51.                     x[i] = join(x[i], x[j]);
  52.                     x[j].flag = 0;  // This interval is joined to an overlapping interval              
  53.                 }
  54.             }
  55.         }
  56.  
  57.     }
  58.     cout << "Joined intervals:\n";
  59.     for (i=0; i<n; i++) {
  60.         if (x[i].flag) {
  61.             cout << x[i].start << ' ' << x[i].end << '\n';
  62.         }
  63.     }
  64.    
  65.     return 0;
  66. }
  67.  
  68. bool overlap(interval a, interval b) {
  69.     return ((a.start <= b.end)&&(a.end >= b.start)) ? 1 : 0;
  70. }
  71.  
  72. interval join(interval a, interval b) {
  73.     interval c;
  74.  
  75.     c.start = (a.start < b.start) ? a.start : b.start;
  76.     c.end = (a.end > b.end) ? a.end : b.end;
  77.     c.flag = 1;
  78.  
  79.     return c;
  80. }
  81.  
  82. void mergesort(interval *a, int low, int high) {
  83.     int mid;
  84.     if (low < high)
  85.     {
  86.         mid=(low+high)/2;
  87.         mergesort(a,low,mid);
  88.         mergesort(a,mid+1,high);
  89.         merge(a,low,high,mid);
  90.     }
  91.     return;
  92. }
  93.  
  94. void merge(interval *a, int low, int high, int mid)
  95. {
  96.     int i, j, k;
  97.     interval c[n];
  98.     i = low;
  99.     k = low;
  100.     j = mid + 1;
  101.     while (i <= mid && j <= high)
  102.     {
  103.         if (a[i].start == a[j].start)
  104.         {
  105.             if (a[i].end < a[j].end) {
  106.                 c[k] = a[i];
  107.                 k++;
  108.                 i++;
  109.             } else {
  110.                 c[k] = a[j];
  111.                 k++;
  112.                 j++;                               
  113.             }
  114.         } else if (a[i].start < a[j].start) {
  115.             c[k] = a[i];
  116.             k++;
  117.             i++;
  118.         } else {
  119.             c[k] = a[j];
  120.             k++;
  121.             j++;
  122.         }
  123.        
  124.     }
  125.     while (i <= mid)
  126.     {
  127.         c[k] = a[i];
  128.         k++;
  129.         i++;
  130.     }
  131.     while (j <= high)
  132.     {
  133.         c[k] = a[j];
  134.         k++;
  135.         j++;
  136.     }
  137.     for (i = low; i < k; i++)
  138.     {
  139.         a[i] = c[i];
  140.        
  141.     }
  142.    
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement