4

我有一个索引,它以原始形式和整理形式存储用于搜索的文本字符串(整理形式用于搜索索引,原始形式显示在结果中)。

排序是通过 ICU4C 实现完成的,它按照Unicode Collat​​ion Algorithm中的定义工作。我使用排序键,通常只存储主要强度(无重音、小写/大写、代码页等)。

出于调试目的,是否有任何方法可以反转排序规则以检索类似于原始字符串的人类可读字符串? 显然这是一个有损的过程,但是将 'a' 的排序键转换为显示 ASCII 'a' 字符就足够了。希望有一种标准的方法可以做到这一点,而不必自己实现从二进制排序键到可打印的 unicode 字符的转换。最佳情况下,该解决方案将在 C/C++ 中实现。

提前致谢。

4

1 回答 1

1

您不需要通用反向整理算法。你只想找到你曾经处理过的字符串排序规则。

因此,只需创建一个全局映射(字典),在其中存储您放入主索引的每个 UTF 字符串。UTF 字符串将是字典值,而其排序规则键将是您的字典键:

allStrings[collation_key] = utf_string

以这种方式,您创建了所有已知字符串的全局排序索引。然后,只要您需要它用于调试输出,只需通过其排序规则键检索一个字符串。

给定排序规则键的字符串不能保证是唯一的,但是,正如您所提到的,与原始字符串或多或少相似的字符串在您的应用程序中运行良好。

即使您没有访问索引的所有插入,您可能仍然可以先通过字符串检索所有记录:object -> str,然后通过排序规则:object -> coll,然后加入它们:for (objects) your_dictionary[ collat​​ions[object]]=strings[object] 。

如果您仍想设计自己的算法,请注意排序字符串包含所有字符的主要元素序列,后跟一系列二级元素,然后是三级元素,依此类推。我认为您可能会专注于学习主要元素。

  • 要获取 char 的主要元素,请将格式为“given_character long_constant_sequence”的字符串转换为其排序规则序列。当您更改 given_character 时,结果的前缀子序列将成为 given_character 的主要元素。
  • 现在,编写一个收集所有字符的主要元素的过程。然后,存储一个地图:主要元素 -> 字符(可能还有 primary_elements -> primary_elements_size;(但在您使用的排序算法中,大小可能是恒定的 - 检查它))
  • 开发一个分词器,将您的排序规则逐个拆分为元素。一旦找不到更多已知的主要元素,它可能应该停止 - 您不想在简单的解决方案中处理次要等元素。
  • 在索引排序规则上使用标记器,然后在 primary_elements -> 先前构建的字符映射中查找主要元素。编写一个近似的 UTF 字符串以在调试会话期间显示。
于 2017-01-31T13:38:17.170 回答