首页 > 编程语言 >c++算法之离散化

c++算法之离散化

时间:2023-08-04 10:58:23浏览次数:43  
标签:11 sort 101100 int c++ 离散 算法 include

什么是离散化?

  离散化,故离散数学,其中的“离散”就是不连续的意思。离散化可以保持原数值之间相对大小关系不变的情况下将其映射成正整数。

也就是给可能用到的数值按大小关系分配一个编号,来代替原数值进行各种操作。

离散化步骤:

1.排序

2.去重

3.归位

举一个例子:

将{4000,201,11,45,830}离散为{5,4,3,2,1}:

1     4000 201 11 45 830
2        1      2   3  4  5
3      sort:
4 离散  11 45 201 830 4000
5        3      4  2   5    1
6 编号      1   2  3   4    5
7                   
8 a[1~n]:[5]  [3] [1] [2]  [4]

既然讲了这么多,是时候上代码了:

1.去重离散

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int a[101100],b[101100];
 5 int main(){
 6     int n;
 7     cin >> n;
 8     for(int i=1;i<=n;i++){
 9         cin >> a[i];//未排序 
10         b[i]=a[i];//副本 
11     }
12     sort(b+1,b+n+1);
13     int cnt=unique(b+1,b+n+1)-(b+1);//去重函数unique
14     for(int i=1;i<=n;i++){
15         //二分查找函数lower_bound():>=a[i]的地址,“-b”就可以返回编号
      //这里注意:减去的b可不是b的数值,是b的地址 
16         a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
17         printf("%d ",a[i]);
18     } 
19     return 0;
20 }

2.不去重离散

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int a[101100],b[101100]
 5 int main(){
 6     int n;
 7     cin >> n;
 8     for(int i=1;i<=n;i++){
 9         cin >> a[i].x;//未排序 
10         a[i].y=a[i].x;//副本 
11     }
12     sort(b+1,b+n+1);
13     for(int i=1;i<=n;i++){
14         //二分查找函数:>=a[i]的地址,“-b”就可以返回编号 
15         a[i]=lower_bound(b+1,b+n+1,a[i])-b;
16         printf("%d ",a[i]);
17     } 
18     return 0;
19 }

不过,我个人觉得不去重的离散好写,因为不用那个恶心人的unitque。

 

标签:11,sort,101100,int,c++,离散,算法,include
From: https://www.cnblogs.com/xuexue1234/p/li_san_hua1234.html

相关文章

  • C++ 重写、隐藏、覆盖
    1.基本概念:1.1重载重载:是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。示例:classA{public:voidtest(inti);voidtest(doublei);//overloadvoidtest(inti,doubl......
  • AI-11. 优化算法
    优化算法对于深度学习非常重要。一方面,训练复杂的深度学习模型可能需要数小时、几天甚至数周。优化算法的性能直接影响模型的训练效率。另一方面,了解不同优化算法的原则及其超参数的作用将使我们能够以有针对性的方式调整超参数,以提高深度学习模型的性能。11.1. 优化和深度学习......
  • c++ 箭头运算符
    C++中箭头运算符的含义与用法讲解_C语言_脚本之家(jb51.net)C++中箭头运算符->,相当于把解引用和成员访问符两个操作符结合在一起,换句话说,p->func()和(*p).func()所表示的意思一样。例如:12345classA{public:func();}123456clas......
  • c++数组作为函数参数
    intsum_arr(intarr[],intn){ inttotal=0; for(inti=0;i<n;i++){ total=total+arr[i]; } returntotal;}方括号指出arr是一个数组,而方括号为空则表明,可以将任何长度的数组传递给该函数,n代表数组的长度。实际数组名就是指针,解释为其第一个元素的地址。int......
  • 代码随想录算法训练营第四十五天| 503.下一个更大元素II 42. 接雨水
    503.下一个更大元素II 要求:数组是环,需要找到下一个最大的元素思路1:先作为直线遍历,然后没有的节点,放到首部,再找比他大的节点注意:头节点代码:1//要求:返回循环数组中下一个更大的数字步数2//思路:先不循环遍历,3//然后对每个-1节点,以他为起始,放到数组的开头,计算有几......
  • C++11
    1.VariadicTemplate可以传入任意数量的参数,并且参数的类型不定。voidprintX(){}template<typenameT,typename...Types>voidprintX(constT&firstArg,constTypes&...args){cout<<firstArg<<endl;printX(args...);}其中,...是pack包,用于模板参数中(typenam......
  • C++面试八股文:如何实现一个strncpy函数?
    C++面试八股文:如何实现一个strncpy函数?某日二师兄参加XXX科技公司的C++工程师开发岗位第31面:面试官:strcpy函数使用过吧?二师兄:用过。面试官:这个函数有什么作用?二师兄:主要用做字符串复制,将于字符从一个位置复制到另一个位置。面试官:strncpy函数也使用过吧,和strcpy有......
  • 算法工程师学习运筹学 笔记一 P,NP,NPC问题
    算法的时间复杂度我之前理解的时间复杂度,是指的解决一个问题所需要的时间。但其实并不准确,时间复杂度应该是 当问题规模扩大后,程序需要的时间长度增长得有多快。时间复杂度有两种类型:一种是O(1),O(log(n)),O(n^a)等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置;......
  • 强化学习Chapter4——两个基本优化算法(1)
    强化学习Chapter4——两个基本优化算法(1)上一节导出了状态价值函数的贝尔曼方程以及最优状态价值函数:\[\begin{aligned}V^\pi(s)&=E_{a\sim\pi,s’\simP}[r(s,a)+\gammaV^\pi(s‘)]\\&=\sum_{a}\pi(a|s_t)(r(s_t,a)+\gamma\sum_{s'}p(s'|s_t,a)V^\pi(s'))\\V^*(s)&am......
  • MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩|附代码数据
    全文链接:http://tecdat.cn/?p=30832最近我们被客户要求撰写关于K-Means(K-均值)聚类算法的研究报告,包括一些图形和统计输出。本文首先阐明了聚类算法的基本概念,介绍了几种比较典型的聚类算法,然后重点阐述了K-均值算法的基本思想,对K-均值算法的优缺点做了分析,回顾了对K-均值改进......