예제 #1
0
            private ITNodeInt ConstructRecursive(List <ITIntervalInt> L)
            {
                if (L.Count <= 0)
                {
                    return(null);
                }
                ITNodeInt n = new ITNodeInt();

                n.mid = Median(L);
                List <ITIntervalInt> left  = new List <ITIntervalInt>();
                List <ITIntervalInt> right = new List <ITIntervalInt>();

                foreach (ITIntervalInt i in L)
                {
                    if (i.max < n.mid)
                    {
                        left.Add(i);
                    }
                    else if (i.min > n.mid)
                    {
                        right.Add(i);
                    }
                    else
                    {
                        n.left.Add(i);
                        n.right.Add(i);
                    }
                }
                n.left.Sort((a, b) => { return(a.min.CompareTo(b.min)); });
                n.right.Sort((a, b) => { return(b.max.CompareTo(a.max)); });
                n.lc = ConstructRecursive(left);
                n.rc = ConstructRecursive(right);
                return(n);
            }
예제 #2
0
 private void FindRecursive(ITNodeInt n, int val, ref List <object> res)
 {
     if (n == null)
     {
         return;
     }
     if (val <= n.mid)
     {
         foreach (ITIntervalInt i in n.left)
         {
             if (i.min > val)
             {
                 break;
             }
             if (i.max > val || i.min == i.max)
             {
                 res.Add(i.obj);
             }
         }
         FindRecursive(n.lc, val, ref res);
     }
     else
     {
         foreach (ITIntervalInt i in n.right)
         {
             if (i.max < val)
             {
                 break;
             }
             res.Add(i.obj);
         }
         FindRecursive(n.rc, val, ref res);
     }
 }
예제 #3
0
 private void FindRecursive(ITNodeInt n, int val1, int val2, ref List <object> res, Func <object, bool> filter)
 {
     if (n == null)
     {
         return;
     }
     if (val2 <= n.mid)
     {
         foreach (ITIntervalInt i in n.left)
         {
             if (i.min > val2)
             {
                 break;
             }
             if (filter == null || filter(i.obj))
             {
                 res.Add(i.obj);
             }
         }
         FindRecursive(n.lc, val1, val2, ref res, filter);
     }
     else if (val1 >= n.mid)
     {
         foreach (ITIntervalInt i in n.right)
         {
             if (i.max < val1)
             {
                 break;
             }
             if (filter == null || filter(i.obj))
             {
                 res.Add(i.obj);
             }
         }
         FindRecursive(n.rc, val1, val2, ref res, filter);
     }
     else
     {
         foreach (ITIntervalInt i in n.left)
         {
             if (i.min > val2)
             {
                 break;
             }
             if (filter == null || filter(i.obj))
             {
                 res.Add(i.obj);
             }
         }
         FindRecursive(n.lc, val1, n.mid, ref res, filter);
         FindRecursive(n.rc, n.mid, val2, ref res, filter);
     }
 }
예제 #4
0
 void Construct()
 {
     intervals.Sort((a, b) => { return(a.mid.CompareTo(b.mid)); });
     root = ConstructRecursive(intervals);
 }
예제 #5
0
 public void Clear()
 {
     intervals.Clear();
     objects.Clear();
     root = null;
 }
예제 #6
0
 public void Add(object obj, int min, int max)
 {
     intervals.Add(new ITIntervalInt(obj, min, max));
     objects.Add(obj);
     root = null;
 }