我试图计算count()函数的时间复杂度。
如果有[1, 2, 2, 3]
列表且使用[1, 2, 2, 3].count(2)
,则为例外。
我无休止地搜索并查看了Python wiki here,但它不在那里。
我最接近找到答案的是here,但复杂的领域恰好是空的......有人回答的是什么?
答案 0 :(得分:10)
深入了解CPython源代码并访问Objects/listobject.c
,您将在其中找到count()
方法的源代码。它看起来像这样:
static PyObject *
list_count(PyListObject *self, PyObject *value)
{
Py_ssize_t count = 0;
Py_ssize_t i;
for (i = 0; i < Py_SIZE(self); i++) {
int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ);
if (cmp > 0)
count++;
else if (cmp < 0)
return NULL;
}
return PyLong_FromSsize_t(count);
}
它的作用是简单地迭代列表中的每个PyObject
,如果它们在富比较中相等(参见PEP 207),则计数器递增。该函数只返回此计数器。
最后,list_count
的时间复杂度为O(n)。只需确保您的对象没有具有大量时间复杂性的__eq__
功能,您就会安全。
答案 1 :(得分:2)
因为count
方法必须检查列表中的每个条目,所以运行时将是O(n)。
答案 2 :(得分:1)
需要需要访问所有元素才能知道是否计算它们。它没有理由做更多的工作。
所以,它不可能比O(n)更好,因为即使最基本,简单,直接的实现是O(n),你需要实际上要么是非常愚蠢的,要么是非常恶意的,以使它变得更慢
因此,根据常识,最坏情况下的步骤复杂度很可能是O(n)。