2016-05-12 7 views
2

私はバイナリ検索ツリーを実装していて、最小限の方法を作成しました。私は私が行うことができていますように、私はそれが互換性を持たせることができる方法(または場合)を知りたいと思った:PythonのMin()カスタムクラス(バイナリ検索ツリー)

min(my_tree) 

代わりの

my_tree.minimum() 

私はそれがイテレータを使用している場合、それは次のようになり考えていましたO(lgN)の代わりにO(N)時間。

+1

'min()'は関数であり、カスタムクラスのためにオーバーロードすることはできません。内部実装はBSTの内部構造を利用することができないため、複雑さはO(n)よりも低くなりません。 –

+0

組み込みの[** 'bisect' **](https://docs.python.org/2/library/bisect.html)に気づいていますか? –

+0

@Rogalski 'min'の[**' key' **](https://docs.python.org/2/library/functions.html#min)パラメータは、巧妙なトリックを許可します。 –

答えて

4

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の各メンバーを通過します。あなたはこの振る舞いを無効にすることはできません。私はあなたの現在の使用が、全く不自然であるとは思わないと思います。

+0

私は多分min_iter、max_iterなどを実装していると思っていましたが、Pythonが通常は何かクリーナーを持っているときに非常に混乱しているようでした。 – lorenzocastillo

1

あなたminと呼ばれる独自の関数を記述し、それは本当に可能ではないという事実を隠すためにそれを使用することができます:

min_ = min 
def min(*args, **kwargs): 
    if isinstance(args[0], MyTree): 
     return args[0].minimum() 
    else: 
     return min_(*args, **kwargs) 

しかし、これをしないでください。

関連する問題