首页 > 其他分享 >数据离散化

数据离散化

时间:2022-10-05 11:33:53浏览次数:93  
标签:cnt int 离散 un 数组 include 数据 find

定义:

把无穷大集合中的若干个元素映射为有限集合以便于统计的方法。当数据之间差值很大,即使排完序后,两个数之间仍有很大的差值,不适合直接用下标表示,这样会导致数组开的过大,容量不够,且中间有很多空没有用。针对这种情况,就想到把这间距很大的 m 个数据,在映射到 [1-m] 上,这样就会有效的减少数组的大小,且中间不会有浪费的空间。即把稀疏的数据变的稠密起来。

步骤:

  1. 用数组将所有数据存储在一起all[]
  2. 对数组all[]进行排序
  3. 在开一个数组un[]将排好序的all[]去重并添加到un[]中

此时un[]下标即对应原来数据的离散值。

注意:

查找时可以用二分吗查找(也可以用内置函数lower_bound)

1 //使用库函数
2     int find(int x){
3         return lower_bound(uni+1,uni+1+k,x)-uni;
4     }
 1 //也可以直接二分
 2     int find(int x){
 3         int l=1,r=k+1;
 4         while(l<r){
 5             int mid=(l+r)/2;
 6             if(uni[mid]>=x) r=mid;
 7             else l=mid+1;
 8         }
 9         return r;
10     }

例题

acwing103. 电影、

题目链接

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 
 5 using namespace std;
 6 
 7 const int N = 2e5 + 100;
 8 int a[N], b[N], c[N]; //科学家, 电影语言, 电影字幕
 9 int n, m;
10 int all[3 * N], un[3 * N]; //全部语言, 去重后的语言
11 int cnt;//计数
12 int ans[3 * N];
13 int t;
14 int find(int x) {
15     return lower_bound(un + 1, un + t + 1, x) - un;
16 }
17 
18 int main() {
19     cin >> n;
20     for (int i = 1; i <= n; i ++) {
21         cin >> a[i];
22         all[++cnt] = a[i];
23     }
24 
25     cin >> m;
26 
27     for (int i = 1; i <= m; i ++) {
28         cin >> b[i];
29         all[++cnt] = b[i];
30     }
31 
32     for (int i = 1; i <= m; i ++) {
33         cin >> c[i];
34         all[++cnt] = c[i];
35     }
36 
37     sort(all + 1, all + 1 + cnt);
38     for (int i = 1; i <= cnt; i ++) { //去重并离散化
39         if (i == 1 || all[i] != all[i - 1]) un[++t] = all[i];
40     }
41 
42     int ans1, ans2, ans3;
43     ans1 = ans2 = ans3 = 0;
44 
45     for (int i = 1; i <= n; i ++) { //统计科学家会的语言分类个数
46         ans[find(a[i])] ++;
47     }
48 
49     for (int i = 1; i <= m; i ++) {
50         int anx = ans[find(b[i])], any = ans[find(c[i])];
51         if (anx > ans2 || (anx == ans2 && any > ans3)) {
52             ans1 = i, ans2 = anx, ans3 = any;
53         }
54     }
55 
56     if (ans1 == 0) puts("1");
57     else cout << ans1 << endl;
58 
59     return 0;
60 }

 

标签:cnt,int,离散,un,数组,include,数据,find
From: https://www.cnblogs.com/msluli/p/16755291.html

相关文章

  • Springboot 之 Mybatis-plus 多数据源
    简介Mybatis-puls多数据源的使用,采用的是官方提供的dynamic-datasource-spring-boot-starter包的@DS注解,具体可以参考官网:https://gitee.com/baomidou/dynamic-dataso......
  • SAP UI5 应用元数据文件 manifest.json 的加载和解析原理讲解试读版
    一套适合SAPUI5初学者循序渐进的学习教程本专栏计划的文章数在​​300​​​篇左右,到​​2022年9月22日​​​为止,目前已经更新了​​133​​​篇,专栏完成度为​​......
  • 将容器中(数组、集合)的数据串成字符串
    开发工具VC7(VS2002)核心代码用到MFC,测试代码用到stl本代码功能,将容器中(数组、集合)的数据串成字符串核心代码和扩展代码往往不是一个人完成的。扩展代码和使用也很可能......
  • 导入演示数据
    导入一下准备好的文件注意:路径中不要有中文!!关于导入的这几张表mysql>showtables;+-----------------------+|Tables_in_bjpowernode|+----------------------......
  • 大数据常用Maven依赖
    1<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"2xsi:schemaLocation="http://maven.apache.org/P......
  • 事件相机特征跟踪-概率数据关联法
    1、前言在特征跟踪时,有一个重要的概念是数据关联(DataAssociation)。所谓数据关联,可以理解为:哪些数据是由同一个源产生?对于传统图像而言,我们可以计算特征的描述子,进行匹配从......
  • 3D目标检测深度学习方法数据预处理综述
    前言​这一篇的内容主要要讲一点在深度学习的3D目标检测网络中,我们都采用了哪些数据预处理的方法,主要讲两个方面的知识,第一个是representation,第二个数据预处理内容是数据......
  • Jmeter组件:直连数据库
    1、是什么?jmeter可以直接与数据库进行交互2、怎么用?2.1、在测试计划中添加数据库jar包2.2、添加组件:ConfigElement--JDBCConnectionConfiguration2.3、配置数据库连接信......
  • 数据填报有什么用?数据填报系统具有哪些优势?_光点科技
    大部分数据填报都是终端用户,或者可以说是我们使用信息系统的业务人员,提供这样一个纯粹的HTML页面表结构设计、发布、管理和填报数据的页面、界面友好、简单易用的统计研究分......
  • .NET教程 - 反射 & 元数据(Reflection & Metadata)
    更新记录转载请注明出处:2022年10月5日发布。2022年10月5日从笔记迁移到博客。反射(Reflection)介绍说明大多数情况下,我们都是运行程序集中的代码处理数据但有时需......