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で遅いなど。