Esempio n. 1
0
        public void Load(int[] keys)
        {
            keysLength = keys.Length;
            if (keysLength == 0)
            {
                return;
            }
            n_scale = keysLength / 16;
            min     = keys[0];
            max     = keys[keysLength - 1];

            // Особый случай, когда n_scale < 1 или V_min == V_max. Тогда делается массив из одного элемента и особая функция
            if (n_scale < 1 || min == max)
            {
                n_scale   = 1;
                starts    = new int[1];
                starts[0] = 0;
            }
            else
            {
                starts = new int[n_scale];
            }
            SetToPosition();
            // Заполнение количеств элементов в диапазонах
            for (int i = 0; i < keys.Length; i++)
            {
                int key      = keys[i];
                int position = ToPosition(key);
                // Предполагаю, что начальная разметка массива - нули
                starts[position] += 1;
            }
            // Заполнение начал диапазонов
            int sum = 0;

            for (int i = 0; i < n_scale; i++)
            {
                int num_els = starts[i];
                starts[i] = sum;
                sum      += num_els;
            }
            SetGetDia();
            // Запись наработанного в стрим
            keylengthminmaxstarts.Clear();
            keylengthminmaxstarts.AppendElement(keysLength);
            keylengthminmaxstarts.AppendElement(min);
            keylengthminmaxstarts.AppendElement(max);
            for (int i = 0; i < starts.Length; i++)
            {
                keylengthminmaxstarts.AppendElement(starts[i]);
            }
            keylengthminmaxstarts.Flush();
        }
Esempio n. 2
0
        public void Build()
        {
            // формируем массив пар
            List <int>  keys    = new List <int>();
            List <long> offsets = new List <long>();

            int ind = 0;

            bearing.Scan((off, obj) =>
            {
                foreach (int key in keyFun(obj))
                {
                    offsets.Add(off);
                    keys.Add(key);
                    ind++;
                }
                return(true);
            });
            int[]  keys_arr    = keys.ToArray(); keys = null;
            long[] offsets_arr = offsets.ToArray(); offsets = null;
            // Сортируем по ключу
            Array.Sort(keys_arr, offsets_arr);

            // Эта часть делается если компаратор объектов comp задан
            //if (comp != null)
            //{
            //    // массив объектов
            //    List<object> objs = new List<object>();
            //    // проходим по массиву ключей, в группах одинаковых ключей выделяем массив объектов
            //    int key, start = -1; // начало интервала и количество с одинаковым ключом
            //    key = Int32.MinValue;
            //    Action fixgroup = () =>
            //    {
            //        int number = objs.Count;
            //        if (number > 1)
            //        {
            //            long[] offs_small = new long[number];
            //            for (int j = 0; j < number; j++)
            //                offs_small[j] = offsets[start + j];
            //            // Сортировка отрезка
            //            Array.Sort(objs.ToArray(), offs_small, comp);
            //            // вернуть отсортированные офсеты на место
            //            for (int j = 0; j < number; j++)
            //                offsets[start + j] = offs_small[j];
            //        }
            //    };
            //    for (int i = 0; i < ne; i++)
            //    {
            //        object ob = bearing.GetElement(offsets[i]);
            //        int k = keyFun(ob);
            //        // смена ключа
            //        if (i == 0 || k != key)
            //        {
            //            // фиксируем предыдущий отрезок (key, start, number)
            //            //FixGroup(offsets, objs, start);
            //            fixgroup();
            //            // Начать новый отрезок
            //            key = k;
            //            start = i;
            //            objs.Clear();
            //        }
            //        // основное действие
            //        objs.Add(ob);
            //    }
            //    if (objs.Count > 1) fixgroup();
            //}

            // Записываем
            keyoffsets.Clear(); // очищаем
            for (int i = 0; i < keys_arr.Length; i++)
            {
                keyoffsets.AppendElement(new object[] { keys_arr[i], offsets_arr[i] });
            }
            keyoffsets.Flush();

            if (scale != null)
            {
                scale.Load(keys_arr);
            }
        }
Esempio n. 3
0
 //struct KeyOffPair { public int key; public long off; }
 //private Func<int, Diapason> scaleFunc = null;
 public void Clear()
 {
     keyoffsets.Clear();
 }
Esempio n. 4
0
 public void Clear()
 {
     offset_sequ.Clear();
 }
Esempio n. 5
0
 // Без индексов можно последовательноть очистить, загрузить поток значений, сканировать поток значений
 public void Clear()
 {
     sequence.Clear();
 }