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日
    浏览(33)
  • 【离散数学】离散数学中如何计算出元素的阶

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

    2024年02月15日
    浏览(24)
  • 【离散数学】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日
    浏览(28)
  • 【离散数学】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日
    浏览(38)
  • 《离散数学》:逻辑

    离散数学 是数学的一个分支,研究 离散对象 和 离散结构 的数学理论和方法。这学期学校开了离散数学的课程,我受益颇丰,感觉到了离散数学真正的魅力,也被开创离散数学各个分支的人的聪明与才智深深折服。与连续数学不同,离散数学关注的是 离散的 、 离散化的数

    2024年02月08日
    浏览(32)
  • 【离散数学】4. 图论

    1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 图:点+边+边与点的映射函数 连通性与判别 欧拉图与哈密尔顿图 二分图和平面图与欧拉公式 树及生成树 单源点最短路径:Dijkstra算法 对偶图 4.1.1 图 一个图G是一个三重组 V ( G ) , E ( G ) , Φ G V(G),E(G),Phi_G V ( G ) , E ( G ) , Φ G ​ V(G)是一

    2024年02月10日
    浏览(31)
  • 离散数学_九章:关系(2)

    n元关系:两个以上集合的元素间的关系 设A 1 ,A 2 ,……,A n 是集合。定义在这些集合上的n元关系是A1×A2×……×An 的子集。这些集合A 1 ,A 2 ,……,A n 称为关系的域,n称为关系的阶。 📘例1:设R是N × N × N上的三元组(a, b, c)构成的关系,是个3阶关系,其中a, b, c是满

    2023年04月19日
    浏览(29)
  • 离散数学笔记整理(个人向)

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

    2023年04月08日
    浏览(31)
  • 【离散数学】图论

    目录 ​ 无向图与有向图 定义 特殊的图 顶点与边的关联与相邻 无向图和有向图的度数 握手定理 度数列 可图化 最大度和最小度 多重图与简单图 无向完全图与有向完全图  子图与补图 子图 ​ 生成子图​  补图 通路与回路 定义 图的连通性 连通图 可达 几种连通 图的矩阵

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

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

    2024年02月05日
    浏览(200)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包