public void Build() { int nelements = (int)table.Count(); int[] keys = new int[nelements]; long[] arr_offs = new long[nelements]; for (int i = 0; i < nelements; i++) { long off = i == 0 ? 8L : table.ElementOffset(); arr_offs[i] = off; object v = table.GetElement(off); //arr_triples[i] = v; keys[i] = keyFunc(v); } Array.Sort(keys, arr_offs); scaleFunc = Scale.GetDiaFunc32(keys); // Записываем итог index_spo.Clear(); for (int i = 0; i < nelements; i++) { index_spo.AppendElement(new object[] { keys[i], arr_offs[i] }); } index_spo.Flush(); }
public void Build() { int nelements = (int)table.Count(); int[] keys = new int[nelements]; long[] arr_offs = new long[nelements]; for (int i = 0; i < nelements; i++) { long off = i == 0 ? 8L : table.ElementOffset(); arr_offs[i] = off; object v = table.GetElement(off); //arr_triples[i] = v; keys[i] = keyFunc(v); } Array.Sort(keys, arr_offs); scaleFunc = Scale.GetDiaFunc32(keys); object[] arr_triples = new object[nelements]; // Выделяем группы одинаковых ключей и сортируем по компаратору int index = 0; int length = 0; int current_key = keys[index]; for (int i = 0; i < nelements; i++) { int key = keys[i]; if (key == current_key) { length++; } else { if (length > 39) { LocalSort(arr_offs, arr_triples, index, length); } // начинается новый блок index = i; length = 1; current_key = key; } } if (length > 39) { LocalSort(arr_offs, arr_triples, index, length); } // Записываем итог index_spo.Clear(); for (int i = 0; i < nelements; i++) { index_spo.AppendElement(new object[] { keys[i], arr_offs[i] }); } index_spo.Flush(); }
public void Build() { int nelements = (int)table.Count(); object[] arr_triples = new object[nelements]; long[] arr_offs = new long[nelements]; for (int i = 0; i < nelements; i++) { long off = i == 0 ? 8L : table.ElementOffset(); arr_offs[i] = off; object v = table.GetElement(off); arr_triples[i] = v; } Array.Sort(arr_triples, arr_offs, spo_comparer); index_spo.Clear(); for (int i = 0; i < nelements; i++) { index_spo.AppendElement(arr_offs[i]); } index_spo.Flush(); }