哪个比另一个更好?(与string相关)

本文关键字:string 相关 另一个 更好 | 更新日期: 2023-09-27 18:10:20

我不知道字符串对象的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。第二个比较长,使用了切换大小写:
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
} 

如果你有其他方法比我介绍的两种方法都好,请与我分享。

哪个比另一个更好?(与string相关)

您可以使其他方法更容易遵循,并且仍然是快速的:

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

这将比你的其他两个方法更快。

您可以在您的情况下使用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];
} 

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

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