1

String オブジェクトの IndexOf() メソッドがどのように機能するのかわかりません。そのため、次の 2 つの実装でどれが他よりも優れているかを知りたいと思います。

最初に、問題について少し紹介したいと思います。単純に、ここで実装された関数/メソッドは、唯一のパラメーターとして文字を持ち、渡された文字に対応する別の文字を発行/返す必要があります。ソースの char コレクションと宛先の char コレクションは以下のとおりです):

a <=> 9
b <=> 8
c <=> 7
d <=> 6
e <=> 5
f <=> 4
g <=> 3
h <=> 2
i <=> 1
j <=> 0

上記のルールは簡単に理解できるように作成されていることに注意してください。これは固定されたルールではなく、任意のルールにすることができるため、そのルールに基づいてこれらのメソッドを別の方法で実装しないでください。

今、私が比較したい2つの方法があります:

1. 最初のものは非常に短く、IndexOf() に基づいています

string source = "abcdefghij";
string destination = "9876543210";
public char SourceToDest(char c){
    return destination[source.IndexOf(c)];//Suppose the c is always in source.
}

2. 2 番目はより長く、switch case を使用します。

public char SourceToDest(char c){
  switch(c){
     case 'a': return '9';
     case 'b': return '8';
     case 'c': return '7';
     case 'd': return '6';
     case 'e': return '5';
     case 'f': return '4';
     case 'g': return '3';
     case 'h': return '2';
     case 'i': return '1';
     case 'j': return '0';
  }
}

前述したように、ルールは簡単に従うように作られていますが、これに気付かない場合は、次のような別の方法があるかもしれません。

public char SourceToDest(char c){
    return (char)(154 - (int)c); //154 = 106 + 48
} 

私が提示した2つの方法の両方よりも優れた別の方法があれば、私と共有してください.

4

3 に答える 3

4

他の方法をより簡単に実行できますが、それでも高速です。

public char SourceToDest(char c)
{
    return (char)((int)'j' - (int)c + (int)'0');
}

別のオプションは次のとおりです。

const string destination = "9876543210";
public char SourceToDest(char c)
{
    return destination[(int)c - (int)'a'];
}

これは、他の 2 つの方法よりも高速です。

于 2013-04-20T17:34:57.173 に答える
2

あなたの場合に使用できSortedDictionary<char, char>ます。で検索はSortedDictionaryですO(log n)。で文字列を検索すると、IndexOfとなるはずですO(n)。特別な最適化が行われているとは思いません (少なくとも、MSDN はそれを教えてくれません)。だからあなたの例は

SortedDictionary<char, char> encoding = new SortedDictionary<char, char>()
                       {
                         { 'a', '9' }, { 'b', '8' } /* ... */ , { 'j', '0' }
                       }

public char SourceToDest(char c){
    return encoding[c];
} 
于 2013-04-20T17:23:54.613 に答える
0

一般に、大きな (r) 文字列長 N の場合、最初は線形検索であるため O(N) になり、2 番目はインデックス付きアクセスとして O(1) になります。

小さい (より) 文字列の長さ N の場合、漸近的なパフォーマンスは定数係数によって圧倒され、意味のある比較を行うには数億回のアクセスを測定する必要があります。しかし、これらの場合でも気にしますか?確かに、アプリケーションで調査するより生産的なパフォーマンス ケースが多数あります。

于 2013-04-20T17:27:00.007 に答える