2015-04-05 99 views
1

这个问题没有特别针对任何编程语言,当然我很高兴听到一些例子。什么是结合switch/if语句的最有效方式

想象一下大量的文件,比如说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,...,我们也可以为此创建另一个开关,然后指向这样的'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; 
    // [...] 

    } 

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

编辑:不要引用我对那个“5000”,我不在上面描述的情况,我想谈论这个完全理论,它也可能是3条或300'000,甚至更少或更多

+0

您正在寻找某种查找结构(hashmap,排序列表,搜索树,无论),而不是'switch'语句。 – Bergi 2015-04-05 20:50:56

回答

1

如果你有5000个选项,你可能比使用硬编码的if/switch语句散列它们更好。在C++中,也可以使用std :: map将函数指针或其他选项处理信息与每个可能的选项配对。

1

有趣,但我不认为你可以给出一个通用的答案。这完全取决于代码的执行方式。许多编译器将进行各种优化,在ifswitch中,但也以字符串进行比较的方式进行优化。这就是说,如果你有这些列表的实际(磁盘)文件,那么读取文件可能需要比处理它长得多的时间,因为与存储器访问和CPU处理相比,磁盘I/O非常慢。

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

1

有没有计算机科学处理这方面的任何领域?

是的,高效科学data structures。那么,CS不是那么重要? :-)

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

1

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

基本上你有一组值(这里的字符串像“gd322”,“g344d”),并且你想知道其他值是否在其中。

这个想法是把字符串放在一个大数组中,在一个由它们的值通过某个函数计算出来的索引处。给定一个值v,你将以同样的方式计算一个索引,并检查值v是否在这里。比检查整个阵列快得多。

当然,在不同的值落在相同的地方有一个问题:冲突。需要一些魔力:完美哈希函数其系数被调整,所以来自初始集的值不会导致任何冲突。

相关问题