我使用C++中的所有可打印字符进行替换来编码经典密码,我想知道哪个更快?在一个数组中搜索(编辑:一个非关联的,只是像letters[] = {'a', 'b', ...);
(线性或二进制)或switch语句?编译器可以优化开关,不是吗?也许不同是内存使用?我的选择是开关,虽然代码更大,但也许我错过了一些东西。搜索数组或开关?对于通过替换的密码
(也许这个问题似乎是主观的,但我认为会客观的原因选择一种或另一种方式。 )
我使用C++中的所有可打印字符进行替换来编码经典密码,我想知道哪个更快?在一个数组中搜索(编辑:一个非关联的,只是像letters[] = {'a', 'b', ...);
(线性或二进制)或switch语句?编译器可以优化开关,不是吗?也许不同是内存使用?我的选择是开关,虽然代码更大,但也许我错过了一些东西。搜索数组或开关?对于通过替换的密码
(也许这个问题似乎是主观的,但我认为会客观的原因选择一种或另一种方式。 )
确实有一个机会,一个足够聪明的编译器可以优化切换为查找,这比二进制搜索更快。但你可以自己做这种优化,并得到短代码:
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'];
为什么你需要搜索?只需要一个由你的ASCII字符索引的128条数组,这基本上就是编译器用你的开关做的事情(你可以减去32并使用一个96条数组,非printables使用的空间。)
+1,我写的完全一样(: – 2011-06-04 14:36:00
)你有没有看过为汇编语句生成的程序集?编译器不使用数组来实现开关,它们使用偏移跳转 – 2011-06-04 14:37:37
@Vlad:GCC有时也使用二叉树 – 2011-06-04 14:43:22
哪一个更快取决于很多因素:编译器的优化(您必须查看程序集以了解它的作用)以及如何设置阵列。
如果性能非常重要,而且两个解决方案的实现都相当简单,那么我会实施它们并在尽可能真实的设置中对它们进行基准测试,以确定哪个解决方案更快。
为什么你需要搜索一个数组?没有太多的ASCII字符。将替换存储在一个表中,并且查找由单个数组查找组成。 – sigfpe 2011-06-04 14:34:31
@ user207442我没有使用关联数组,因为我们还没有在课上研究它们。 – Tae 2011-06-04 20:43:27