0

我有一个超过 280.000 多个单词的巨大单词列表,这些单词从 sqlite 数据库加载到 NSArray。然后我进行快速枚举以检查用户输入的某个字符串值是否与数组中的某个单词匹配。由于阵列太大,iphone 4 大约需要 1-2 秒才能通过该阵列。

我怎样才能提高性能?也许我应该制作几个较小的数组?字母表中的每个字母一个,这样可以减少要处理的数据。

这就是我的数据库类的外观

static WordDatabase *_database;

+(WordDatabase *) database
{

    if (_database == nil) {

        _database = [[WordDatabase alloc] init];

    }

    return _database;
}

- (id) init
{
    if ((self = [super init])) {
        NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"dictionary" ofType:@"sqlite"];


        if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
            NSLog(@"Failed to open database!");
        }
    }
    return self;

}

- (NSArray *)dictionaryWords {

    NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease];
    NSString *query = @"SELECT word FROM words";
    sqlite3_stmt *statement;

    if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {

            char *wordChars = (char *) sqlite3_column_text(statement, 0);

            NSString *name = [[NSString alloc] initWithUTF8String:wordChars];

            name = [name uppercaseString];

            [retval addObject:name];

        }
        sqlite3_finalize(statement);
    }

    return retval;

}

然后在我的主视图中我像这样初始化它

dictionary = [[NSArray alloc] initWithArray:[WordDatabase database].dictionaryWords];

最后我使用这种方法遍历数组

- (void) checkWord
{    
    NSString *userWord = formedWord.wordLabel.string;
    NSLog(@"checking dictionary for %@", userWord);

    for (NSString *word in dictionary) {
        if ([userWord isEqualToString: word]) {   
        NSLog(@"match found");    
        }     
    }
}
4

3 回答 3

4

很多不同的方式。

  • 将所有单词粘贴在字典或集合中,测试存在很快

  • 按照您的建议将其分解;创建某种树型结构。

  • 使用数据库进行搜索。如果构造正确,它们通常非常擅长这一点。

于 2012-08-15T17:10:17.783 回答
0

如果空间不是问题,请存储每个单词的哈希值并将其用于基本查找。一旦通过哈希过滤,然后比较每个单词。这将减少代价高昂的字符串比较次数。更容易索引/排序并执行快速查找。

于 2012-08-15T17:14:00.987 回答
0

我第二个字典。目标 c 的 NSDictionary。

例如:

// 打印出 NSDictionary myDict 中的所有键值对

 for(id key in myDict)
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);
于 2012-08-15T17:15:11.590 回答