Performance 什么';这是组合switch/if语句最有效的方法

Performance 什么';这是组合switch/if语句最有效的方法,performance,switch-statement,Performance,Switch Statement,这个问题并没有特别针对任何编程语言,但我当然很高兴听到一些例子 想象一下有很多文件,比如说5000个,里面有各种各样的字母和数字。然后,有一个方法接收作为别名的用户输入,以显示该文件。如果不在文件夹中对文件进行排序,则该方法需要返回与用户提供的别名关联的文件名 假设用户输入“gd322”代表名为“k4e23”的文件,方法如下 if(input.equals("gd322")){ return "k4e23"; }

这个问题并没有特别针对任何编程语言,但我当然很高兴听到一些例子

想象一下有很多文件,比如说5000个,里面有各种各样的字母和数字。然后,有一个方法接收作为别名的用户输入,以显示该文件。如果不在文件夹中对文件进行排序,则该方法需要返回与用户提供的别名关联的文件名

假设用户输入“gd322”代表名为“k4e23”的文件,方法如下

  if(input.equals("gd322")){
            return "k4e23";
                           }
现在,想象一下在该方法中有4个值:

switch(input){ 
case gd322: return fw332;
case g344d: return 5g4gh;
case s3red: return 536fg;
case h563d: return h425d;
  } //switch on string, no break, no string indicators, ..., pls ignore the syntax, it's just pseudo
请记住,我们有5000个条目,可能不止2个条目以g开头。现在,如果用户输入以“s”开始,而不是浪费CPU周期检查所有的a、b、c等等,我们还可以对此进行另一个切换,然后指向“下一个”方法,如下所示:

 switch(input[0]){ //implying we could access strings like that 
    case a: switchA(input);
    case b: switchB(input);
// [...]
    case g: switchG(input);
    case s: switchS(input);
      }
switchG(String input){

 switch(input){
   case gd322: return fw332;
   case g344d: return 5g4gh;
  // [...]

  }
因此,CPU不必检查所有这些方法,而是调用如下方法:

 switch(input[0]){ //implying we could access strings like that 
    case a: switchA(input);
    case b: switchB(input);
// [...]
    case g: switchG(input);
    case s: switchS(input);
      }
switchG(String input){

 switch(input){
   case gd322: return fw332;
   case g344d: return 5g4gh;
  // [...]

  }
有计算机科学领域处理这个问题吗?我不知道如何称呼它,因此也不知道如何寻找它,但我认为我的想法在很大程度上是有意义的。请移动线,如果它不属于这里,但我真的想看看你的想法


编辑:不要在“5000”一词上引用我的话,我不是在上面描述的情况下,我想说的是完全理论化的,它也可能是3个条目或30万个条目,甚至可能更少或更多如果你有5000个选项,你可能最好对它们进行哈希运算,而不是使用硬编码的If/switch语句。在C++中,你也可以使用STD::MAP来配对函数指针或其他选项处理信息,每个选项都有可能。

< P>如果你有5000个选项,你最好把它们散列在一起,而不是硬编码I/Switter语句。在C++中,你也可以使用STD::MAP来配对函数指针或其他选项处理信息,每个选项都可以。

< P>有趣,但我认为你不能给出一个通用的答案。这完全取决于代码的执行方式。许多编译器将进行各种优化,包括
if
开关
,以及字符串的比较方式

也就是说,如果您有包含这些列表的实际(磁盘)文件,那么读取该文件可能比处理该文件要花费更长的时间,因为与内存访问和CPU处理相比,磁盘I/O非常慢


如果你有一个这样的列表,你可能想要建立一个哈希表,或者仅仅是一个排序的列表/数组,你可以在其中执行二进制搜索。排序也需要时间,但如果你必须在同一个列表中进行多次查找,那么花时间可能是值得的。

很有趣,但我认为你不能给出一般性的答案。这完全取决于代码的执行方式。许多编译器将进行各种优化,包括
if
开关
,以及字符串的比较方式

也就是说,如果您有包含这些列表的实际(磁盘)文件,那么读取该文件可能比处理该文件要花费更长的时间,因为与内存访问和CPU处理相比,磁盘I/O非常慢

如果你有一个这样的列表,你可能想要建立一个哈希表,或者仅仅是一个排序的列表/数组,你可以在其中执行二进制搜索。排序也需要时间,但是如果您必须在同一个列表中进行多次查找,那么这可能是值得的

有计算机科学领域处理这个问题吗

是的,效率的科学。嗯,这不是CS的全部吗?:-)

您描述的算法类似于。它不会在源代码中使用
switch
语句进行静态编码,而是在从某处加载的结构中使用动态查找,但其思想是相同的

有计算机科学领域处理这个问题吗

是的,效率的科学。嗯,这不是CS的全部吗?:-)


您描述的算法类似于。它不会用
switch
语句在源代码中进行静态编码,而是在从某处加载的结构中使用动态查找,但其思想是相同的。

是的,几十年来,这个问题就已经知道并解决了散列函数。

基本上,您有一组值(这里是“gd322”、“g344d”等字符串),您想知道是否还有其他值v在其中

其思想是将字符串放在一个大数组中,在一个由某个函数根据其值计算的索引处。给定一个值v,您将以相同的方式计算索引,并检查值v是否在这里。比检查整个阵列快得多


当然,不同的值落在同一个位置时会出现问题:碰撞。然后需要一些魔法:完美散列函数其系数经过调整,因此来自初始集的值不会引起任何冲突。

是的,这个问题几十年来就已经知道并解决了散列函数。

基本上,您有一组值(这里是“gd322”、“g344d”等字符串),您想知道是否还有其他值v在其中

其思想是将字符串放在一个大数组中,在一个由某个函数根据其值计算的索引处。给定一个值v,您将以相同的方式计算索引,并检查值v是否在这里。比检查整个阵列快得多


当然,不同的值落在同一个位置时会出现问题:碰撞。然后需要一些魔法:完美的哈希函数其系数经过调整,因此初始集的值不会引起任何冲突。

您正在寻找某种查找结构(哈希映射、排序列表、搜索树等),而不是
开关
语句。您正在寻找某种类型的