有些数据本身很大,自身无法作为数组的下标保存对应的属性。
如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理!
离散化:当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。
使用STL算法离散化: 思路:先排序,再删除重复元素,然后就是索引元素离散化后对应的值。 假定待离散化的序列为a[n],b[n]是序列a[n]的一个副本,则对应以上三步为:
#include <iostream> #include <cstdlib> #include <cstdio> #include <string> #include <cstring> #include <cmath> #include <vector> #include <queue> #include <algorithm> #include <map> using namespace std; int X[10] = {1234567, 1234567, 123456789,12345678, 123456}; int a[10] = {1234567, 1234567, 123456789, 12345678, 123456}; int main() ////// n = 5 { sort(X, X+5); int size = unique(X, X+5)-X; for(int i = 0; i < 5; i++) a[i] = lower_bound(X, X+size, a[i])-X+1; for(int i = 0; i < 5; i++) printf("%d\n", a[i]); system("pause"); }
对于第3步,若离散化后序列为0, 1, 2, ..., size - 1则用lower_bound,从1, 2, 3, ..., size则用upper_bound,其中lower_bound返回第1个不小于b[i]的值的指针,而upper_bound返回第1个大于b[i]的值的指针,当然在这个题中也可以用lower_bound然后再加1得到与upper_bound相同结果,两者都是针对以排好序列。使用STL离散化大大减少了代码量且结构相当清晰。