データ離散化処理

3059 ワード

ある時、私達は配列の下の標識を使っていくつかのデータ構造(例えば、集合を調べます)を維持しなければなりませんが、もしデータ範囲が大きすぎると、私達はこのような大きな配列を開けられません.この時、私達はデータを離散化します.例えば、データ{99844531、75331434、87433476、67542347}は、相対サイズ関係67542347<75331434<87433476<99844531>に従って、新しい配列番号をつけてもいいです.b[1]=67542347、b[2]=75331434、b[3]=87433476、b[4]=99844531.私たちは99844531というデータを検索すると、bの中にその番号が4であることが分かります.このデータを4で表すことができます.このようなルックアップ方法によれば、要素の再除去、すなわち重複要素の除去を行います.ここでは、2つの関数を使用する必要があります.unique関数:重複しない要素は、前の重複要素の位置(隣接する反復要素)を占めています.シーケンスの最後の要素の次の要素のアドレスを返します.lower.bound:配列の開始位置から終了位置(左閉右開き)までの2分の1のパラメータ以上の要素を検索し、その要素のアドレスを返します.配列の開始位置を減算すると、その要素の下付きが得られます.見つからなかったらendに戻ります.
コードを添付:
 1 #include
 2 #include 
 3 using namespace std; 
 4 int n; 
 5 int a[];//        
 6 int b[];//        
 7 int main(){ 
 8   for(int i=1;i<=n;++i){ 
 9     cin>>a[i];b[i]=a[i]; 
10 } 
11   sort(b+1,b+1+n);//     ,  unique  “  ”         
12   int m=unique(b+1,b+n+1)-b-1;//        ,          m 
13   int x=lower_bound(b+1,b+m+1,a[1])-b;//         a[1],x a[1]   b       
14   return 0; 
15 }
 
転載先:https://www.cnblogs.com/Asika3912333/p/11313002.html