zoukankan      html  css  js  c++  java
  • 离散化

    离散化

    使用场景&思路

    当需要把一个数据范围很大,但是元素个数较少的集合映射到数组下标上时,因为计算机内存的限制,数组下标不可能完全包含这极大的数据范围,所以我们需要将其(排序后)重新顺序标号。

    至于离散后数据的具体值,很多时候我们不需要关心,我们只需要知道他们之间相对的大小(这时可以排序后再离散化);如果非要知道数据的具体值,可以再开个数组,下标对应离散后的编号,里面存具体值。

    实现

    #include <iostream>
    #include <algorithm>
    #define MAXN 40000
    using namespace std;
    int n,a[MAXN],t[MAXN];
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++)
    		cin>>a[i],t[i]=a[i];
    	sort(t+1, t+1+n);
    	int len=unique(t+1, t+1+n)-(t+1);
    	for(int i=1;i<=n;i++)
    		a[i]=lower_bound(t+1, t+1+len, a[i])-t;//从1开始编号
    	for(int i=1;i<=n;i++)
    		cout<<a[i]<<" ";
    	return 0;
    }
    

    说明

    • unique()

      去重函数 包含在头文件 algorithm

      将数组所有中重复的元素移至末尾,最终返回的是不含重复元素数组的尾地址

      所以把返回的尾地址和首地址t+1相减就是不含重复元素数组的长度len

    • lower_bound()

      查找函数 包含在头文件 algorithm

      返回第一个大于等于x的元素地址

    参考

  • 相关阅读:
    wordcloud库基本介绍和使用方法
    文本词频同意问题分析
    集合
    操作系统
    操作系统的发展史
    基础练习
    random库的使用
    【量化】五日均价策略
    【量化】多只股票策略
    【量化】指数数据
  • 原文地址:https://www.cnblogs.com/santiego/p/9490755.html
Copyright © 2011-2022 走看看