2016-05-27 10 views
0

ソートされた文字列があります。この配列には素早く見つかる要素がありますか?ソートされた配列内で素早く要素を見つける

以下の機能を最適化したいと思います。それは時間がかかりすぎている。渡された配列は長くない(約15-20要素)が、それはたくさんの(約1000回)と呼ばれています。現在、私はちょうど実行します.filter { }しかし、これは完全な配列1000回を通過するので、これはボトルネックかもしれないと思いますそのような最初のカレンダーを見つけるときに勃発するのとは対照的である。

組み込みの並べ替え機能に似た、最適化された(つまり、非常に小さな配列と中規模またはそれ以上の異なるアプローチを使用する)組み込み検索がありますか?

基本的には、組み込みの並べ替え/並べ替え機能の対応を探しています。配列を頻繁に並べ替えて特定の要素を見つけ出すので、このようなことをするのは非常に意味があります。

func startsWithACalendarName(text: String, calendars: [EKCalendar], stripKeywords: Bool = false) -> (newReminderText: String, foundCalendar: EKCalendar?) { 
    // make array of words from text 
    let words = text.characters.split{$0 == " "}.map(String.init) 
    // BOTTLENECK? Check if I have a calendar that is equal to first word of text 
    let found = calendars.filter { $0.title.lowercaseString == words.head?.lowercaseString } 
    return (stripKeywords ? (words.tail?.joinWithSeparator(" "))! : text, found.first) 
} 
+0

質問本体に関連した質問のタイトルでどのように? –

+0

申し訳ありませんが、訂正しました。 – Daniel

+1

すでにソートされている場合は、バイナリ検索を使用できます。 –

答えて

0

私はあなたの代わりに、「フィルタ」の「のindexOf」を使用してこの問題を解決することができると思います。

func startsWithACalendarName(text: String, calendars: [EKCalendar], stripKeywords: Bool = false) -> (newReminderText: String, foundCalendar: EKCalendar?) { 
    let words = text.characters.split{$0 == " "}.map(String.init) 
    var found: EKCalendar? 
    if let index = calendars.indexOf ({ $0.title.lowercaseString == words.head?.lowercaseString }) { 
     found = calendars[index] 
    } 
    return (stripKeywords ? (words.tail?.joinWithSeparator(" "))! : text, found) 
} 
+0

しかし、これは配列が既にソートされていることを考慮していますか?ソートされた配列の検索は、ソートされていない配列のインデックスを見つけるよりもかなり高速です。 – Daniel

+0

'filter'を使うよりも良いはずです。この時点で私は両方のランタイムを測定し、それが十分に良いかどうかを調べる小さなテストを行いました。 – orxelm

関連する問題