iphone - 有没有更好的方法来处理这个字典搜索?

标签 iphone objective-c ios nsmutablearray

我正在创建一个 iPhone 应用程序。我有一个包含单词字典(大约 180K 个单词)的 .plist 文件。

有一个文本字段,用户可以在其中开始输入单词。在他键入时,我使用委托(delegate)方法 textField:shouldChangeCharactersInRange:replacementString: 确保他只输入 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ。

当用户第一次点击 textField 时,我加载了一个名为 finalWords 的 NSMutableArray(在 header 中声明,保留并合成),其中包含 .plist 的内容(每个单词都是一个 NSString)。当用户输入一个字母时,我运行这个

-(void)filterWordsForString:(NSString *)string
{
  NSRange *range;
  for (int i=[finalWords count]-1 ; i >=0 ; i--)
  {
    range = [[finalWords objectAtIndex:i] rangeOfString:string];
    if (range.location == NSNotFound)
    {
      [finalWords removeObjectAtIndex:i];
    }
  }
}

我的目标是在用户输入不属于真实单词的字符串(根据我的字典)时阻止用户输入。这段代码的工作原理是它减少了用户在输入时可能输入的单词。这样,一旦他键入一个字母,使他无法完成一个单词,我就不允许输入该字母。此外,一旦有一个唯一的完成,我就继续用完成的单词填充 textField。

问题是一开始这太慢了!第一个字母需要几秒钟,第二个字母也差不多。到第三,速度有些合理。有什么方法可以大大加快这个过滤过程吗?

谢谢。

最佳答案

您可以在应用程序加载时扫描 .plist 文件并创建按字母顺序排列的哈希表(哈希是一种将数据压缩为单个值的方法,这样压缩您希望位于同一存储桶中的两个词将产生相同的值),然后您甚至可以在搜索之前根据前 1-3 个字母使用它来查找正确的存储桶。散列(与常规搜索相反)的好处在于,您实际上是在形成一个数据数组,其中生成的散列是存储桶的索引。因此,一旦对数据进行哈希处理(这可能是一项昂贵的操作,但在加载时只执行一次),查找速度与在数组中查找数据一样快。

编辑(更多详细说明):
如果您想根据字母组合进行查找,您可以根据重复出现的字母模式创建哈希表。假设创建一个基于“der”散列的存储桶,其中包含“spiderpig”和“binder”,然后另一个目录将基于“spi”的散列,其中包含“spinach”和“spiderpig” ' 以及(在这种情况下,spiderpig 将在两个桶中)。如果实现得当,散列运算速度非常快,它是大多数搜索引擎背后的驱动力(这就是为什么您会看到它们在不到一秒的时间内返回数​​百万个结果)。

关于iphone - 有没有更好的方法来处理这个字典搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346781/

相关文章:

ios - 个人应用程序的 URL 方案

ios - Swift 秒表应用程序崩溃,不知道我哪里出错了

iphone - ios将网页保存为pdf

iphone - iOS 6 自动旋转问题 - 不遵守 supportedInterfaceOrientations 返回值

ios - 使用父类(super class)类方法初始化与 init 方法之间的区别

objective-c - iOS 6 地址簿不工作?

ios - 将麦克风用于 forge 中内置的 iOS 应用程序

iphone - 在没有 SIM 卡的 iPhone 设备上测试

iphone - cellForRowAtIndexPath 内存管理

iphone - 在横向模式下显示 2 个 PDF 页面