克里斯汉密尔顿的紧凑希尔伯特代码 - 计算紧凑希尔伯特指数
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);
【讨论】:
以上是关于克里斯汉密尔顿的紧凑希尔伯特代码 - 计算紧凑希尔伯特指数的主要内容,如果未能解决你的问题,请参考以下文章