2011-06-04 29 views
3

我使用C++中的所有可打印字符进行替换来编码经典密码,我想知道哪个更快?在一个数组中搜索(编辑:一个非关联的,只是像letters[] = {'a', 'b', ...);(线性或二进制)或switch语句?编译器可以优化开关,不是吗?也许不同是内存使用?我的选择是开关,虽然代码更大,但也许我错过了一些东西。搜索数组或开关?对于通过替换的密码

(也许这个问题似乎是主观的,但我认为会客观的原因选择一种或另一种方式。 )

+1

为什么你需要搜索一个数组?没有太多的ASCII字符。将替换存储在一个表中,并且查找由单个数组查找组成。 – sigfpe 2011-06-04 14:34:31

+0

@ user207442我没有使用关联数组,因为我们还没有在课上研究它们。 – Tae 2011-06-04 20:43:27

回答

1

确实有一个机会,一个足够聪明的编译器可以优化切换为查找,这比二进制搜索更快。但你可以自己做这种优化,并得到短代码:

char alphabet[] = { 
    'Z', 'E', 'B', 'R', 'A', 'S', 'C', 'D', 'F', 'G', 'H', 'I', 'J', 
    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'T', 'U', 'V', 'W', 'X', 'Y' 
}; 
// now you can get the ciphertext for a single uppercase character with: 
alphabet[ch - 'A']; 
+0

I在字母表中输入[ch - 'A']部分;你能帮我提供一点背景知识吗? – Tae 2011-06-04 20:03:58

+0

是的,它和你的角色的ASCII代码索引的数组基本相同。 A到Z的ASCII码是连续的,显然A' - A'是0.所以B' - 'A'是1,一直到'Z' - 'A'都是25.所以这是一种索引数组的方法只包含大写字母。 – 2011-06-04 20:05:58

+0

哦,对。我忘了提及,我们没有在课堂上研究关联数组。 – Tae 2011-06-04 20:34:40

6

为什么你需要搜索?只需要一个由你的ASCII字符索引的128条数组,这基本上就是编译器用你的开关做的事情(你可以减去32并使用一个96条数组,非printables使用的空间。)

+0

+1,我写的完全一样(: – 2011-06-04 14:36:00

+1

)你有没有看过为汇编语句生成的程序集?编译器不使用数组来实现开关,它们使用偏移跳转 – 2011-06-04 14:37:37

+0

@Vlad:GCC有时也使用二叉树 – 2011-06-04 14:43:22

2

哪一个更快取决于很多因素:编译器的优化(您必须查看程序集以了解它的作用)以及如何设置阵列。

如果性能非常重要,而且两个解决方案的实现都相当简单,那么我会实施它们并在尽可能真实的设置中对它们进行基准测试,以确定哪个解决方案更快。