我需要在 Cocoa(来自 Objective-C 或 Swift)中对大字符串进行一些字符处理,其中:
- 传入
NSString
的输入字符串有n个字符 - 结果应该在
NSString
中返回 - 可以对字符串中的字符进行简化假设。我的意思是我们可以假设它们都是 ASCII,或者都是单一代码单元 UTF8,甚至都是
unichar
(以便进行索引和长度计算 O(1))
为了示例,假设处理是 rot13 混淆。
我想在空间和时间上高效地做到这一点:
- 我想从源字符串(可能是一个副本)中获取一个可变的字符缓冲区
- 我想改变缓冲区
- 我想在构造的
NSString
中返回更改后的缓冲区,而不进行另一个副本。
我希望空间复杂度≤ 2*n+ O(1)。
我想要时间复杂度 O(n) - 常数越小越好。
NSString
API 可以很容易地做到这一点,但效率太低,需要大量的字符到字符串的来回转换。我在这里争取 C 级高效的字符处理。
NSString
API 还允许使用dataUsingEncoding:
或UTF8String
等方法获取字符缓冲区。但是我找不到一种方法来使用 API,我只复制一次字符进行处理。
最佳答案
分配一个unichar
的缓冲区。使用 getCharacters(range:)
复制到缓冲区。操纵。使用 init(charactersNoCopy:length:freeWhenDone:)
转换回来。
unichar
是 UTF-16。如果您愿意假设没有任何东西需要代理字符(例如,如果您假设它是 ASCII),那么您可以根据 length
(它将是 2 * 长度)分配您的缓冲区。如果您想要更灵活,但仍需以 2-3 倍的内存需求为代价实现 O(1),则使用 maximumLengthOfBytes
。如果您想更加灵活,但愿意接受 O(n) 步骤(我假设您不是),请使用 lengthOfBytes
。
NSString
在内部存储为 UTF-16 有点常见,因此这往往是一个非常快速的转换。也就是说,如果您对字符串有足够的了解,并且愿意编写额外的代码来直接操作编码,那么请查看 fastestEncoding
。
关于objective-c - NSString的高效字符处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40061923/