我最近参加了算法和数据结构考试。 其中一个问题是为计算二次方程根的算法创建一个步骤列表和流程图。我还负责提供所提供算法的 Big O 复杂度。
基本上,我的算法就像 here 提出的算法:
Step 1. Start
Step 2. Read the coefficients of the equation, a, b and c from the user.
Step 3. Calculate discriminant = (b * b) – (4 * a * c)
Step 4. If discriminant > 0:
4.1: Calculate root1 = ( -b + sqrt(discriminant)) / (2 * a)
4.2: Calculate root2 = ( -b - sqrt(discriminant)) / (2 * a)
4.3: Display “Roots are real and different”
4.4: Display root1 and root2
Step 5: Else if discriminant = 0:
5.1: Calculate root1 = -b / (2 *a)
5.2: root2 = root1
5.3: Display “Root are real and equal”
5.4: Display root1 and root2
Step 6. Else:
6.1: Calculate real = -b / (2 * a)
6.2:Calculate imaginary = sqrt(-discriminant) / (2 * a)
6.3: Display “Roots are imaginary”
6.4: Display real, “±” , imaginary, “i”
Step 7. Stop
作为对复杂性问题的回答,我提交了 O(1),因为找到根总是需要固定数量的步骤。但是,教授给我反馈说答案不正确,但没有提供正确的答案。
我找不到这个问题的任何答案,所以我需要帮助。 这种算法的复杂度是多少?
答案 0 :(得分:1)
我们算法的时间复杂度应该是log(n)
,这是因为对于大多数square root
(取平方根)是log(n)
。所以时间复杂度是 log(n)
其中 n 是您正在使用的 suqare 根数
答案 1 :(得分:1)
CPU/FPU 原生数据类型上的计算本身是 O(1)
但是如果涉及大数,则不再是这种情况,因为大多数算术运算不再是 O(1)
并且在实现上有所不同,例如 {{ 1}} 是 +,-
,乘法是 O(n)
或“稍微”更快,具体取决于使用的算法,其中 O(n^2)
是使用的位数。 但是我怀疑是不是这种情况。
因为你的算法包含更多的东西,所以只是计算方程你也需要考虑这一点,这很可能是你的讲师想到的差异。
您知道从用户获取输入不是 n
也不是将字符串转换为数字......打印也是如此(将数字转换为文本,并打印字符串)
所以我敢打赌 正确答案应该是 O(1)
其中 O(n)
是您的代码用于输入和输出的最大(或总和)位数/字符数.. . 同样,如果涉及大数字,情况会更糟,除非您使用与数字表示兼容的数字系统进行打印...
因此您必须考虑步骤 #2 和每个 n
...