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的元素地址

    参考

  • 相关阅读:
    移动端meta标签
    document.ready 和 window.onload
    axios 源码分析
    vue 中的 el
    安卓和Ios 手机兼容性
    一些移动端问题
    Python 局部变量与全局变量
    Linux常用命令大全(非常全!!!)
    Python_爬虫_基础
    linux 常用命令
  • 原文地址:https://www.cnblogs.com/santiego/p/9490755.html
Copyright © 2011-2022 走看看