C++ 中类矩阵结构的基于索引的访问
Index-based access on Matrix-like structure in C++
我在这种格式下有两组编码(不相关:Unicode 和 GB18030)之间的映射 Nx2:
警告:巨大XML,连接速度慢时请勿打开:
http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
快照:
<a u="00B7" b="A1 A4"/>
<a u="00B8" b="81 30 86 30"/>
<a u="00B9" b="81 30 86 31"/>
<a u="00BA" b="81 30 86 32"/>
我想将 b 值(右列)保存在数据结构中,并使用基于 a 值(左列)的索引直接访问它们(无需搜索)。
示例:
我可以将这些元素存储在这样的数据结构中:
unsigned short *my_page[256] = {my_00,my_01, ....., my_ff}
,其中元素的定义如下:
static unsigned short my_00[256] etc.
。
所以基本上是一个矩阵矩阵 => 256x256 = 65536 个可用元素。
对于其他具有较少元素和不同值的编码(例如中文 Big5、日语 Shift、韩语 KSC 等),我可以使用 双射 函数如下:
element = my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF];
, 其中 unicode[i] 填充了a-like 映射中的元素(如上所述)。我如何生成和填充 my_page 结构是类似的。对于工作编码,我需要存储大约 7000 个字符(它们存储在 my_page 中的一个独特位置)。
问题出在GB18030编码上,试图在my_page中存储30861个元素(65536个元素)。我正在尝试使用相同的双射函数来填充(然后类似地访问)my_page 结构,但它失败了,因为访问模式没有 return 唯一结果。
例如:对于 unicode 值,有超过 1 个元素通过访问
my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF]
因为 i 和 i+1 的索引可以相同。您是否知道 accessing/filling my_page 结构中的元素仅基于预先计算的索引的另一种方法,就像我试图做的那样?
我假设我必须使用类似伪散列函数的东西,它 return 为我提供了一系列值 VRange 和 基于我可以的一组规则从范围 VRange 中提取 my_page[256][256].
的整数索引
如果您有任何建议,请告诉我:)
谢谢!
对于GB18030,参考这个文档:http://icu-project.org/docs/papers/gb18030.html
如本文所述:
“有效字节序列的数量——覆盖的 Unicode 代码点和它们之间定义的映射——使得直接使用普通的、纯粹基于映射 table 的代码页转换器变得不切实际。大约有 110 万个映射,一个简单的映射 table 的大小将达到几兆字节。”
所以很可能不好实现基于纯映射的转换table。
对于大件,GB18030和Unicode有直接映射。大多数四字节字符都可以通过算法进行翻译。这篇文章的作者建议用特殊代码处理这些范围,并用经典映射 table 处理其他范围。这些字符是 XML 映射 table 中给出的字符:http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
因此,C++中类矩阵结构的基于索引的访问可能是一个为研究此类双射函数的人开放的问题。
我在这种格式下有两组编码(不相关:Unicode 和 GB18030)之间的映射 Nx2: 警告:巨大XML,连接速度慢时请勿打开: http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
快照:
<a u="00B7" b="A1 A4"/>
<a u="00B8" b="81 30 86 30"/>
<a u="00B9" b="81 30 86 31"/>
<a u="00BA" b="81 30 86 32"/>
我想将 b 值(右列)保存在数据结构中,并使用基于 a 值(左列)的索引直接访问它们(无需搜索)。
示例:
我可以将这些元素存储在这样的数据结构中:
unsigned short *my_page[256] = {my_00,my_01, ....., my_ff}
,其中元素的定义如下:
static unsigned short my_00[256] etc.
。 所以基本上是一个矩阵矩阵 => 256x256 = 65536 个可用元素。
对于其他具有较少元素和不同值的编码(例如中文 Big5、日语 Shift、韩语 KSC 等),我可以使用 双射 函数如下:
element = my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF];
, 其中 unicode[i] 填充了a-like 映射中的元素(如上所述)。我如何生成和填充 my_page 结构是类似的。对于工作编码,我需要存储大约 7000 个字符(它们存储在 my_page 中的一个独特位置)。
问题出在GB18030编码上,试图在my_page中存储30861个元素(65536个元素)。我正在尝试使用相同的双射函数来填充(然后类似地访问)my_page 结构,但它失败了,因为访问模式没有 return 唯一结果。
例如:对于 unicode 值,有超过 1 个元素通过访问
my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF]
因为 i 和 i+1 的索引可以相同。您是否知道 accessing/filling my_page 结构中的元素仅基于预先计算的索引的另一种方法,就像我试图做的那样?
我假设我必须使用类似伪散列函数的东西,它 return 为我提供了一系列值 VRange 和 基于我可以的一组规则从范围 VRange 中提取 my_page[256][256].
的整数索引如果您有任何建议,请告诉我:)
谢谢!
对于GB18030,参考这个文档:http://icu-project.org/docs/papers/gb18030.html
如本文所述: “有效字节序列的数量——覆盖的 Unicode 代码点和它们之间定义的映射——使得直接使用普通的、纯粹基于映射 table 的代码页转换器变得不切实际。大约有 110 万个映射,一个简单的映射 table 的大小将达到几兆字节。” 所以很可能不好实现基于纯映射的转换table。 对于大件,GB18030和Unicode有直接映射。大多数四字节字符都可以通过算法进行翻译。这篇文章的作者建议用特殊代码处理这些范围,并用经典映射 table 处理其他范围。这些字符是 XML 映射 table 中给出的字符:http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
因此,C++中类矩阵结构的基于索引的访问可能是一个为研究此类双射函数的人开放的问题。