C++中基于类矩阵结构的索引访问

Index-based access on Matrix-like structure in C++

本文关键字:索引 访问 结构 于类矩 C++      更新时间:2023-10-16

我在以下格式下的两组编码(不相关: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值的索引(左列)直接访问它们(无需搜索)。

示例:

我可以将这些元素存储在这样的数据结构中:

无符号短*my_page[256]={my_00,my_01,…..,my_ff}

,其中元素的定义如下:

静态无符号短my_00[256]等

所以基本上是矩阵=>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结构,但它失败了,因为访问模式不会返回唯一的结果。

例如:对于unicode值,通过CCD_ 2,因为例如对于i和对于i+1,索引可以是相同的。你知道像我试图做的那样,只基于预先计算的索引访问/填充my_page结构中的元素的另一种方法吗?

我假设我必须使用类似伪哈希函数的东西,它根据一组规则返回一系列值VRange,我可以从范围VRange中提取my_page[256][256]的整数索引。

如果你有什么建议,请告诉我:)

谢谢!

对于GB18030,请参阅本文件:http://icu-project.org/docs/papers/gb18030.html

如本文所述:有效字节序列的数量——覆盖的Unicode代码点和它们之间定义的映射的数量——使得直接使用普通的、纯粹基于映射表的代码页转换器变得不切实际。大约有110万个映射,一个简单的映射表的大小将是几兆字节因此,实现基于纯映射表的转换可能是不好的。对于较大的部分,GB18030和Unicode之间存在直接映射。四个字节的字符中的大多数都可以通过算法进行翻译。这篇文章的作者建议用一个特殊的代码来处理这些范围,而用一个经典的映射表来处理其他范围。这些字符是XML映射表中给出的字符:http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml

因此,在C++中基于类矩阵结构的索引访问可能是一个为研究此类双射函数的人打开的问题。