1.離散化の概要:
一部のアルゴリズムの問題では、数値範囲が非常に大きくなります(0〜1 0 9 10 ^ 9など)。1 09ですが、その数は比較的少なく、たとえば1 0 5 10 ^ 5だけです。1 05、しかし私たちのプログラムでは、これらの値は下付き文字として使用する必要があり、これらの値の間の順序関係に依存し、それがいくらであっても関係ありません.1 0 9 10 ^ 9を開きます1 0せいぜい10 5 10 ^ 5しかないので、 9の配列は明らかに賢明ではありません。1 05データの場合、値がいくら大きくても、これらの数値を0〜10 5 10 ^ 5に一意にマッピングできます。1 05つのうち、開く必要があるのは1 0 5 10 ^ 5だけです。1 05の配列で十分であり、マッピングプロセスは離散化です。
2.手順:
(1)去重
(2)二分查找映射的数
3.コードテンプレート:
(1)重複排除
vector<int>alls;//假设vector中存了需要离散化的所有数据
sort(alls.begin(),alls.end());
alls.erase(unique(alls.begin(),alls.end()),alls.end());
(独自の機能)
(2)二分探索
int find(int x)
{
int l=0;r=alls.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(alls[mid]>=x)r=mid;
else l=mid+1;
}
return r;//return r+1表示映射以1开始
}
-ある科学の超電磁銃