克里斯汉密尔顿的紧凑希尔伯特代码 - 计算紧凑希尔伯特指数

Posted

技术标签:

【中文标题】克里斯汉密尔顿的紧凑希尔伯特代码 - 计算紧凑希尔伯特指数【英文标题】:Compact Hilbert Code by Chris Hamilton - to calculate Compact Hilbert Indices 【发布时间】:2012-03-05 03:47:44 【问题描述】:

我有一个多维点,它可能具有以下 3 种 INT(4) 类型的键,即 Short 或 INT(8) 或 varchar(512)。

因此,我不能使用正常的希尔伯特曲线变换。我找到了一个非常好的资源来计算紧凑的希尔伯特指数。这是链接。

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

我理解他论文中的要点和动机,但我无法破译代码。我不知道要调用哪些函数来计算紧凑希尔伯特指数及其倒数。

【问题讨论】:

所以你问我们代码是如何工作的?为什么不联系作者? C++ 没有 INT(4)INT(8)varchar(512) 类型。这看起来更像是 Fortran。你确定你正确标记了这个问题吗? @DietmarKühl iirc,这些 SQL 类型很容易对应于 int32_t、int64_t 和 char[512] 或 std::string - 库本身似乎是用 C++ 编写的,因此标记可能没问题. 我试图联系作者,但可能他很忙。我不想理解代码。这是一个图书馆。我只想知道实际调用哪些函数..没有手册。 【参考方案1】:

http://code.google.com/p/uzaygezen/ 是紧凑希尔伯特索引的开源 Java 实现。这是一个对应于 4、8 和 512 字节的 3 个维度的示例,如问题中所述:

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);

【讨论】:

【参考方案2】:

如果你下载代码并查看头文件,它应该是不言自明的(顺便说一句,在 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 );
;

【讨论】:

感谢您的提示,如果您在测试主代码中注意到作者创建了 4 维点,并且它进行了转换就好了。但是,当尝试将此代码扩展到 5 维时,它开始给出垃圾答案。试过了吗? 请阅读作者的文档——也许他的实现有限制:我不知道。 没有作者文档;这就是为什么我们不知道如何使用它。【参考方案3】:

http://code.google.com/p/uzaygezen/ 是紧凑希尔伯特索引的开源 Java 实现,计算紧凑希尔伯特索引所需的 API 相当简单。这是一个对应于 4、8 和 512 字节的 3 个维度的示例,如问题中所述:

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);

【讨论】:

以上是关于克里斯汉密尔顿的紧凑希尔伯特代码 - 计算紧凑希尔伯特指数的主要内容,如果未能解决你的问题,请参考以下文章

希尔顿推出官网“直订连通房”服务 满足宾客多样化旅行需求

riesz表示定理

小漏洞大影响:来看看希尔顿酒店官网的CSRF漏洞

Oracle SQL查询选择[关闭]

信号处理-基于希尔伯特解调(包络谱)的轴承故障诊断实战,通过python代码实现超详细讲解

计算一个点的希尔伯特值以用于希尔伯特 R-树?