離散のための一般的なヒント - ディスクリート

   転載:https://www.cnblogs.com/sun-of-Ice/p/9419857.html

一般的なヒント - ディスクリート

 

「ディスクリート、無限の空間は、アルゴリズムの効率を向上させるために限られた空間、時間と空間に限られた個人にマッピングされます。」

つのアレイと達成純粋のアレイをマーキングこのようなツリーのような多くのアルゴリズムに関連するデータの最大値の複雑。しばしばそのような場合:そこに含まれるデータの範囲が非常に大きいまたは負であるが、データ自体のロット番号がない(データ範囲よりもはるかに小さいです)。この場合、各データ要素の具体的な値は重要でない場合、重要なのは、それらの間の関係の大きさであり、我々は、これらの離散的なデータで開始することができる可能な限り小さく、データの最大値を、それを確実にするためにすべてのデータは正です。

-611,55、102131511,123,9813186:例えば、5の長い列があります。5,3,4,1,2:それはなるようなアルゴリズムの多くは、トラブルをもたらすでしょう実現するために、非常に大きな数と負のを、持っている、我々は、ディスクリートのこのシーケンスを置くことができます。様々な要素間の関係のサイズの変更はありませんが、突然、非常に快適になったデータの範囲。

離散化の原理とは、非常に単純です。2負と離散ほどの小さいデータ項目間のデータの離散非大小関係を確保するために、1:間違いとは、可能な限り効率的に、我々は以下の個別の機能を実現したいと考えていないことを確実にするために、変わらず、同じまま元に等しくなければなりません。したがって、小から大へのアイテムを見つけるために、オリジナルの離散シーケンスの最初の数行の鍵です。

以下の方法のO(nlong)時間計算完全な離散化することにより、N系列長です。

  1. 昇順ように、元のシーケンスをソートします。
  2. 重複配列要素を削除します。
  3. このとき、各離散位置の配列および位置のシーケンス番号値がマッピングされています。

例えば:配列105,35,35,79、-7、およびデエンファシスするため、79、35> 2を対応関係-7-> 1を得ることが、ソート-7,35,79,105なります - > 3、> 4 105〜108。

INT N-、A [MAXN]、T [MAXN];
 // 添字開始シーケンスは、一般的に0からとすることができる
ためには、int型 I = 1 ; I <= N; I ++は
{
    scanf関数(" %のD "、および[I])。
    Tは、[I] = A [I]; // Tが離散のマッピング関係を得るための一時的な配列である
}
 // 以下は、UNIQUE(デエンファシス)、LOWER_BOUND(ルックアップ)、STLの並べ替え(ソート)を使用し関数 
ソート(Tの+ 1、+ N-Tの+ 1); // ソート
INT M = UNIQUE(Tの+ 1、T + 1 + N-) - T - 1。 ; // 重量、長さmと重複除外取得します
以下のためのint型 I = 1。 ; I <= N-; I ++は
{
    [I] = LOWER_BOUND(Tの+ 1、T + 1 + M、A [I]) - T; // 二つの点、迅速要素と関連マッピングによって検索 
}

 

「ディスクリート、無限の空間は、アルゴリズムの効率を向上させるために限られた空間、時間と空間に限られた個人にマッピングされます。」

つのアレイと達成純粋のアレイをマーキングこのようなツリーのような多くのアルゴリズムに関連するデータの最大値の複雑。しばしばそのような場合:そこに含まれるデータの範囲が非常に大きいまたは負であるが、データ自体のロット番号がない(データ範囲よりもはるかに小さいです)。この場合、各データ要素の具体的な値は重要でない場合、重要なのは、それらの間の関係の大きさであり、我々は、これらの離散的なデータで開始することができる可能な限り小さく、データの最大値を、それを確実にするためにすべてのデータは正です。

-611,55、102131511,123,9813186:例えば、5の長い列があります。5,3,4,1,2:それはなるようなアルゴリズムの多くは、トラブルをもたらすでしょう実現するために、非常に大きな数と負のを、持っている、我々は、ディスクリートのこのシーケンスを置くことができます。様々な要素間の関係のサイズの変更はありませんが、突然、非常に快適になったデータの範囲。

離散化の原理とは、非常に単純です。2負と離散ほどの小さいデータ項目間のデータの離散非大小関係を確保するために、1:間違いとは、可能な限り効率的に、我々は以下の個別の機能を実現したいと考えていないことを確実にするために、変わらず、同じまま元に等しくなければなりません。したがって、小から大へのアイテムを見つけるために、オリジナルの離散シーケンスの最初の数行の鍵です。

以下の方法のO(nlong)時間計算完全な離散化することにより、N系列長です。

  1. 昇順ように、元のシーケンスをソートします。
  2. 重複配列要素を削除します。
  3. このとき、各離散位置の配列および位置のシーケンス番号値がマッピングされています。

例えば:配列105,35,35,79、-7、およびデエンファシスするため、79、35> 2を対応関係-7-> 1を得ることが、ソート-7,35,79,105なります - > 3、> 4 105〜108。

INT N-、A [MAXN]、T [MAXN];
 // 添字開始シーケンスは、一般的に0からとすることができる
ためには、int型 I = 1 ; I <= N; I ++は
{
    scanf関数(" %のD "、および[I])。
    Tは、[I] = A [I]; // Tが離散のマッピング関係を得るための一時的な配列である
}
 // 以下は、UNIQUE(デエンファシス)、LOWER_BOUND(ルックアップ)、STLの並べ替え(ソート)を使用し関数 
ソート(Tの+ 1、+ N-Tの+ 1); // ソート
INT M = UNIQUE(Tの+ 1、T + 1 + N-) - T - 1。 ; // 重量、長さmと重複除外取得します
以下のためのint型 I = 1。 ; I <= N-; I ++は
{
    [I] = LOWER_BOUND(Tの+ 1、T + 1 + M、A [I]) - T; // 二つの点、迅速要素と関連マッピングによって検索 
}

 

おすすめ

転載: www.cnblogs.com/Lamboofhome/p/11712637.html