Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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();
        }