【发布时间】:2012-05-23 15:34:56
【问题描述】:
我需要计算一个数字中的小数位数(例如:4 表示 1002)。我想以 O(1) 的时间复杂度执行此操作,因为代码应在大量数字上进行迭代,从而显着节省 cpu 时间。
我想出了两个解决方案:
- 在循环中除以 10,直到数字变为零。循环计数是 答案。但是,显然是 O(n) 时间。
log_base_10(num) + 1
问题:log10 是 O(1) 解吗?我在 x86 机器上使用 glibc 运行代码。这是如何在幕后实现的?并且,有没有更好的解决方案?
【问题讨论】:
-
数量上限是多少?还是没有这个限制?
-
解决方案 1 是 O(log n) 而不是 O(n) 并且假设您的号码是
long或int(不是大数字),可能比解决方案 2 更快。 -
您的问题似乎很奇怪。您真的想知道计算复杂度,还是想知道“十进制表示的长度”的最快方法?
-
不要忘记,O 表示法不会告诉您算法需要多长时间,它只会告诉您执行时间如何随不同大小的输入而变化。确定 O(log n) 算法的实现是否实际上比 O(n) 算法的实现更快的唯一方法是使用分析器。
-
如果您的数字是固定大小的,那么大 O 表示法毫无意义。正如@Skizz 指出的那样,对于给定的 n 值,O(log n) 算法必须比 O(n) 算法更快,这并没有隐含的原因。
标签: algorithm x86 numbers glibc