Python list的count()函数的时间复杂度是多少?

时间:2017-06-28 21:00:40

标签: python python-3.x time-complexity complexity-theory

我试图计算count()函数的时间复杂度。

如果有[1, 2, 2, 3]列表且使用[1, 2, 2, 3].count(2),则为例外。

我无休止地搜索并查看了Python wiki here,但它不在那里。

我最接近找到答案的是here,但复杂的领域恰好是空的......有人回答的是什么?

3 个答案:

答案 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)。