桶排序题目描述输入5个不大于10的正整数,请按照从小到大的顺序输出这5个数。输入描述输入5个正整数。输出描述从小到大顺序输出5个数。中间用空格隔开。 样例输入2 5 2 1 8输出1 2 2 5 8#include<iostream> using namespace std;int a[15] = {0};int main(){ // 主函数 // 根据a[i]的值进行循环 cout << i << " "; // 输出i,并输出一个空格 } } return 0; // 主函数返回0}2. 俄罗斯套娃(不去重)题目描述本来有一个完整的俄罗斯套娃,现在被小可都拆开了,很是凌乱,现在需要你帮我按套娃的尺寸的给我(每个尺寸大小可能重复),帮我一起把套娃组装起来! 样例4 4 1 2 3输4 3 2 1#include<iostream> // 包含输入输出流头文件using namespace std; // 使用标准命名空间int main(){ //
]=1 表示数字 5 出现过)空间换时间:通过 O (1) 时间复杂度完成元素查询与标记统计与筛选计数统计:通过 a[t]++ 统计数字出现次数(第三套代码)补集思想:输出未被标记的元素(第二套代码)排序输出 例如走过2 7 4 1 8,则请告诉他:3 5 6 9 10没有走过。【输入格式】输入一行,五个数字,表示已经走过的路径编号。【输出格式】输出一行,五个数字,表示没有走过的路径编号。 【输入样例】2 7 4 1 8【输出样例】3 5 6 9 10#include <iostream>using namespace std;int a[15] = {0}; // 定义标记数组,用于标记 // 若数组位置i仍为0,说明数字i未被标记(未出现过) cout << i << " "; // 输出该数字 } } return 0;}2. 样例输入54 1 3 2 3输出4 3 2 1#include <iostream>using namespace std;int a[105] = {0}; // 定义标记数组,用于标记1-100范围内的数字是否出现过
L2-002 链表去重 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。 例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。 输出格式: 首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。 又因为我们已经知道了他的初始地址,所以我们确定好它的顺序后,将他们分为两部分,一个去重的,一个删除的。
桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。 从不是空的桶子里把项目再放回原来的序列中 桶排序算法中,待排序的数据量和桶的数量并不一定是简单的“一对一”的关系,更多场景中是“多对一”的关系, 桶排序应用 我们可以利用桶来完成去重与计数的任务 解决去重问题时,只需将每个数据装入桶中后,再根据桶中是否有数据( tong[i]>0),来输出对应的桶的编号,只输出1次而不要多次输出。 【输入】输入共2行,第1行是n。第2行是n个整数. 【输出】1行。所有整数去重后从低到高排序后的结果。 本文为C++桶排序序案例,包括相关案例练习。
然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。 请你协助蒜头君完成“去重”与“排序”的工作。 输入格式 共两行,第一行为一个正整数n。 Sort函数 sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。 sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#include< algorithm>的c++标准库中。 语法: Sort(start,end,cmp) 参数: (1)start表示要排序数组的起始地址; (2)end表示数组结束地址的下一位; (3)cmp用于规定排序的方法,可不填,默认升序。 也包含在头文件为#include< algorithm>的c++标准库中。 一般使用前需要对容器进行排序,这样才能实现对整个数组去重。
总结 本系列为C++算法学习系列,会介绍 算法概念与描述,入门算法,基础算法,数值处理算法,排序算法,搜索算法,图论算法, 动态规划等相关内容。本文为排序部分。 从不是空的桶子里把项目再放回原来的序列中 桶排序算法中,待排序的数据量和桶的数量并不一定是简单的“一对一”的关系,更多场景中是“多对一”的关系, 桶排序应用 我们可以利用桶来完成去重与计数的任务 解决去重问题时,只需将每个数据装入桶中后,再根据桶中是否有数据( tong[i]>0),来输出对应的桶的编号,只输出1次而不要多次输出。 i=1;i<=n;i++) { int a; cin>>a; bucket[a]++; //进入相应的区域(桶) //如果题目要求把重复的数删掉(去重) 【输入】输入共2行,第1行是n。第2行是n个整数. 【输出】1行。所有整数去重后从低到高排序后的结果。
然后就是迭代器的不同,set的iterator是双向迭代器,而unordered_set的iterator是单向迭代器;set底层是红黑树,set的迭代器是有序+去重的;而unoedered_set底层是哈希桶 ,unoedered_set是无序+去重的。 3. unordered_map 的基本用法 unordered_map 是一个哈希表实现的键值对容器,类似于 map,但是它的元素不按键排序。 然后就是迭代器的不同,map的iterator是双向迭代器,而unordered_map的iterator是单向迭代器;map底层是红黑树,map的迭代器是有序+去重的;而unoedered_map底层是哈希桶 ,unoedered_map是无序+去重的。
开启了共享剪贴版时,截屏的内容会跨电脑传输(有可能是我们希望的),造成软件卡顿(表面上看鼠标过不去),记得随后随便复制点字符,清理掉图片。 2. 最新版可能需要最新版的Microsoft Visual C++ 环境,请去微软官方下载:https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist 服务端显示连接提示,点Add 跳出配置窗,拖动编辑电脑相对位置,拖到左上角垃圾桶删除(如果误删除了在用的屏幕,可能需要重启服务器端才能重连)。 点击OK就可以用了。
vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配的内存总量可用 capacity() 函数查询。额外内存可通过对 shrink_to_fit() 的调用返回给系统。 (C++11 起) 重分配通常是性能上有开销的操作。若元素数量已知,则 reserve() 函数可用于消除重分配。 两者同样都会根据键值大小进行升序排序。 序列由哈希函数弱排序,哈希函数将此序列分区到称为存储桶的有序序列集中。 在每个存储桶中,比较函数确定任何一对元素是否具有等效的排序。 每个元素同时用作排序键和值。 哈希函数将此序列分区到称为存储桶的有序序列集中。 在每个存储桶中,比较函数将确定任一元素对是否具有等效顺序。 每个元素存储两个对象,包括一个排序键和一个值。
桶排序的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。 同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。 根据上面的定义,我们来探究一下: 1.什么时候排序最慢? 当输入的数据被分配到了同一个桶中。 2.什么时候排序最快? 算法描述 1.设置一个定量的数组当作空桶; 2.遍历输入数据,并且把数据一个一个放到对应的桶里去; 3.对每个不是空的桶进行排序; 4.从不是空的桶里把排好序的数据拼接起来。 图示算法 在桶中的元素分布: 然后,元素在每个桶中排序: 关于桶排序的动态图,可以点击这里。 非比较类排序算法总结 这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异: 基数排序:根据键值的每位数字来分配桶; 计数排序:每个桶只存储单一键值; 桶排序:每个桶存储一定范围的数值。
桶排序 经典例题:15 给定n个实数,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。 方案1:最先想到的方法就是先对这n个数据进行排序,然后一遍扫描即可确定相邻的最大间隙。 用n-2个点等分区间[min, max],即将[min, max]等分为n-1个区间(前闭后开区间),将这些区间看作桶,编号为,且桶i 的上界和桶i+1的下届相同,即每个桶的大小相同。 最大间隙:除最大最小数据max和min以外的n-2个数据放入n-1个桶中,由抽屉原理可知至少有一个桶是空的,又因为每个桶的大小相同,所以最大间隙不会在同一桶中出现,一定是某个桶的上界和气候某个桶的下界之间隙 方案2:先对每台机器上的数进行排序。排好序后,我们采用归并排序的思想,将这N个机器上的数归并起来得到最终的排序。找到第(N2)/2个便是所求。复杂度是O(N2*lgN^2)的。 红黑树 平衡二叉树,广泛用在c++的stl中。如map和set都是用红黑树实现的。 b/b+树 用在磁盘文件组织 数据索引和数据库索引。
桶排序 桶排序(Bucket sort)是一种基于计数的排序算法(计数排序可参考上节的内容),工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序 排序动画过程解释 首先,设置固定数量的空桶,在这里为了方便演示,设置桶的数量为 5 个空桶 遍历整个数列,找到最大值为 56 ,最小值为 2 ,每个桶的范围为 ( 56 - 2 + 1 )/ 5 = 11 数字 12 代入公式 floor((12 – 2) / 11) = 0 放入 0 号桶 数字 56 代入公式 floor((56 – 2) / 11) = 4 放入 4 号桶 当向同一个索引的桶,第二次插入数据时 23 前面 遍历完整个数列后,合并非空的桶,按从左到右的顺序合并 0 ,1 ,2 ,3 ,4 桶。 这样就完成了 桶排序 代码实现 为了更好的让读者用自己熟悉的编程语言来理解动画,笔者将贴出多种编程语言的参考代码,代码全部来源于网上。 C++代码实现 ? Java代码实现 ?
前言:在 C++ 标准模板库(STL)中,set是一个常用的关联容器,用于存储唯一的、自动排序的数据。它是解决去重、有序存储、快速查找等问题的绝佳工具。 set 是 C++ STL 提供的一个模板类,基于红黑树实现,具有以下核心特性: 元素唯一:set 会自动去重,插入相同的元素时,新元素会被忽略。 升序排序 set<int> s; // 去重+降序排序(给⼀个⼤于的仿函数) //set<int, greater<int>> s; s.insert(5); s.insert(2); s.insert #include<iostream> #include<set> using namespace std; int main() { // 相⽐set不同的是,multiset是排序,但是不去重 multiset // 将 nums2 的元素存入另一个 set,自动去重并排序 set<int> s2(nums2.begin(), nums2.end()); // 用于存储交集结果的
1.2 动图演示 1.3 代码实现 C/C++实现: //冒泡排序 void bubble_sort(int a[], int n) {//n为a[]的实际长度-1,例如a[4]={3,2,9,10 2.2 动图演示 2.3 代码实现 C/C++实现: //选择排序 void selection_sort (int a[], int n) {//n为a[]的实际长度-1,例如a[4]={3,2,9,10 3.2 动图演示 3.2 代码实现 C/C++ 实现 //插入排序 void insertion_sort (int a[], int n) {//n为a[]的实际长度-1,例如a[4]={3,2,9,10 4.2 动图演示 4.3 代码实现 C/C++ 实现: //希尔排序 void shell_sort(int a[],int n){//n为a[]的实际长度-1,例如a[4]={3,2,9,10 桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
如果为每个所有可能的值分配1个bit,32bit的int所有可能取值需要内存空间为: 2^32bit=2^29Byte=512MB 但对于海量的、取值分布很均匀的集合进行去重,Bitmap极大地压缩了所需要的内存空间 桶排序 经典例题:15 给定n个实数,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。 方案1:最先想到的方法就是先对这n个数据进行排序,然后一遍扫描即可确定相邻的最大间隙。 最大间隙:除最大最小数据max和min以外的n-2个数据放入n-1个桶中,由抽屉原理可知至少有一个桶是空的,又因为每个桶的大小相同,所以最大间隙不会在同一桶中出现,一定是某个桶的上界和气候某个桶的下界之间隙 方案2:先对每台机器上的数进行排序。排好序后,我们采用归并排序的思想,将这N个机器上的数归并起来得到最终的排序。找到第(N^2)/2个便是所求。复杂度是O(N^2*lgN^2)的。 红黑树 平衡二叉树,广泛用在c++的stl中。如map和set都是用红黑树实现的。 b/b+树 用在磁盘文件组织 数据索引和数据库索引。
基数排序 分为两类: 第一类:最低位优先法,简称LSD法:先从最低位开始排序,再对次低位排序,直到对最高位排序后得到一个有序序列;具体过程如下图所示: 初始数组序列为:15,25,105,78,34,21,32,41 ,按照个位数大小依次入桶; 将桶中数依次倒出,对于同一个桶中的数按先进先出顺序倒出,结果为:21,41,32,34,15,25,105,78,再按十位数大小依次入桶; 将桶中数依次倒出,结果为:105,15,21,25,32,34,41,78 = 0){ for(int j = 0;j < num[i];j++){ A[c++] = t[i][j]; } } num[i] = 0; } k = k * 10; } } 第二类:最高位优先法,简称MSD法:先从最高位开始排序,再逐个对各分组按次高位进行子排序,循环直到最低位。 A[c++] = t[i][0]; }else if(num[i] > 1){ //如果桶中不止一个数,则另存如数组B递归 int[] B = new int[num[i]]
可能当我们看到求最大值或者最小值的时候,首先想到的是冒泡排序(详情点击),将整个数组元素排序之后输出第一或者最后一个来输出最大值或者最小值。 2. 但今天我们用不同的方法来实现! (max=arr[0],只是个人习惯) ---- 二、桶排序应用 1.去重整数并排序 1. = 0) { printf("%d", arr[i]); } } } 2.桶排序的方法! // 所以这里我们就明白,输入n个数,即为n个桶标号,然后放入对应的值 } // 第一次n=5,放入5号桶,若第二次n=5,也放入5号桶,这样就做到了去重 2.查找数字出现的次数 1. 第一种传统的方法就是直接遍历数组元素,遇到查找元素就个数加一。 2. 桶排序方法!!
all 在select后加入关键字all表示不去重(默认) and 在where中使用and表示将判断条件连接起来 or 在where中使用or表示判断条件多选一 not 在where中使用not表示判断条件取反 附加运算查询 as 将as前的关系起一个别名,在此语句中,可以用别名来代指这个表 * 在select中通过: “表名.*” 来表示查找出这个表中所有的属性 order by 让查询结果中的信息按照给定的属性排序 (默认升序,上小下大) desc 在order by之后的属性后使用,表示采用降序排序 asc 在order by之后的属性后使用,表示采用升序排序(默认) between...and... all表示不去重 intersect/intersect all 将两个SQL语句做交运算,并且自动去重,添加all表示不去重 except/except all 将两个SQL语句做差运算,并且自动去重 ,添加all表示不去重 is null 在where中使用is null表示这个值是空值 is not null 在where中使用is not null表示这个值不是空值 聚集函数运算查询 avg
set是key搜索场景的结构,map是key/value搜索场景的结构 2. set和multiset参考⽂档 - C++ Reference https://legacy.cplusplus.com /reference/set/ 3. set类的介绍 1. set的声明如下,T就是set底层关键字的类型,set是去重的 2. set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求 } cout << endl; return 0; } 5. multiset和set的差异 multiset和set的使⽤基本完全类似,主要区别点在于multiset⽀持值冗余(也就是不去重 ),那么insert/find/count/erase都围绕着⽀持值冗余有所差异,具体参看下⾯的样例代码理解 相比set不同的是,multiset是排序,但是不去重 multiset相比 ,但是不去重 multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 }; auto it = s.begin(); while (it !
2. MQ 异步去重消费 ① 常见 MQ 去重方式 RocketMQ(≥5.x):自带消息去重功能(基于唯一 keys + Broker 内存缓存) Kafka:支持幂等生产(enable.idempotence =true)避免重复写入 RabbitMQ:原生不去重,可用社区 deduplication 插件(基于 message_id 或 header) 通用方案:消费端用 Redis / 数据库 2️⃣ 节流(Throttle) — 控制“点查询的频率” 场景:你疯狂点击“查询余票”按钮,可能会对服务器造成很大压力。 做法: 设置节流:比如 2 秒内最多只能发一次查询请求。 你可以一直点,但 2 秒内只会真正发一次请求,其余的会被丢弃或延迟到下一个时间窗口。 目的:控制频率,平衡用户体验与系统性能。