如何解决有没有更好的方法来处理此词典搜索?
| 我正在创建一个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。
问题是,起初这太慢了!第一个字母花费几秒钟,第二个字母花费不多。第三,速度有点合理。有没有办法可以大大加快此筛选过程?
谢谢。
解决方法
您可以在应用程序加载时扫描.plist文件并创建按字母顺序排列的哈希表(哈希是一种将数据压缩为单个值的方式,这样,压缩要放入同一个存储桶中的两个单词将产生相同的值),然后,您甚至可以在搜索前根据前1-3个字母查找正确的存储桶。关于散列(相对于常规搜索)的好处是,您实际上是在形成一个数据数组,其中生成的散列是存储桶的索引。因此,一旦对数据进行哈希处理(这可能是一项昂贵的操作,但仅在加载时执行一次),则查找与在数组中查找数据一样快。
编辑(详细说明):
如果要基于字母组合进行查找,则可以基于重复字母模式创建哈希表。假设创建一个基于\'der \'散列的存储桶,其中将同时包含\'spiderpig \'和\'binder \',那么另一个目录将基于\'spi \'的散列还将包含\'spinach \'和\'spiderpig \'(在这种情况下,spiderpig将位于两个存储桶中)。如果正确实施,则散列速度非常快,这是大多数搜索引擎的原动力(这就是为什么您看到它们在不到一秒钟的时间内返回数百万个结果的原因)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。