2010-11-28 13 views
4

これは、デルファイの50000個のアイテム(文字列)を含む並べ替えられたリストビューです。同じ接頭辞の単語で項目を高速に検索し、ループをスキップする方法は?私が見つけ速く、ABの接頭辞項目をコピーして、ループをスキップする方法を意味このループをスキップする方法は?

aa..... 
ab cd//from here 
ab kk 
ab li 
ab mn 
ab xy// to here 
ac xz 
... 

:よう

リストです。バイナリ検索でab項目の1つのインデックスが取得されたとします。 ab cdへのabcdのインデックスは、バイナリ検索によって得られる。

ありがとうございました。

編集:すべてのあなたの答えに感謝します。

+0

範囲の最初と最後の要素を見つけるためにバイナリチョップを使用することについて知っているので、すでに自分の質問に答えているようです。正確に何が助けを必要としますか? –

答えて

6

あなたが速い何かをしたい場合は、ドン」あなたのデータをTListViewに保存しないでください。

TStringListを使用してリストを保存し、仮想モードでTListViewを使用します。

TStringList.Items []からの読み取りは、TListView.Items []プロパティからの読み取りよりも何倍も高速です。

procedure Extract(List, Dest: TStrings; Char1, Char2: char); 
var i,j: integer; 
    V: cardinal; 
type PC = {$ifdef UNICODE}PCardinal{$else}PWord{$endif}; 
begin 
    V := ord(Char1)+ord(Char2) shl (8*sizeof(char)); 
    Dest.BeginUpdate; 
    Dest.Clear; 
    for i := 0 to List.Count-1 do begin 
    if PC(pointer(List[i]))^=V then begin 
    for j := i to List.Count-1 do begin 
     Dest.Add(List[j]); 
     if PC(pointer(List[j]))^<>V then 
     break; // end the for j := loop 
    end; 
    break; // end the for i := loop 
    end; 
    Dest.EndUpdate; 
end; 

あなたも、より速くそれを得るためにバイナリ検索を使用することができます:あなたはボイドの項目がリストに存在しないことを確認している場合

が、これは使用しています。しかし、PWord()のトリックでは、50000項目のリストに気づかないでしょう。

比較中に一時的な文字列が作成されないため、PC(pointer(List [i]))^ = Vはcopy(List [i]、1,2)= Char1 + Char2の方が高速です。しかし、List [i] = ''がない場合、つまりポインタ(List [i])= nilがない場合にのみ機能します。

このコードをすべてのバージョンのDelphi(Delphi 2009の前後)でコンパイルするには、{$ ifdef UNICODE}とsizeof(char)を追加しました。

+0

親愛なるA.Bouchez:とても詳細で分かりやすい答えをありがとうございました。 – Dylan

4

ループの実行を停止するには、breakコマンドを使用します。 Exitは、特にネストされた複数のループがエスケープする場合に、関数全体を終了する場合にも便利です。最後の手段として、gotoを使用して複数のネストされたループから飛び出し、同じ機能で実行を継続できます。

あなたの代わりにforループのwhileまたはrepeatループを使用している場合、あなたはミッドループを設定することをお使いの停止状態で、別の論理積を含めることができます。

i := 0; 
found := False; 
while (i < count) and not found do begin 
    // search for items 
    found := True; 
    // more stuff 
    Inc(i); 
end; 
+0

親愛なるロブ・ケネディ:あなたの迅速で分かりやすい答えをもう一度ありがとう。発見されたフラグを追加せず、 'for ... loop'を使用したため、パフォーマンスが低下しました。 – Dylan

関連する問題