私はバイナリ検索ツリーを実装していて、最小限の方法を作成しました。私は私が行うことができていますように、私はそれが互換性を持たせることができる方法(または場合)を知りたいと思った:PythonのMin()カスタムクラス(バイナリ検索ツリー)
min(my_tree)
代わりの
my_tree.minimum()
私はそれがイテレータを使用している場合、それは次のようになり考えていましたO(lgN)の代わりにO(N)時間。
私はバイナリ検索ツリーを実装していて、最小限の方法を作成しました。私は私が行うことができていますように、私はそれが互換性を持たせることができる方法(または場合)を知りたいと思った:PythonのMin()カスタムクラス(バイナリ検索ツリー)
min(my_tree)
代わりの
my_tree.minimum()
私はそれがイテレータを使用している場合、それは次のようになり考えていましたO(lgN)の代わりにO(N)時間。
CPythonでmin
の実装はここにhereが見つかりました。関連コードは以下で繰り返されます。このことから
static PyObject *
min_max(PyObject *args, PyObject *kwds, int op)
{
/* omitted code */
it = PyObject_GetIter(v);
/* omitted code */
maxitem = NULL; /* the result */
maxval = NULL; /* the value associated with the result */
while ((item = PyIter_Next(it))) {
/* get the value from the key function */
if (keyfunc != NULL) {
val = PyObject_CallFunctionObjArgs(keyfunc, item, NULL);
if (val == NULL)
goto Fail_it_item;
}
/* no key function; the value is the item */
else {
val = item;
Py_INCREF(val);
}
/* maximum value and item are unset; set them */
if (maxval == NULL) {
maxitem = item;
maxval = val;
}
/* more omitted code */
}
}
static PyObject *
builtin_min(PyObject *self, PyObject *args, PyObject *kwds)
{
return min_max(args, kwds, Py_LT);
}
は、
min
を使用すると、O(n)が何であることを行っていることがわかります。 iterableの各メンバーを通過します。あなたはこの振る舞いを無効にすることはできません。私はあなたの現在の使用が、全く不自然であるとは思わないと思います。
私は多分min_iter、max_iterなどを実装していると思っていましたが、Pythonが通常は何かクリーナーを持っているときに非常に混乱しているようでした。 – lorenzocastillo
あなたはmin
と呼ばれる独自の関数を記述し、それは本当に可能ではないという事実を隠すためにそれを使用することができます:
min_ = min
def min(*args, **kwargs):
if isinstance(args[0], MyTree):
return args[0].minimum()
else:
return min_(*args, **kwargs)
しかし、これをしないでください。
'min()'は関数であり、カスタムクラスのためにオーバーロードすることはできません。内部実装はBSTの内部構造を利用することができないため、複雑さはO(n)よりも低くなりません。 –
組み込みの[** 'bisect' **](https://docs.python.org/2/library/bisect.html)に気づいていますか? –
@Rogalski 'min'の[**' key' **](https://docs.python.org/2/library/functions.html#min)パラメータは、巧妙なトリックを許可します。 –