Компактный код Гильберта Криса Гамильтона - для вычисления компактных индексов Гильберта - PullRequest
1 голос
/ 13 февраля 2012

У меня есть многомерные точки, которые могут иметь ключи следующих 3 типов INT (4), т. Е. Short, или INT (8), или varchar (512).

По этой причине я не могу использовать нормальное преобразование кривой Гильберта. Я нашел очень хороший ресурс для расчета компактных гильбертовых индексов. Вот ссылка.

http://web.cs.dal.ca/~chamilto/hilbert/index.html

Я понимаю суть и мотивы его работы, но не могу расшифровать код. Я не могу понять, какие функции вызывать для вычисления компактных индексов Гильберта и обратного к нему значения.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

http://code.google.com/p/uzaygezen/ - это реализация компактного индекса Гильберта с открытым исходным кодом на Java. Вот пример, соответствующий 3 измерениям с 4, 8 и 512 байтами, как указано в вопросе:

CompactHilbertCurve chc = new CompactHilbertCurve(new int[] {4 * 8, 8 * 8, 512 * 8});
List<Integer> bitsPerDimension = chc.getSpec().getBitsPerDimension();
BitVector[] p = new BitVector[bitsPerDimension.size()];
for (int i = p.length; --i >= 0; ) {
    p[i] = BitVectorFactories.OPTIMAL.apply(bitsPerDimension.get(i));
}
p[0].copyFrom(123);
p[1].copyFrom(32342);
p[2].copyFrom(BitSet.valueOf("test".getBytes("ISO-8859-1")));
BitVector chi = BitVectorFactories.OPTIMAL.apply(chc.getSpec().sumBitsPerDimension());
chc.index(p, 0, chi);
System.out.println(chi);
0 голосов
/ 14 февраля 2012

Если вы скачаете код и посмотрите на файл заголовка, он должен быть понятен (кстати, библиотека, хорошо скомпилированная для меня в Ubuntu):

// Description of parameters:
//
// FOR REGULAR HILBERT INDICES
//
// CFixBitVec/CBigBitVec *p
// Pointer to array of non-negative coordinate values.
//
// int m
// Precision of all coordinate values (number of bits required to
// represent the largest possible coordinate value).
//
// int n
// Number of dimensions (size of the array *p).
//
// CFixBitVec/CBigBitVec &h
// Hilbert index of maximum precision m*n.
//
// int *ms
// Array of precision values, one per dimension.
//
// FOR COMPACT HILBERT INDICES
//
// CFixBitVec/CBigBitVec &hc
// Compact Hilbert index of maximum precision M.
//
// int M
// Net precision value, corresponding to the size of the compact
// Hilbert code.  If not provided, defaults to zero and will be calculated
// by the function (sum_i { ms[i] }).
//
// int m
// Largest precision value (max_i { ms[i] }).  If not provided, defaults
// to zero and will be calculated by the function,


namespace Hilbert
{
    // fix -> fix
    void coordsToIndex( const CFixBitVec *p, int m, int n, CFixBitVec &h );
    void indexToCoords( CFixBitVec *p, int m, int n, const CFixBitVec &h );
    void coordsToCompactIndex( const CFixBitVec *p, const int *ms, int n,
        CFixBitVec &hc, int M = 0, int m = 0 );
    void compactIndexToCoords( CFixBitVec *p, const int *ms, int n,
        const CFixBitVec &hc, int M = 0, int m = 0 );

    // fix -> big
    void coordsToIndex( const CFixBitVec *p, int m, int n, CBigBitVec &h );
    void indexToCoords( CFixBitVec *p, int m, int n, const CBigBitVec &h );
    void coordsToCompactIndex( const CFixBitVec *p, const int *ms, int n,
        CBigBitVec &hc, int M = 0, int m = 0 );
    void compactIndexToCoords( CFixBitVec *p, const int *ms, int n,
        const CBigBitVec &hc, int M = 0, int m = 0 );

    // big -> big
    void coordsToIndex( const CBigBitVec *p, int m, int n, CBigBitVec &h );
    void indexToCoords( CBigBitVec *p, int m, int n, const CBigBitVec &h );
    void coordsToCompactIndex( const CBigBitVec *p, const int *ms, int n,
        CBigBitVec &hc, int M = 0, int m = 0 );
    void compactIndexToCoords( CBigBitVec *p, const int *ms, int n,
        const CBigBitVec &hc, int M = 0, int m = 0 );
};
...