虽然在某种程度上熟悉直观地确定算法的复杂性,但我对如何实际计算算法有些迷惑。
对于以下代码,我知道如何确定复杂性吗?
list = [...]
start = list[0]
end = null
remove list[0] from list
while(list.length > 0) {
for(i = 0; i < list.length; i++) {
if(list[i] is immediately before start or immediately after end) {
link list[i] to start or end (populate end if null)
remove list[i] from list
}
}
}
这假定一个有效的数据集(必须排序的元素的连续链接列表)。出于说明目的也进行了简化;
因此,在最佳情况下,如果列表已排序,则为O(n),因为您只需要通过即可对其进行处理并将其弹出。
我无法确定是最坏的情况,因为每一次“ while”迭代,数据集都会变小至少1个元素(通常为2个或更多),因为它假定数据集将始终有效。因此,它显然小于O(n ^ 2)(我认为)。欢迎所有想法。
谢谢!
更新 绘制出来后,似乎是O(nlogk(n)),其中k = n ^(2 /(n + 1)) 这算作O(nlog(n))吗?我不清楚。
答案 0 :(得分:1)
Big O表示法旨在为函数的增长率提供上限,因此您必须考虑最坏的情况。
在最坏的情况下,我假设在每次迭代中数据集都会变小1个元素,因此您要执行的操作数将受到n + n-1 + n-2 ... + 2 + 1
的约束,而(n+1)*n / 2
等于{% for field in form %}
{{ field|as_crispy_field }}
{% endfor %}
,即O(n ^ 2)