Fra*_*rth 40 algorithm big-o programming-languages switch-statement
假设您有n个案例,我想知道switch语句的最坏情况运行时复杂性是什么.
我一直认为它是O(n).不过,我不知道编译器是否能做任何聪明的事情.如果答案是特定于实现的,我想知道以下语言:
lij*_*jie 35
最糟糕的是O(n).有时(这是语言和编译器相关),它转换为跳转表查找(对于没有太大的案例范围的"漂亮"开关).那就是O(1).
如果编译器想要时髦,我可以想到可以将复杂性实现为介于两者之间的任何方式(例如,对案例执行二进制搜索,对于logn).但在实践中,你将获得更长的线性时间或恒定时间.
Mar*_*ers 15
switch语句的大O复杂性并不是真正重要的一点.Big-O表示法指的是随着n向无穷大增加的表现.如果你的switch语句足够大,渐近性能是一个问题,那么它太大了,应该重构.
除了可读性问题之外,在Java和C#中,我认为您很快就会对单个方法的最大大小达到一些内部限制.
对于经常调用的相对较小的switch语句,可能更有助于衡量switch语句的实际性能,而不是可以使用的其他方法.可以通过在循环中重复执行该操作来进行该测量.
对于较大的switch语句,我建议重构使用具有大约O(1)性能的字典或类似数据结构,即使n非常大,也不会遇到有限方法大小的问题.
最坏的情况可能是 O(n),但至少对于像 C/C++、Java 和 C# 这样的语言,这些情况是编译时常量,通常可以使用跳转表(而且经常使用)来获得复杂性为 O(1)。
我不知道像 PHP 或 Javascript 这样的动态语言是否会尝试设置跳转表。