UTF8字符串:简单的想法使index()查找O(1)

时间:2011-11-05 12:57:20

标签: c++ unicode

背景

我正在使用UTF8-CPP类。绝大多数字符串都使用ASCII字符集(0-127)。基于UTF8的字符串的问题在于索引函数(即检索特定位置的字符)很慢。

一种简单的技术是使用标志作为属性,基本上表示字符串是纯ASCII还是音符(isAscii)。每当修改字符串时,都会更新此标志。

这个解决方案似乎太简单了,可能有些东西我忽略了。但是,如果这个解决方案是可行的,它是否不能提供两个世界中最好的(即绝大多数情况下需要的Unicode和绝大多数情况下的性能),并且它不会为索引loopkup提供O(1)吗?

更新

我将附上一张图来澄清我的意思。我想很多人都误解了我的意思(或者我误解了基本概念)。 所有好的回复。

3 个答案:

答案 0 :(得分:3)

我认为这里的重点是,虽然你的绝大多数字符串都是ASCII,但一般来说,UTF-8库的设计者应该期望一般的UTF-8字符串。在那里,检查和设置此标志是不必要的开销。

在您的情况下,相应地包装或修改UTF8类可能是值得的。但在此之前,请询问您最喜欢的探查者是否值得。

答案 1 :(得分:1)

“这取决于”您对线程安全和更新的需求,以及字符串的长度以及您获得的数量。换句话说,只在实际应用程序中分析您的想法会告诉您它是否会使事情变得更好或更糟。

答案 2 :(得分:1)

如果你想加快UTF8的速度......

首先,考虑对代码点进行顺序索引,从而避免一次又一次地从字符串的最开始对它们进行计数。实现并使用例程来索引下一个和前一个代码点。

其次,您可以在UTF8字符串的代码点中构建索引数组,并在搜索时将其用作第一步,它将为您提供所搜索代码点的大致位置。
您可能拥有固定大小的(数组),在这种情况下,您仍将获得具有O(1)内存成本的搜索时间~O(n),或者它包含等间距索引(即,索引到每个m'代码点,其中m是一些常数),在这种情况下,你将获得具有O(n)内存成本的搜索时间~O(m + log(n))。

您还可以在代码点数据中嵌入索引,将它们编码为保留/未使用/等等代码点或使用无效编码(例如,第一个字节为11111110二进制,然后,例如,包含索引的6个10xxxxxx字节,或者其他你喜欢)。