2

まず第一に、これはパターンマッチングを目的としているので、完全に異なる解決策がある可能性があるので、それについて聞きたいので、それを覚えておいてください。

私はこの一連のデータを持っています(今のところそれをmystringと呼びましょう)。

string a = get_starting_letters(mystring)
string b = get_ending_letters(mystring)
bool c = check_code_appears(mystring)
.
.
.
and so on

このように機能する辞書/真理値表が欲しいのですが(*はワイルドカードを示します)。

key  (a,b,c...)               value

"abc", *, True     =   "type a string"
"abc", "xyz", True =   "type b string"
*, "xyz", True     =   "type m string"

これをC#でどのように実装できますか?これはF#ではかなり些細なことですが、このコードは将来、C#しか知らない人によって更新される可能性があります。

なぜ私はこれをしているのですか?現在のコードは追跡と更新が難しくなり(ネストされたif、else、else ifが多すぎる)、これまでに説明されている「タイプ」は2つだけです(2、3か月で2倍になります)。

私が考えていた他の解決策:条件によってチェックされるさまざまな可能な変数を記述する一種のツリー/構造:

                      b = "xyz"
           a = "abc" <
mystring <            b = "xxx"
           a = "cda" <
                      b = *

ただし、オーバーヘッドが大きく、速度が重要であるように見えます。さらに、ツリーはバイナリではなく、ワイルドカードも処理する必要があります。

4

1 に答える 1

1

特定のタプルが特定のタイプと一致するかどうかを確認できるようにするために必要なすべての場合は、次のような通常の辞書を使用できます。

Dictionary<string, Tuple<string, string, bool>> lookup = new Dictionary<string, Tuple<string, string, bool>>();

//add some values
lookup["type a string"] = new Tuple<string, string, bool>("abc", null, true);
lookup["type b string"] = new Tuple<string, string, bool>("abc", "xyz", true);
lookup["type m string"] = new Tuple<string, string, bool>(null, "xyz", true);

次に、一致をチェックしているタイプを調べて、値が等しいかどうか(またはタプルにnull値があるかどうか)を確認します。

どのタイプが文字列と一致しているかを判断できる必要がある場合(そして既知のタイプを繰り返し処理したくない場合)、明らかにこのアプローチは機能しません...しかし、何らかの種類を確立する必要があります優先ルールの...

更新:1つのアプローチは、SQLを使用し、いくつかのインデックスを追加することです(独自のBツリーベースのインデックスを作成したくない場合)。ええ、それはディスクベースですが、それを頻繁に参照する場合、テーブルはおそらくキャッシュされます。そうでない場合、パフォーマンスについて心配する理由は実際にはありません。

より簡単なアイデアは、ソートされたセットを使用することです。メモリ効率はそれほど高くありませんが、ルールの設定方法によっては十分に高速である可能性があります。タイプ文字列を含む、各フィールドの可能な値ごとにセットを作成します。たとえば、「typeastring」と「typebstring」の2つのメンバーを持つa="abc"のセットと、単一のメンバーを持つa=*のセットがあります。 「m文字列」と入力します。

a = "abc"、b = "xxx"、およびc = trueの文字列に一致する値を見つけようとした場合は、a="abc"とa=*のセットの共通部分を使用します。それをb="xxx"とb=の和集合と交差させ、次にc=trueとc=の和集合と交差させます。これで、キーに一致する一連の値が得られます。

O([a = "abc"] + [a = *] + [b = "xxx"] + [b = *] + [c = true] + [c = *])= O(n )

確かに、一致をチェックするためにすべてのルールを反復処理するだけでO(n)になりますが、ここではnのサイズを大幅に削減しています。

于 2012-08-16T01:33:45.460 に答える