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(); }
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); } }
//struct KeyOffPair { public int key; public long off; } //private Func<int, Diapason> scaleFunc = null; public void Clear() { keyoffsets.Clear(); }
public void Clear() { offset_sequ.Clear(); }
// Без индексов можно последовательноть очистить, загрузить поток значений, сканировать поток значений public void Clear() { sequence.Clear(); }