DelphiランタイムライブラリのRTLデータ構造

 

 

 

DelphiランタイムライブラリのRTLデータ構造

同僚、1日1セクション、水が流れます...

シーケンス

        それらのほとんどは、System.ClassesおよびSystem.Generics.Collectionユニットに格納されているため、日常の作業を大幅に簡素化できます。

        これは、データを保存および取得するために特別に設計されたクラスです。

        世界のすべてのデータ構造は、データの変更、データの挿入、データの検索、データの削除という4つの異なるタイプのデータ処理の間のバランスを求めています。一部のデータ構造は一部の分野で優れており、一部は他の分野で優れていますが、この世界には、上記の4つの操作すべてをデータのサイズ(レコードなど)に依存しないようにすることができるデータ構造はありません。このようなデータの増加傾向の下で、上記の4種類のデータ処理は同じ優れたパフォーマンスを達成することが保証されています。

        プログラムを設計するとき、私たちは自分たちのニーズが何であるかを知る必要があります。これは、プログラムの設計に適したデータ構造を選択するのに役立ちます。

       Delphiを使用して、文字列のデータ構造のパフォーマンスを処理できます

       案例:github \ Delphi-High-Performance \ Chapter 1 \ RandomWordSearch.dproj

データ構造 データの操作 BigOの平均時間の複雑さ 最悪の場合 備考
TStringList 直接アクセス O(1)   TStringListには、ソートされていないモードとソートされたモードの2つの動作モードがあります。前者がデフォルトです。
  追加 O(1)/ O(log n)   ソートされていないモードでは、パフォーマンスが向上する可能性があります。そうでない場合、非常に悪くなります。
  インサート O(1)    
  削除 O(1)    
  の指標 O(n)/ O(log n)   二分法:インデックスの位置を見つけます。順序付きモードでは、それが最も適切な二分法です。
  ソート O(n log n)   並べ替えモードでは、パフォーマンスが非常に良くなる可能性があります。そうでない場合は、非常に悪くなります。最初にIndexOfを設定して位置を見つけるためです。
TDictionary 直接アクセス 直接アクセスはできません。要素のトラバースには間接的な方法のみを使用できます。  

1.TDictionaryはこの方法で要素TDictionary [i]にアクセスできません。これは、for indoと同様の方法でのみ要素をトラバースできます。

2. TDictionaryのもう1つの制限:要素が追加される順序が保持されない

  追加 O(1) オン) O(n)は、特別にカスタマイズされたデータセットでのみ発生します。これは、実際のアプリケーションでは簡単に発生しません。
  削除する O(1) オン) O(n)は、特別にカスタマイズされたデータセットでのみ発生します。これは、実際のアプリケーションでは簡単に発生しません。
  TryGetValue O(1) オン)

1.優れたパフォーマンス。O(n)は、特別にカスタマイズされたデータセットでのみ発生します。これは、実際のアプリケーションでは簡単に発生しません。

2. TDictionaryは、常に[ペア]のキーと値を格納します。データ値に関連付けられた特定のキーがない場合は、キーワードのみ(Delphiでは値の部分を無視できません)であるため、値がブール値として定義されるようにコード並べ替えて、常にTrueに設定できます。

  含むキー O(1) オン) 素晴らしい演技。O(n)は、特別にカスタマイズされたデータセットでのみ発生します。これは、実際のアプリケーションでは簡単に発生しません。
  含む値 O(1)   素晴らしい演技
概要       O(n)アルゴリズム(この例のソートされていないリストなど)は、O(log n)アルゴリズム(この例のソートされたリストなど)よりもはるかに低速ですが、O(1)アルゴリズム(この例のTDictionaryディクショナリなど)これは、上記のアルゴリズムの中で最速です。
procedure TfrmRandomWordSearch.LoadWords(wordList: TStringList);
var
  word: string;
begin
  //:将英语单词数据库中的所有单词加载到内部数据结构中。
  //资料来源:https://github.com/dwyl/english-words。
  //数据库版权所有:infochimps
  FWordsUnsorted := TStringList.Create;
  FWordsUnsorted.Assign(wordList);
    //:未排序列表:您将看到,生成一个新单词通常需要几百毫秒到几秒钟。
      //:由于进程是随机的,并且依赖于 CPU 速度

  FWordsSorted := TStringList.Create;
  FWordsSorted.Assign(wordList);
  FWordsSorted.Sorted := True;
    //:排序列表:单词将计算得比“未排序列表”快得多。

  FWordsDictionary
    := TDictionary<string,boolean>.Create(wordList.Count);
  for word in wordList do
    FWordsDictionary.Add(word, True);
    //:而TDictionary方法在100毫秒内就能找到一个新词,
      //:它比“排序列表”和“未排序列表”快得多。
end;

procedure TfrmRandomWordSearch.FindGoodWord(
  const wordTest: TWordCheckDelegate);
var
  word: string;
  isWordOK: boolean;
  time: TStopwatch;
begin
  time := TStopwatch.StartNew;
  repeat
    word := GenerateWord;
    isWordOK := wordTest(word);
  until isWordOK or (time.ElapsedMilliseconds > 10000);
    //:随机提取不同长度的单词(10秒即为超时)
  if isWordOK then
    lbWords.ItemIndex
      := lbWords.Items.Add(
        Format('%s (%d ms)',
          [word, time.ElapsedMilliseconds] )
        )
  else
    lbWords.ItemIndex := lbWords.Items.Add('timeout');
end;

        アルゴリズムとその時間の複雑さは有用ですが、どのような状況でも役に立ちません。最高のアルゴリズムを使用したことがありますが、それでもプログラムは遅すぎます。この場合、プログラムの遅い部分を見つけて、可能な技術を使用してそれらを高速化する必要があります。これを行うには、最初にそれらを見つける必要があります。例:slow、ここで、は遅い、Addで遅い、Sortで遅いなど。

 

 

 

おすすめ

転載: blog.csdn.net/pulledup/article/details/112148706