哪个比另一个更好?(与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
}
如果你有其他方法比我介绍的两种方法都好,请与我分享。
标题>标题>您可以使其他方法更容易遵循,并且仍然是快速的:
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,渐近性能被常数因子淹没,您必须测量数亿次访问才能获得有意义的比较。但在这种情况下,你会在意吗?当然,在应用程序中还有许多更高效的性能案例需要研究。