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

时间:2011-06-14 16:24:49

标签: iphone objective-c ios nsmutablearray

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

有一个textField用户开始输入单词。在他输入时,我使用委托方法textField:shouldChangeCharactersInRange:replacementString:来确保他只输入abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ。

当用户第一次点击textField时,我加载一个名为finalWords的NSMutableArray(在标题中声明,保留并合成)与.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。

问题在于,这一开始非常缓慢!第一个字母需要几秒钟,而第二个字母则需要几秒钟。到了第三,速度有点合理。有没有办法可以大大加快这个过滤过程?

感谢。

1 个答案:

答案 0 :(得分:0)

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

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