c++算法之离散化

这篇具有很好参考价值的文章主要介绍了c++算法之离散化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是离散化?

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

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

离散化步骤:

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。

 文章来源地址https://www.toymoban.com/news/detail-623620.html

到了这里,关于c++算法之离散化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【离散数学】gpt教我离散数学3

    对于给定的A、B和f,判断f是否为从A到B的函数:f:A→B.如果是,说明f是否为单射、满射、双射的. A=B=R, f(x)=根号x 对于给定的集合 A = B = R A=B=mathbb{R} A = B = R 和函数 f : A → B f:Arightarrow B f : A → B , f ( x ) = x f(x)=sqrt{x} f ( x ) = x ​ ,我们需要判断 f f f 是否为从 A A A 到 B B B

    2024年02月09日
    浏览(40)
  • 【离散数学】离散数学中如何计算出元素的阶

    例题:   解析: 即对于模n加法来说,其相加的俩个数中任意一个数通过幂运算(幂运算的执行运算根据代数系统中的算符而定)能够整除6 而且单位元是0的原因: 因为最后是求的余数   例题:  

    2024年02月15日
    浏览(27)
  • 【离散数学】gpt教我学数学2

    对于给定的A、B和f,判断f是否为从A到B的函数:f:A→B.如果是,说明f是否为单射、满射、双射的. A=B=R笛卡尔积R,f(x,y)=y+1,x+1 对于给定的集合 A = B = R × R A=B=mathbb{R}timesmathbb{R} A = B = R × R 和函数 f : A → B f:Arightarrow B f : A → B , f ( ⟨ x , y ⟩ ) = ⟨ y + 1 , x + 1 ⟩ f(langle x,

    2024年02月09日
    浏览(44)
  • 【离散数学】gpt教我学数学6

    设A是n元集(n=1),则从A到A的函数中有几个双射函数,有几个单射函数? 设 A A A 为 n n n 元集,下面分别计算从 A A A 到 A A A 的双射函数和单射函数的数量: 双射函数的数量: 一个双射函数 f : A → A f:Arightarrow A f : A → A 必须是一一对应的,即 f f f 必须是一个双射。因此,可

    2024年02月10日
    浏览(32)
  • 离散数学 (II) 习题 4

    解答: 假命题,完全图Kn每个顶点的度数为n-1,当n为偶数的时候,Kn存在奇度顶点,所以Kn不一定是欧拉图。 解答: 真命题,因为有向完全图的每个顶点都与其他n-1个顶点连接,因此每个顶点的入度等于出度,且强连通,因此n阶有向完全图是欧拉图。 解答: 真命题,当r,

    2024年02月09日
    浏览(33)
  • 离散数学 (II) 习题 1

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 解答: 由握手定理可得: 3n=2m① 已知: 2n-3=m② ①②联立解得:m=9;n=6 度数集为(3,3,3,3,3,3) 一共有3情况 (1) (2) (3) 对于可简单图化的,请给出对应的简单图。 (1) (4, 3, 2, 1) (2) (5, 4, 3, 2, 1

    2024年02月08日
    浏览(31)
  • 头歌实训-离散数学-图论!

    5阶无向完全图的边数为:10 设图 G 有 n 个结点, m 条边,且 G 中每个结点的度数不是 k ,就是 k+1 ,则 G 中度数为 k 的节点数是: n(k+1)-2m 若一个图有5个顶点,8条边,则该图所有顶点的度数和为多少?16 他让输出关联矩阵和邻接矩阵这不简单么? 我是直接摆烂了 输出个球呀

    2024年02月04日
    浏览(69)
  • 离散数学实验一

    实验题目:可简单图化、连通图、欧拉图和哈密顿图的判断 实验目的: 掌握可简单图化的定义及判断方法; 掌握连通图、欧拉图的判断方法; 掌握欧拉回路的搜索方法; 了解欧拉图的实际应用。 实验要求: 给定一非负整数序列(例如:(4,2,2,2,2))。 判断此非负整数序列是

    2024年02月05日
    浏览(205)
  • 离散数学·图的着色

    k -着色 —— 用k个颜色上色的 色数 —— 最少需要的颜色数 k -色图 —— 最少需要的色 的图 χ(……) —— 相应 色数 χ(G) 点色数 =1 —— 为零图 全是孤立点 χ(K n )=n χ(G)=2 —— G为非零图二部图 二部图:一个图的点集可以分为2个互不相交的点集A,B的并,并且在G中的每一条边

    2024年02月12日
    浏览(32)
  • 离散数学笔记整理(个人向)

    1.1. 概念 等势:A、B两集合间存在一一对应的关系,则称A与B等势,记为 A ~ B。 可数集合:与自然数集合N等势的集合。集合基数为阿列夫零。包括:正奇数集合,质数集合,有理数集合Q。 不可数集合:与开区间(0, 1)等势的集合。集合基数为阿列夫。 集合A的基数记为card A 1

    2023年04月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包