2014-08-28 156 views
4

我一直在研究搜索算法整個下午,我想一些意見。我正在做的一些特定的iOS,但一般的概念不是。我想顯示一組數據,一個目錄。在目錄中我有部門和人員。我知道這聽起來像是一本教科書的例子,聽我說。我保證,這不是功課。 (我可以提供我正在工作的屏幕截圖。)快速搜索和排序

我有一個條目數組,其中有兩種目錄條目。我需要按名稱對條目進行排序,然後將數組拆分爲更小的數組,其中每個子數組包含以相同字母開頭的條目。

此外,我需要考慮用戶可能輸入的搜索字符串。

我一般的過程是這樣的:

  1. 過濾所有,如果有一個匹配的類型和搜索字符串的條目。對於此步驟,我使用NSPredicate:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %i AND searchableContents B[cd] %@", type, searchString]; 
    
    if (!searchString || searchString.length == 0) 
    { 
        predicate = [NSPredicate predicateWithFormat:@"type == %i", type]; 
    } 
    
    NSArray *array = [_directoryContents filteredArrayUsingPredicate:predicate]; 
    
  2. 按字母順序排序結果。

    array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
        return [((BRKDirectoryEntry *)obj1).comperableTitle compare:((BRKDirectoryEntry *)obj2).comperableTitle]; 
    }]; 
    
  3. 將結果分解爲更小的數組。對於表演,如果我們搜索,我會跳過這一步,但它似乎沒有幫助。

    if(alphabetized) 
    { 
        array = [self _alphabetizedArrayFromPresortedArray:array]; 
    } 
    

的本上共有950項的性能是深不可測的。

現在,對於我的默認顯示,我可以簡單地將已排序的數據緩存在內存中,然後顯示和滾動執行得很好,但對於search-as-I類型,根本無法實現平滑用戶期望的性能。

任何指針或提示?

+2

我仍然對有多少人問「我正在做XYZ,它太慢了,我怎麼能讓它更快?好像其他人的猜測有很大的機會。有一種瑞士軍刀不能輸的方法。 [*讓程序本身告訴你答案。*](http://stackoverflow.com/a/378024/23771)這裏是一個[*簡短的例子*](http://stackoverflow.com/a/4299378/23771 )(在Python中,但你會明白)。 – 2014-08-29 00:21:27

+0

只是一個小提示:使用謂詞比快速枚舉慢得多,如下所示:https://www.objc.io/issues/7-foundation/collections/(部分**枚舉和高階消息傳遞**) ,我想你可以簡化這行代碼 如果(!搜索字符串|| searchString.length == 0) 到 如果(!searchString.length) – Duc 2015-12-19 00:26:41

回答

1

是的。忘記文件並將其保存在數據庫中。創建索引一切都變成了一個簡單的SQL語句。