离散化

版权声明:欢迎转载 https://blog.csdn.net/suntengnb/article/details/79962248

为什么要离散化

在很多情况下,问题的范围虽然定义在整数集合Z,但是只涉及其中m个有限数值,并且与数值的绝对大小无关(只把这些数值作为代表,或者说只与它们的相对顺序有关)。这时候,我们就可以把整数集合Z中的这m个整数与数字1~m建立映射关系。如果有一个时间复杂度、空间复杂度与数值范围Z的大小有关的算法,在离散化后,该算法的时间、空间复杂度就降低为与m相关。
代码:

int n,m;//数组arr的大小,数组t的大小
int arr[10010];//原数组
int t[1010];//离散化后的数组
void discrete()
{
    for(int i = 1; i <= n; ++i)//复制
        t[i] = arr[i];
    sort(t + 1,t + n + 1);//排序
    m = unique(t + 1,t + n + 1) - t - 1;//去重
    return;
}
int query(int x)//数字x被哪个数字代替?
{
    return lower_bound(t + 1,t + m + 1,x) - t;
    //return upper_bound(t + 1,t + m + 1,x) - t - 1;//也行
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++i)//输出
        cin >> arr[i];
    discrete();//离散化
    printf("去重并离散化后数组的大小为m = %d\n",m);
    int q;//查询
    while(cin >> q)
    {
        printf("数组arr中的元素%d被数字%d(%d为数组t的下标)代替\n",q,query(q),query(q));
        printf("验证:t[%d]中存放的数字为%d\n",query(q),t[query(q)]);
    }
    return 0;
}

解决方法:

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页