Count()関数の時間の複雑さを理解しようとしています。
たとえば、_[1, 2, 2, 3]
_のリストがあり、[1, 2, 2, 3].count(2)
が使用されている場合。
私は無限に検索し、Python wiki here を調べましたが、そこにはありませんでした。
私が答えを見つけるのに最も近いのは here ですが、複雑さのフィールドはたまたま空です...誰かが答えを知っていますか?
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__
_関数がないことを確認してください。安全です。
count
メソッドはリスト内のすべてのエントリをチェックする必要があるため、ランタイムはO(n)になります。
needsは、それらをカウントするかどうかを知るために、すべての要素にアクセスする必要があります。それ以上の仕事をする理由はありません。
したがって、それはO(n)よりも優れているとは言えません。最も基本的で単純で簡単な実装でさえO(n)であるため、実際には非常に愚かであるか、非常に悪意のあるものである必要があります。
エルゴは、常識的には、最悪の場合のステップの複雑性はO(n)である可能性が高いです。