2012-02-24 19 views
10

n相当の要素(数字や文字列など)のリストが与えられた場合、i番目の要素を見つける最適なアルゴリズムはO(n)時間かかります。Pythonのi番目の統計量

PythonはネイティブにO(n)のリスト、ディクテーション、セットの時間順序統計を実装していますか?

+0

downvoterとclosevoterからのコメントをいただければ幸いです。 – Randomblue

答えて

7

Pythonが言及したデータ構造のどれも、i番目の順序統計アルゴリズムをネイティブに実装していません。

実際には、その要素の順序については何も仮定していないことを前提にして、辞書やセットにはあまり意味がないかもしれません。リストについては、O(n)の実行時間を提供するselection algorithmを実装するのは難しいことではありません。

4

これはネイティブな解決策ではありませんが、NumPyのpartitionを使用すると、O(n)時間のリストのk番目の統計を見つけることができます。

import numpy as np 
x = [2, 4, 0, 3, 1] 
k = 2 
print('The k-th order statistic is:', np.partition(np.asarray(x), k)[k]) 

EDIT:これは上記ゼロ割り出し、すなわち「ゼロ次統計が」0であると仮定します。

+0

これは正確ではありません。パーティショニング後、最大値を見つける必要があります。このnp.partition(np.asarray(x)、k)[:k] .max() ' – piRSquared

+0

@ piRSquared、ありがとう。私はそれを1インデックスと解釈したと思いますので、今私はそれを明確にしました。 – Garrett

+0

私のポイントは、 'np.partition'はソートされていないということです。それがそのポイントであり、それがなぜより良いのかです。つまり、ソートされていないため、k番目の順序統計がk番目の位置にあるという保証はありません。私はゼロまたは1つのインデックスに基づいていません。私は時にはあなたのソリューションが間違った答えを出すという事実を指しています。無作為にシャッフルされた整数の集合から0次から36までの5次統計量を求めていたとします。私の例では答えは '1'です。' np.random.seed(0); np.partition(np.random.permutation(np.arange(37))、5)[4] '。答えは「4」でなければなりません。 – piRSquared

関連する問題