Ejemplo n.º 1
0
 public SparseArray(TValue[] values)
 {
     _mode           = ArrayMode.Flat;
     this._values    = values;
     _navyData       = emptyNavyData;
     _allocatedCount = (_pseudoLength = (uint)values.Length);
 }
Ejemplo n.º 2
0
        public void RebuildToSparse()
        {
            _allocatedCount = 0;
            _mode           = ArrayMode.Sparse;
            var len = _pseudoLength;

            if (len == 0)
            {
                ensureCapacity(0);
                return;
            }

            _navyData = new _NavyItem[_values.Length];
            var data = _values;

            _values = new TValue[_values.Length];
            len     = (uint)Math.Min(data.Length, len);
            for (var i = 0; i < len; i++)
            {
                this[i] = data[i];
            }

            if (_values.Length < len)
            {
                this[(int)len - 1] = default(TValue);
            }
        }
Ejemplo n.º 3
0
 public SparseArray(int capacity)
 {
     _mode     = ArrayMode.Flat;
     _values   = emptyData;
     _navyData = emptyNavyData;
     if (capacity > 0)
     {
         ensureCapacity(capacity);
     }
 }
Ejemplo n.º 4
0
        private void rebuildToSparse()
        {
            _allocatedCount = 0;
            _mode           = ArrayMode.Sparse;
            var len = _pseudoLength;

            if (len == 0)
            {
                ensureCapacity(0);
                return;
            }

            _navyData = new _NavyItem[_values.Length];
            for (var i = 0; i < _values.Length; i++)
            {
                this[i] = _values[i];
            }

            if (_values.Length < len)
            {
                this[(int)len - 1] = default(TValue);
            }
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Specifies how to deal with arrays.
 /// </summary>
 /// <param name="arrayMode">The array mode to use.</param>
 /// <returns>The current builder instance.</returns>
 public Builder Arrays(ArrayMode arrayMode)
 {
     ArrayMode = arrayMode;
     return(this);
 }
Ejemplo n.º 6
0
 public SparseArray()
 {
     _mode     = ArrayMode.Flat;
     _values   = emptyData;
     _navyData = emptyNavyData;
 }
Ejemplo n.º 7
0
 public SparseArray()
 {
     mode     = ArrayMode.Flat;
     values   = emptyData;
     navyData = emptyNavyData;
 }
Ejemplo n.º 8
0
 public SparseArray(ArrayMode arrayMode = ArrayMode.Flat)
 {
     Mode      = arrayMode;
     _values   = emptyData;
     _navyData = emptyNavyData;
 }
Ejemplo n.º 9
0
        private void SegmentTreeUpdate <TQueryObject>(SegmentTreeMode segmentTreeMode, ArrayMode arrayMode, bool randomPoints = false)
            where TQueryObject : SegmentTreeQueryObject <TQueryObject, int>, new()
        {
            int updater(int x) => x + 1;

            var array = arrayMode == ArrayMode.AllRanges ? _allRangesArray
                : _randomRangesArray;
            var segmentTree = segmentTreeMode == SegmentTreeMode.NodeBased ? new NodeBasedSegmentTree <TQueryObject, int>(array)
                : segmentTreeMode == SegmentTreeMode.ArrayBased ? new ArrayBasedSegmentTree <TQueryObject, int>(array)
                : (SegmentTree <TQueryObject, int>) new NonRecursiveSegmentTree <TQueryObject, int>(array);

            if (arrayMode == ArrayMode.AllRanges)
            {
                for (int i = 0; i < array.Count; ++i)
                {
                    for (int j = i; j < array.Count; ++j)
                    {
                        segmentTree.Update(i, j, updater);
                    }
                }
            }
            else
            {
                if (randomPoints)
                {
                    for (int i = 0; i < _randomRangesCount; ++i)
                    {
                        Tuple <int, int> range = _randomRanges[i];

                        segmentTree.Update(range.Item1, updater);
                    }
                }
                else
                {
                    for (int i = 0; i < _randomRangesCount; ++i)
                    {
                        Tuple <int, int> range = _randomRanges[i];

                        segmentTree.Update(range.Item1, range.Item2, updater);
                    }
                }
            }
        }
Ejemplo n.º 10
0
        private void SegmentTreeQuery <TQueryObject>(SegmentTreeMode segmentTreeMode, ArrayMode arrayMode)
            where TQueryObject : SegmentTreeQueryObject <TQueryObject, int>, new()
        {
            var array = arrayMode == ArrayMode.AllRanges ? _allRangesArray
                : arrayMode == ArrayMode.RightEndingRanges ? _rightEndingRangesArray
                : _randomRangesArray;
            var segmentTree = segmentTreeMode == SegmentTreeMode.NodeBased ? new NodeBasedSegmentTree <TQueryObject, int>(array)
                : segmentTreeMode == SegmentTreeMode.ArrayBased ? new ArrayBasedSegmentTree <TQueryObject, int>(array)
                : (SegmentTree <TQueryObject, int>) new NonRecursiveSegmentTree <TQueryObject, int>(array);

            if (arrayMode == ArrayMode.AllRanges)
            {
                for (int i = 0; i < array.Count; ++i)
                {
                    for (int j = i; j < array.Count; ++j)
                    {
                        segmentTree.Query(i, j);
                    }
                }
            }
            else if (arrayMode == ArrayMode.RightEndingRanges)
            {
                for (int i = 0; i < array.Count; ++i)
                {
                    segmentTree.Query(i, array.Count - 1);
                }
            }
            else
            {
                for (int i = 0; i < _randomRangesCount; ++i)
                {
                    Tuple <int, int> range = _randomRanges[i];

                    segmentTree.Query(range.Item1, range.Item2);
                }
            }
        }
Ejemplo n.º 11
0
        private void NaiveQuery(Func <IReadOnlyList <int>, int, int, int> naiveQuerier, ArrayMode arrayMode)
        {
            if (arrayMode == ArrayMode.AllRanges)
            {
                for (int i = 0; i < _allRangesArraySize; ++i)
                {
                    for (int j = i; j < _allRangesArraySize; ++j)
                    {
                        naiveQuerier(_allRangesArray, i, j);
                    }
                }
            }
            else if (arrayMode == ArrayMode.RightEndingRanges)
            {
                for (int i = 0; i < _rightEndingRangesArraySize; ++i)
                {
                    naiveQuerier(_rightEndingRangesArray, i, _rightEndingRangesArraySize - 1);
                }
            }
            else
            {
                for (int i = 0; i < _randomRangesCount; ++i)
                {
                    Tuple <int, int> range = _randomRanges[i];

                    naiveQuerier(_randomRangesArray, range.Item1, range.Item2);
                }
            }
        }