1

我不知道 String 对象的 IndexOf() 方法是如何工作的,所以我想知道以下 2 个实现中哪个优于另一个:

首先,我想介绍一下这个问题,简单来说,这里实现的函数/方法有一个字符作为唯一参数,它应该给出/返回另一个与传入的字符对应的字符。(匹配规则源字符集合和目标字符集合如下所示):

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

请注意,上述规则只是为了易于遵循而制定的,它不是固定规则,它可以是任何规则,因此不要基于该规则以其他方式实现这些方法。

现在是我想比较的两种方法:

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.第二个较长,使用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
} 

如果您有另一种方法优于我介绍的两种方法,请与我分享。

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'];
}

这将比您的其他两种方法更快。

于 2013-04-20T17:34:57.173 回答
2

你可以SortedDictionary<char, char>在你的情况下使用。搜索SortedDictionaryO(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

一般来说,对于 large(r) 字符串长度 N,第一个将是 O(N),因为它是线性搜索,而第二个将是 O(1) 作为索引访问。

对于较小的(er)字符串长度 N,渐近性能被常数因子所淹没,您必须测量数亿次访问才能获得有意义的比较。但你会在乎这些情况吗?当然,在应用程序中还有几十个更高效的性能案例需要研究。

于 2013-04-20T17:27:00.007 回答