が固定されていると仮定すると(リンクされた両方のレクチャーが行うように)、アルゴリズムの選択により、計算にランタイムとランタイムのどちらがかかるかが決まります。O (n d + k n )O (n d k )kO (n d+ k n )O (n dk )
まず、ランタイムアルゴリズムを考えてみましょう。O (n d+ k n )
- トレーニングセットのすべての観測値に対してを初期化します。iS E L E C T E D私= 0私
- 各トレーニングセットの観測値について、新しい観測値からトレーニングセットの観測値までの距離計算しdは、私はね、T I I私d私のトン私私
- 用に対して:すべてのトレーニングセットの観測を介してループインデックスを選択最小と値とれる。設定して、この監視を選択します。k i d i s t i s e l e c t e d i = 0 s e l e c t e d i = 1j = 1k私d私のトン私S E L E C T E D私= 0S E L E C T E D私= 1
- 選択したインデックスを返しますk
各距離の計算にはランタイムが必要なので、2番目のステップではランタイムが必要です。3番目のステップで反復するたびに、トレーニングセットの観測値をループすることで作業を実行するため、ステップ全体では作業が必要です。最初と4番目のステップでは作業のみが必要なので、ランタイムを取得します。O (n d )O (n )O (n k )O (n )O (n d + k n )O (d)O (n d)O (n )O (n k )O (n )O (n d+ k n )
次に、ランタイムアルゴリズムを考えてみましょう。O (n dk )
- トレーニングセットのすべての観測値に対してを初期化します。iS E L E C T E D私= 0私
- 以下のためににするすべてのトレーニングセットの観測を通じてループを、距離計算:選択されたトレーニングセットの観察と新たな観測の間。最小の値を持つインデックスを選択します。設定して、この監視を選択します。k d i d s e l e c t e d i = 0 s e l e c t e d i = 1j = 1kd私dS E L E C T E D私= 0S E L E C T E D私= 1
- 選択したインデックスを返しますk
2番目のステップの反復ごとに、新しい観測と各トレーニングセットの観測との間の距離を計算します。反復には必要であり、したがって全体で必要です。O (n d k )O (n d)O (n dk )
2つのアルゴリズムの違いは、最初のアルゴリズムが距離を事前計算して保存する(追加メモリが必要)のに対し、2番目のアルゴリズムは距離を事前計算して保存しないことです。ただし、メモリを必要とするトレーニングセット全体と、ストレージを必要とするベクトルを既に保存している、2つのアルゴリズムのストレージは漸近的に同じです。結果として、漸近ランタイムが優れていると、最初のアルゴリズムがより魅力的になります。O (n d )s e l e c t e d O (n )k > 1O (n )O (n d)S E L E C T E DO (n )k > 1
アルゴリズムの改善を使用してランタイムを取得できることは注目に値します。O (n d)
- 各トレーニングセットの観測値について、新しい観測値からトレーニングセットの観測値までの距離計算しdは、私はね、T I I私d私のトン私私
- quickselectアルゴリズムを実行して、ランタイムで最小距離を計算します O (n )kt hO (n )
- 計算された最小距離以下のすべてのインデックスを返しますkt h
このアプローチは、ソートされていない配列で最小値を見つけるための効率的なアプローチが存在するという事実を利用しています。kt h
quickselect
。