我正在为一个介绍数据挖掘课程的工作。我想弄清楚算法的时间复杂度(见下文)?是线性/指数/对数/二次/多项式?关于如何处理这样的问题的任何提示都将非常感激
考虑以下算法来查找第三个最小元素 一个数组:
n, a[1..n]
- 数组a,n是其大小,n> = 3 b[1..3], t, i
代码:
b[1] = a[1]
b[2] = a[2]
if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
b[3] = a[3]
if b[2] > b[3] then t=b[2]; b[2]=b[3]; b[3]=t
if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
for (i = 4; i <= n; i = i+1)
if a[i] < b[3] then b[3] = a[i]
if b[2] > b[3] then t=b[2]; b[2]=b[3]; b[3]=t
if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
return b[3]
答案 0 :(得分:5)
一个好的经验法则是:你在输入上循环多少次?
答案 1 :(得分:2)
它是线性的,因为唯一的内部循环最多重复n次,并且只执行恒定的时间操作。
更具体地说
1. b[1] = a[1]
2. b[2] = a[2]
3. if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
4. b[3] = a[3]
5. if b[2] > b[3] then t=b[2]; b[2]=b[3]; b[3]=t
6. if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
7. for (i = 4; i <= n; i = i+1)
8. | if a[i] < b[3] then
9. | | b[3] = a[i]
10. | | if b[2] > b[3] then t=b[2]; b[2]=b[3]; b[3]=t
11. | | if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
12. return b[3]
第1-6行只执行一次,应该是恒定时间。在单次运行for循环的上下文中,第8-11行只执行一次,并且都是常量时间操作;然后重复~n-3次。
答案 2 :(得分:0)
这是O(n),看看输入是什么总是好的,看看在这种情况下你是否要向数组添加另一个元素会有什么变化。
你会发现你必须扫描数组才能找到数组中第3个最小的元素。
答案 3 :(得分:0)
时间复杂度是线性的,为O(n)。从4到n,仅执行一次迭代。因此时间复杂度为O(n)