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

时间:2015-04-05 20:36:00

标签: performance switch-statement

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

想象一下大量的文件,让我们说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开头的条目。现在,如果用户输入以'开头,而不是浪费CPU周期检查所有的a,b,c,...,...,我们也可以为此制作另一个开关,然后指向' next'像这样的方法:

 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);
      }

所以CPU不必检查所有这些,而是​​调用这样的方法:

switchG(String input){

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

  }

有没有计算机科学领域处理这个问题?我不知道如何调用它,因此不知道如何搜索它,但我认为我的想法是大规模的。如果它不属于这里,请移动线程,但我真的想看到你的想法。

编辑:不要引用我的#34; 5000",我不是上述情况,我想谈论这个完全理论,它也可能是3个条目或300&# 39,000,甚至可能更少或更多

4 个答案:

答案 0 :(得分:1)

如果您有5000个选项,那么最好不要使用硬编码if / switch语句来散列它们。在c ++中,您还可以使用std :: map将函数指针或其他选项处理信息与每个可能的选项配对。

答案 1 :(得分:1)

有趣,但我不认为你可以给出一个通用的答案。这一切都取决于代码的执行方式。许多编译器将在ifswitch中进行各种优化,但也会对字符串进行比较。

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

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

答案 2 :(得分:1)

  

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

是的,有效的科学data structures。好吧,这不是CS的全部意义吗? : - )

您描述的算法类似于trie。它不会在源代码中使用switch语句进行静态编码,但会在从某个地方加载的结构中使用动态查找,但这个想法是一样的。

答案 3 :(得分:1)

是的,这个问题已经存在并且已经解决了几十年。 哈希函数。

基本上你有一组值(这里的字符串类似于" gd322"," g344d")你想知道其中是否有其他值v。

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

当然,在同一个地方出现不同值的问题:碰撞。然后需要一些魔法:完美哈希函数其系数被调整,因此来自初始集的值不会导致任何冲突。