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

    离散化

    参考

    pecco算法笔记

    理解

    离散化,就是当我们只关心数据的大小关系时,用排名代替原数据进行处理的一种预处理方法。离散化本质上是一种哈希,它在保持原序列大小关系的前提下把其映射成正整数。当原数据很大或含有负数、小数时,难以表示为数组下标,一些算法和数据结构(如BIT)无法运作,这时我们就可以考虑将其离散化。

    • 将数据的某一特征将其转化为另一种可靠的数据格式进行存储

    • 三个工具人函数

      • memcpy

        • memcpy(C,A,sizeof(A));
        • 以A的长度来将数组A赋值给数组C
        • 这样我们就有一个数组来比较方便地查找排名(下标即排名),其次我们保留了原来的数组,这样可以为我们后来离散化(打标记)提供了原材料
      • unique

        • unique(C,C+n)
          • 对数组C进行整理,将前后(要先对数组C进行排序)的元素扔到后面去,并返回去重队列中的最后一个元素的下一个元素的位置,因而用其来减去C的位置,可以得到不重复队列的长度
      • low_bound

        • lower_bound(C,C+L,A[I])-C+1
        • 在已经排序好的C队列中去搜寻A[i],并得到A[i]或者第一个大于A[I]在C中的位置
        • 因而lower_bound(C,C+L,A[I])-C+1可以表示排名。

    其他

    如果说想从大到小排,请在sort和lower_bound里添加greater<数据类型>()

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n=6;
    	double A[n]= {98.55,70.2,100,30,20,98.55};
    	double B[n+10];
    	int rank[n+10];
    	memcpy(B,A,sizeof(A));
    	for(int i=0;i<n;i++)
    	  cout<<B[i]<<endl;
    	
    	sort(B,B+n,greater<double>());
    	int len = unique(B,B+n)-B;
    	
    	for(int i=0;i<sizeof(A);i++)
    	{
    		rank[i] = lower_bound(B,B+len,A[i],greater<int>())-B+1;
    		cout<<lower_bound(B,B+len,A[i])<<endl;
    	}
    	
    	for(int i = 0;i<n;i++)
    	{
    		cout<<"A["<<i<<"]="<<A[i]<<"    rank="<<rank[i]<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    Android中传感器的基本概念
    Android攻城狮 multi-touch多点触摸
    Android攻城狮SurfaceView
    Android攻城狮Tab类型
    Android攻城狮使用SubMenu创建子菜单
    Android攻城狮认识ContextMenu
    Android攻城狮OptionsMenu
    Android攻城狮Notification实现状态通知栏
    虹软人脸识别SDK(java+linux/window)
    人脸识别ArcFace C#DEMO 开发应用全过程
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/14728636.html
Copyright © 2011-2022 走看看