示例#1
0
 public static ArrayIterator <T> SetDifference <T>(
     this ArrayIterator <T> first1,
     ArrayIterator <T> last1,
     ArrayIterator <T> first2,
     ArrayIterator <T> last2,
     ArrayIterator <T> result,
     Func <T, T, bool> comp
     )
 {
     while (first1.NotEqual(last1) && first2.NotEqual(last2))
     {
         if (comp(first1.GetCurrent(), first2.GetCurrent()))
         {
             result.SetCurrent(first1.GetCurrent());
             result = result.GetNext();
             first1 = first1.GetNext();
         }
         else if (comp(first2.GetCurrent(), first1.GetCurrent()))
         {
             first2 = first2.GetNext();
         }
         else
         {
             first1 = first1.GetNext();
             first2 = first2.GetNext();
         }
     }
     return(first1.Copy(last1, result));
 }
示例#2
0
 public static ArrayIterator <T> Merge <T>(
     this ArrayIterator <T> first1,
     ArrayIterator <T> last1,
     ArrayIterator <T> first2,
     ArrayIterator <T> last2,
     ArrayIterator <T> result,
     Func <T, T, bool> comp
     )
 {
     while (true)
     {
         if (first1.IsEqual(last1))
         {
             return(first2.Copy(last2, result));
         }
         if (first2.IsEqual(last2))
         {
             return(first1.Copy(last1, result));
         }
         if (comp(first2.GetCurrent(), first1.GetCurrent()))
         {
             result.SetCurrent(first2.GetCurrent());
             first2 = first2.GetNext();
         }
         else
         {
             result.SetCurrent(first1.GetCurrent());
             first1 = first1.GetNext();
         }
         result = result.GetNext();
     }
 }
示例#3
0
        public static bool IsPermutation <T>(
            this ArrayIterator <T> first1,
            ArrayIterator <T> last1,
            ArrayIterator <T> first2,
            Func <T, T, bool> pred
            )
        {
            first1.Mismatch(last1, first2, pred, out first1, out first2);
            if (first1.IsEqual(last1))
            {
                return(true);
            }
            var last2 = first2;

            last2 = last2.GetAdvanced(first1.Distance(last1));
            for (var it1 = first1; it1.NotEqual(last1); it1 = it1.GetNext())
            {
                if (first1.Find(it1, it1.GetCurrent(), pred).IsEqual(it1))
                {
                    var n = first2.Count(last2, it1.GetCurrent(), pred);
                    if (n == 0 || it1.Count(last1, it1.GetCurrent(), pred) != n)
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }
示例#4
0
 public static ArrayIterator <T> Partition <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     Func <T, bool> pred
     )
 {
     while (first.NotEqual(last))
     {
         while (pred(first.GetCurrent()))
         {
             first = first.GetNext();
             if (first.IsEqual(last))
             {
                 return(first);
             }
         }
         do
         {
             last = last.GetPrev();
             if (first.IsEqual(last))
             {
                 return(first);
             }
         } while (pred(last.GetCurrent()) == false);
         first.Swap(last);
         first = first.GetNext();
     }
     return(first);
 }
示例#5
0
        public static ArrayIterator <T> SearchN <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            int count,
            T val,
            Func <T, T, bool> pred
            )
        {
            var limit = first.GetAdvanced(first.Distance(last) - count);

            while (first.NotEqual(limit))
            {
                var it = first;
                var i  = 0;
                while (pred(val, it.GetCurrent()))
                {
                    it = it.GetNext();
                    if (++i == count)
                    {
                        return(first);
                    }
                }
                first = first.GetNext();
            }
            return(last);
        }
示例#6
0
        public static ArrayIterator <T> UpperBound <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            T val,
            Func <T, T, bool> comp
            )
        {
            var count = Distance(first, last);

            while (count > 0)
            {
                var it   = first;
                var step = count / 2;
                it = it.GetAdvanced(step);
                if (comp(val, it.GetCurrent()) == false)
                {
                    it     = it.GetNext();
                    first  = it;
                    count -= step + 1;
                }
                else
                {
                    count = step;
                }
            }
            return(first);
        }
示例#7
0
        public static void Sort <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            Func <T, T, bool> comp
            )
        {
            // Quicksort
            if (first.IsEqual(last))
            {
                return;
            }
            var sep = first;

            for (var i = first.GetNext(); i.NotEqual(last); i = i.GetNext())
            {
                if (comp(i.GetCurrent(), first.GetCurrent()))
                {
                    sep = sep.GetNext();
                    sep.Swap(i);
                }
            }
            first.Swap(sep);
            first.Sort(sep, comp);
            sep.GetNext().Sort(last, comp);
        }
示例#8
0
        public static ArrayIterator <T> UniqueCopy <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            ArrayIterator <T> result,
            Func <T, T, bool> pred
            )
        {
            if (first.IsEqual(last))
            {
                return(last);
            }

            result.SetCurrent(first.GetCurrent());
            while ((first = first.GetNext()).NotEqual(last))
            {
                var val = first.GetCurrent();
                if (pred(result.GetCurrent(), val) == false)
                {
                    result = result.GetNext();
                    result.SetCurrent(val);
                }
            }
            result = result.GetNext();
            return(result);
        }
示例#9
0
 public static void PartitionCopy <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     ArrayIterator <T> resultTrue,
     ArrayIterator <T> resultFalse,
     Func <T, bool> pred,
     out ArrayIterator <T> outResultTrue,
     out ArrayIterator <T> outResultFalse
     )
 {
     while (first.NotEqual(last))
     {
         if (pred(first.GetCurrent()))
         {
             resultTrue.SetCurrent(first.GetCurrent());
             resultTrue = resultTrue.GetNext();
         }
         else
         {
             resultFalse.SetCurrent(first.GetCurrent());
             resultFalse = resultFalse.GetNext();
         }
         first = first.GetNext();
     }
     outResultTrue  = resultTrue;
     outResultFalse = resultFalse;
 }
示例#10
0
        public static void Swap <T>(this ArrayIterator <T> a, ArrayIterator <T> b)
        {
            var temp = a.GetCurrent();

            a.SetCurrent(b.GetCurrent());
            b.SetCurrent(temp);
        }
示例#11
0
 public static void MinMaxElement <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     Func <T, T, bool> comp,
     out ArrayIterator <T> min,
     out ArrayIterator <T> max
     )
 {
     if (first.IsEqual(last))
     {
         min = last;
         max = last;
     }
     min = first;
     max = first;
     while ((first = first.GetNext()).NotEqual(last))
     {
         if (comp(first.GetCurrent(), min.GetCurrent()))
         {
             min = first;
         }
         if (comp(max.GetCurrent(), first.GetCurrent()))
         {
             max = first;
         }
     }
 }
示例#12
0
        public static ArrayIterator <T> Search <T>(
            this ArrayIterator <T> first1,
            ArrayIterator <T> last1,
            ArrayIterator <T> first2,
            ArrayIterator <T> last2,
            Func <T, T, bool> pred
            )
        {
            if (first2.IsEqual(last2))
            {
                return(first1);
            }

            while (first1.NotEqual(last1))
            {
                var it1 = first1;
                var it2 = first2;
                while (pred(it1.GetCurrent(), it2.GetCurrent()))
                {
                    it1 = it1.GetNext();
                    it2 = it2.GetNext();
                    if (it2.IsEqual(last2))
                    {
                        return(first1);
                    }
                    if (it1.IsEqual(last1))
                    {
                        return(last1);
                    }
                }
                first1 = first1.GetNext();
            }
            return(last1);
        }
示例#13
0
        public static ArrayIterator <T> IsHeapUntil <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            Func <T, T, bool> comp
            )
        {
            var len = first.Distance(last);
            var p   = 0;
            var c   = 1;
            var pp  = first;

            while (c < len)
            {
                var cp = first.GetAdvanced(c);
                if (comp(pp.GetCurrent(), cp.GetCurrent()))
                {
                    return(cp);
                }
                c++;
                cp = cp.GetNext();
                if (c == len)
                {
                    return(last);
                }
                if (comp(pp.GetCurrent(), cp.GetCurrent()))
                {
                    return(cp);
                }
                p++;
                pp = pp.GetNext();
                c  = 2 * p + 1;
            }
            return(last);
        }
示例#14
0
        public static bool PrevPermutation <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            Func <T, T, bool> comp
            )
        {
            var i = last;

            if (first.IsEqual(last) || first.IsEqual(i = i.GetPrev()))
            {
                return(false);
            }
            while (true)
            {
                var ip1 = i;
                if (comp(ip1.GetCurrent(), (i = i.GetPrev()).GetCurrent()))
                {
                    var j = last;
                    while (comp((j = j.GetPrev()).GetCurrent(), i.GetCurrent()) == false)
                    {
                    }
                    Swap(i, j);
                    Reverse(ip1, last);
                    return(true);
                }
                if (i.IsEqual(first))
                {
                    Reverse(first, last);
                    return(false);
                }
            }
        }
示例#15
0
        public static ArrayIterator <T> PartitionPoint <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            Func <T, bool> pred
            )
        {
            var n = first.Distance(last);

            while (n > 0)
            {
                var it   = first;
                var step = n / 2;
                it.GetAdvanced(step);
                if (pred(it.GetCurrent()))
                {
                    first = it.GetNext();
                    n    -= step + 1;
                }
                else
                {
                    n = step;
                }
            }
            return(first);
        }
示例#16
0
        public static void StableSort <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            Func <T, T, bool> comp
            )
        {
            // TODO find a faster algorithm that doesn't create any garbage than insertion sort
            var arr = first.Array;

            for (var i = first.Index + 1; i < last.Index; i++)
            {
                var x     = arr[i];
                var left  = first.Index;
                var right = i - 1;
                while (left <= right)
                {
                    var middle = (left + right) / 2;
                    if (comp(x, arr[middle]))
                    {
                        right = middle - 1;
                    }
                    else
                    {
                        left = middle + 1;
                    }
                }
                for (var j = i - 1; j >= left; j--)
                {
                    arr[j + 1] = arr[j];
                }
                arr[left] = x;
            }
        }
示例#17
0
 public static void Reverse <T>(this ArrayIterator <T> first, ArrayIterator <T> last)
 {
     while ((first.NotEqual(last)) && (first.NotEqual((last = last.GetPrev()))))
     {
         first.Swap(last);
         first = first.GetNext();
     }
 }
示例#18
0
 public static bool IsHeap <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     Func <T, T, bool> comp
     )
 {
     return(first.IsHeapUntil(last, comp).IsEqual(last));
 }
示例#19
0
 public static ArrayIterator <T> RotateCopy <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> middle,
     ArrayIterator <T> last,
     ArrayIterator <T> result
     )
 {
     result = Copy(middle, last, result);
     return(Copy(first, middle, result));
 }
示例#20
0
 public static bool BinarySearch <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     T val,
     Func <T, T, bool> comp
     )
 {
     first = first.LowerBound(last, val, comp);
     return(first.NotEqual(last) && comp(val, first.GetCurrent()) == false);
 }
示例#21
0
 public static void PartialSort <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> middle,
     ArrayIterator <T> last,
     Func <T, T, bool> comp
     )
 {
     // TODO find a faster algorithm that doesn't create any garbage
     first.Sort(last, comp);
 }
示例#22
0
 public static void NthElement <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> nth,
     ArrayIterator <T> last,
     Func <T, T, bool> comp
     )
 {
     // TODO find a faster algorithm that doesn't create any garbage
     first.Sort(last, comp);
 }
示例#23
0
 public static void ForEach <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     Action <T> callback
     )
 {
     while (first.NotEqual(last))
     {
         callback(first.GetCurrent());
         first = first.GetNext();
     }
 }
示例#24
0
 public static void EqualRange <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     T val,
     Func <T, T, bool> comp,
     out ArrayIterator <T> lower,
     out ArrayIterator <T> upper
     )
 {
     lower = first.LowerBound(last, val, comp);
     upper = lower.UpperBound(last, val, comp);
 }
示例#25
0
 public static void SortHeap <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     Func <T, T, bool> comp
     )
 {
     while (first.Distance(last) > 1)
     {
         last = last.GetPrev();
         Swap(first, last);
         AdjustHeap(first.Array, first.Index, first.Index, last.Index, comp);
     }
 }
示例#26
0
        public static void RandomShuffle <T>(
            this ArrayIterator <T> first,
            ArrayIterator <T> last,
            Func <int, int> gen
            )
        {
            var n = Distance(first, last);

            for (var i = n - 1; i > 0; --i)
            {
                first.GetAdvanced(i).Swap(first.GetAdvanced(gen(i + 1)));
            }
        }
示例#27
0
 public static ArrayIterator <T> SwapRanges <T>(
     this ArrayIterator <T> first1,
     ArrayIterator <T> last1,
     ArrayIterator <T> first2
     )
 {
     while (first1.NotEqual(last1))
     {
         Swap(first1, first2);
         first1 = first1.GetNext();
         first2 = first2.GetNext();
     }
     return(first2);
 }
示例#28
0
 public static void PopHeap <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     Func <T, T, bool> comp
     )
 {
     if (first.Distance(last) < 2)
     {
         return;
     }
     last = last.GetPrev();
     Swap(first, last);
     AdjustHeap(first.Array, first.Index, first.Index, last.Index, comp);
 }
示例#29
0
 public static ArrayIterator <T> CopyBackward <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     ArrayIterator <T> result
     )
 {
     while (last.NotEqual(first))
     {
         result = result.GetPrev();
         last   = last.GetPrev();
         result.SetCurrent(last.GetCurrent());
     }
     return(result);
 }
示例#30
0
 public static ArrayIterator <T> ReverseCopy <T>(
     this ArrayIterator <T> first,
     ArrayIterator <T> last,
     ArrayIterator <T> result
     )
 {
     while (first.NotEqual(last))
     {
         last = last.GetPrev();
         result.SetCurrent(last.GetCurrent());
         result = result.GetNext();
     }
     return(result);
 }