objective-c - NSString的高效字符处理

标签 objective-c swift performance cocoa nsstring

我需要在 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/

相关文章:

ios - 使用 ios8/ios9 api 的 base64 编码没有行长度限制

ios - 如何检查强制退出是否已禁用通知

ios - 我如何在 Xcode 中打印我的代码的所有方法?

macos - Storyboard在 OS X 10.10 上加载失败,有时

ios - Swift - 按子值从 Firebase 中选择

c++ - 如何编写高效的字符串缓冲区

ios - NSUserDefaults 不递增

swift - RealityKit 和 ARKit – 当应用程序启动时,AR 项目在寻找什么?

performance - 如何在单个程序中检查我的两个不同进程的运行时间

c# - 扫描自定义属性的所有类和方法的最佳实践