[Happy DSA] 将已排序的元素序列快速的插入到stl set中

[Happy DSA] 图像的contour trace算法C++实现 问题提出: 给定一个二维图像,基于某个threshold,来提取contours。 在图形图像学中,这个问题有比较好的解决方案,google "coutour trace",可以得到以下2个比较好的参考文献: 1. http://en.wikipedia.org/wiki/Moore_neighborhood 2. http://www.imageprocessingplace.com/d 阅读详情

已知一个从小到大已排序的元素序列,如何插入到stl set中最快。

1. stl set内部结构

我们知道stl set内部是用红黑树来实现的。红黑树是一种平衡二叉查找树,它有以下4个用来平衡的条件:

  • 每个节点要么是红色,要么是黑色
  • 根节点为黑色
  • 红节点的子节点一定是黑色
  • 任一个节点至页节点的任何路径上,黑节点的个数相等

所以当插入一个新的非根节点时,它一定要是红色,是为了不破坏条件4。所以最难满足的就是条件3。为了满足这个条件3,没插入一个红色节点后,都需要进行树的平衡调整。
回到题目中,要是插入速度最快,就得尽量减少RB树的平衡调整次数或花销。

RB树条件有两种条件方式,一种就是简单的将父辈节点的颜色进行调整,譬如红色变成黑色,黑色变成红色;另一种就是旋转并调整颜色,有时不止一次旋转。简单的颜色调整是必须的,减少不了。因为默认都是以红色来插入一个新节点,不可能所有的节点都是红色。因此,我们要做的就是尽量减少旋转的次数,甚至根本不要让它进行旋转来调整。

2. 按照什么顺序插入

假如排序的数组元素序列是: 0, 1, 2, 3, 4, 5, 6, 7, 8。共9个元素。
如果了解二叉查找树的特性的话,一个比较稳定的树,或者说是一个比较方便以后查找元素的二叉树,应该满足左右子树元素个数尽量对称的布局。RB树既然是一个平衡二叉查找树,那么它也应该满足这样的优势,可以让之后的查找比较迅速(不然也不会采用RB树作为set的内部实现了)。我们期望的树的布局应该是下面这样的:


既然不要RB树内部进行旋转调整,那么树的根节点应该最先插入,那就是节点4。节点4是排序序列的最中间的元素。为了保持树的左右平衡,我们能想到的就是在左子树中插入一个树之后,右子树也对应的插入一个节点。注意要保证在每插入一个节点后,只允许更改相关父辈节点的颜色,不能进行旋转调整。同时我们要注意到,左右子树插入的情况类似于原树的插入情况,因为节点4被选出首先插入RB树,会将排序序列分成2个相等的左右排序子序列。因此我们想当然的期待着节点4左边的全部节点插入到左子树中,右边的全部节点插入到右子树中。依照这样的思路,选出4插入之后,选出左边子序列的中值,然后选出右边子序列的中值,依次插入。分别是第n/2 => (n/4 => 3*4/n)。如下图所示:

这里容易有一个误区,就是递归的插入中间元素,譬如插入4之后,再递归插入左半部分的中间元素,之后是右半部分的中间。其实这样是不对的。插入4之后,插入红色节点2,之后是红色节点0/1,这时就得进行右旋转调整了,因为0/1的父节点是红色节点。所以我们必须对称的插入左右中值元素,以保持RB树的平衡。

3. 算法验证及实现

上面插入的顺序到底是不是我们的一厢情愿呢?我们来验证一下,还是以前面9个数字序列:0, 1, 2, 3, 4, 5, 6, 7, 8。根据我们前面推导的插入序列,它们应该按照这样的方式插入:4, 2, 6, 1, 3, 5, 7, 0, 8。
a) 插入节点4,标记为黑,因为它是根节点。


b) 然后是节点2,和节点6。插入红色节点2后,它的父节点是黑色节点4,因此不需要任何颜色调整。插入节点6时,父节点4是黑色,跟节点2一样,不需要调整颜色。

c) 接着是节点1
红色节点1作为节点2的左子节点插入,由于父节点2是红色,而且叔叔节点也是红色。根据RB树的调整规则,我们只需要将父辈节点2和节点6反转为黑色,将祖父节点4反转为红色。但是最后又得将根节点4标记为黑色(满足规则2)。

d) 节点3,5,7
有了前面1的插入,导致现在节点2和节点6都是黑色,节点3,5,7将被直接插入,不做任何调整。

e) 节点0,8的插入
红色节点0作为节点1的左子节点插入。由于节点1和节点3都为红色,类似于当时节点1的插入,将节点1和节点3反转为黑色,将节点2反转为红色。节点8类似于节点1。

高亮标记的那个树就是RB树内部的结构。

从节点4到节点8的插入,期间只有颜色调整,没有任何旋转调整。因此满足我们之前的需求。

下面就是序列插入时,RB树内部结构变化图:



一个基于BFS的Python代码的实现(借用队列):

#insert all elements from l (type is list) to s (type is set)
def insert_set(l,s):
   sorted_l = sorted(l)
   import Queue
   q = Queue.deque()
   begin, end = 0, len(l)
   q.append((begin,end))
   while len(q):
      (begin, end) = q.popleft()
      if begin >= end:
          continue
      mid = (begin + end) /2
      print mid
      s.add(l[mid])
      q.append((begin,mid))
      q.append((mid+1,end))

if __name__ == '__main__':
    l = [0,1,2,3,4,5,6,7,8]
    s = set([])
    insert_set(l,s)



[Happy DSA] 2个浮点数的最大公约数的算法小结 我们知道2个整数有最大公约数(GCD)和最小公倍数(LCM)的说法。而且最大公约数GCD有一个公认的欧拉算法GCD。它的算法如下: GCD(a, b) { return b ? GCD(b, a % b) : a; }有了GCD,当然也很好求解LCM。 现在,问题来了,给定2个浮点数,怎么求解它们的GCD? 1. 数学上的方法 一个比较的想法就是,既然我们已有的工 阅读详情

相关推荐

CrewAI 多 Agent 实战包 v1(Mock免Key跑通+通义千问可选+流水线样例)

本资源是 CrewAI 风格多 Agent 可运行工程包:研究→写作→审校等流水线样例。无 API Key 时自动降级 Mock 引擎跑通;有 DASHSCOPE_API_KEY 时可接真实 CrewAI + 通义千问。含中文 README、samples、smoke 留档、单元测试。本包不含密钥。关联博客:https://blog.youkuaiyun.com/mtl1994

python笔记之序列(set的基本使用和常用操作)

集合(set) 集合(set):无序的,可变的,可包含任意对象的集合 ,每次输出的结果顺序都是不同的 特点: 1. 属于可变序列 2. 可以包含任意类型 3. 可变长度,任意嵌套 4. 支持原位改变 5. 集合不允许有重复的对象(相当于自动去重) 定义集合 student_set = {"xiao_a","xiao_b","xiao_c","xiao_c"} prin...

Key_book(句芒安全实验室) 1053

市场销售总监年终汇报必备PPT.pptx

市场销售总监年终汇报必备PPT

[Happy DSA] rope算法学习

rope是粗绳索的意思,在计算机编程世界里,它可以替代string来处理超长字符串的相关操作,比如联接,插入,删除,因此它常用于text editor这样的应用中。 它的wiki主页简要描述了它的机理: 这个算法来源于一篇paper: Boehm, Hans-J; Atkinson, Russ; and Plass, Michael (December 1995).Ropes: an Al

zeroom的技术专栏 3498

半桥LLC谐振变换器开环+闭环仿真设计资料(Simulink仿真实现)

内容概要:本文档系统性地介绍了半桥LLC谐振变换器的开环与闭环仿真设计方法,基于Simulink平台构建完整的仿真模型,涵盖系统建模、关键参数设计、控制策略实现及动态性能验证全过程。重点阐述了LLC谐振变换器的工作原理、谐振腔参数(Lr、Cr、Lm)的优化设计方法、零电压开关(ZVS)与零电流开关(ZCS)等软开关技术的实现机制,并深入探讨电压/电流双闭环控制策略,特别是恒压恒流双竞争控制逻辑的切换机制与稳定性保障。资料配套提供完整的仿真模型、详细说明文档及参考文献,有助于全面掌握其在启停过程、负载突变等工况下的动态响应特性与系统鲁棒性调控方法。; 适合人群:具备电力电子技术基础理论知识和Simulink仿真操作能力的高校研究生、科研机构研究人员,以及从事高频高效开关电源、新能源汽车车载充电机(OBC)、充电桩电源、数据中心供电等领域的工程技术人员。; 使用场景及目标:① 掌握LLC谐振变换器在实际工程中的精确建模与仿真分析流程;② 深入理解并独立实现从开环频率调制到闭环反馈控制的平滑切换逻辑;③ 应用于高效率DC-DC变换器、电动汽车充电系统、可再生能源并网电源等场景下的控制系统设计与性能优化; 阅读建议:建议结合所提供的仿真模型进行分步调试与参数扫描实验,重点关注控制器带宽设计、谐振元件参数匹配对效率的影响以及系统上电过程中的软启动策略设计,同时推荐对比学习全桥LLC、CLLC等衍生拓扑的相关资料,以建立完整的谐振变换器控制体系认知。

SOP 配电网故障重构方法研究【IEEE33节点】(Matlab代码实现)

内容概要:本文围绕基于SOP(Soft Open Point)的配电网故障重构方法展开研究,采用IEEE33节点标准配电系统作为仿真测试平台,利用Matlab进行代码实现与仿真验证。研究重点在于通过SOP这一柔性电力电子装置实现故障后网络拓扑的快速重构,提升供电恢复能力与系统可靠性。文中详细阐述了故障重构的数学建模过程,结合优化算法实现负荷转供与孤岛划分的协同决策,在保证辐射状运行约束的前提下,最大限度恢复失电负荷,并降低网络损耗。该方法充分体现了SOP在主动配电网中的灵活调控优势,为现代智能配电网的自愈控制提供了有效技术路径。; 适合人群:电气工程及相关专业的高校研究生、从事配电网自动化与智能电网研究的科研人员,以及具备一定Matlab编程基础和电力系统分析背景的研发技术人员。; 使用场景及目标:① 掌握基于SOP的配电网故障恢复机制与重构策略设计;② 学习如何在Matlab环境下构建IEEE33节点系统模型并实现故障重构算法;③ 深入理解含分布式电源与柔性装置的主动配电网优化运行方法; 阅读建议:建议结合电力系统分析基础知识,重点关注SOP的建模方式、故障重构的优化目标与约束条件设定,并动手实践Matlab代码以加深对算法流程和仿真结果的理解。

glib中的GQueue结构体

glib库的GQueue的实现,是依托在GList的基础上: 内部保存有哪个双向队列的头和尾,故可以提供一些双向队列的接口,例如push_head, push_tail, pop_head, pop_tail。 有一个印象深刻的函数实现: GList * g_queue_peek_nth_link (GQueue *queue, guint n) {

zeroom的技术专栏 2556

基于Python的高考志愿辅助填报系统

在实际应用中,系统需要处理更复杂的数据,包括更多的高校和专业信息、更详细的录取规则、以及用户的历史选择等。系统需要提供用户友好的界面,让考生输入自己的信息和偏好,然后通过后端的模型计算出推荐的志愿列表。此外,系统还应该提供一些个性化的服务,如根据考生的输入动态调整推荐策略、保存用户的填报历史和偏好等。特征可能包括考生的分数、所在省份、文理科类别、专业偏好、高校的地理位置、排名、专业的就业前景等。3. **推荐逻辑**:根据用户的分数和专业偏好,结合历史录取数据,使用简单的算法来推荐可能录取的高校和专业。

coder_wwwdy的博客 1976

glib中单双向链表的归并排序

在glib库中,双向链表的排序是采用合并排序的方法,但它并不是两两的合并,而是迭代的合并,如下图: 代码如下: GList * g_list_sort (GList *list, GCompareFunc compare_func) { return g_list_sort_real (list, (GFunc) compare_func, NU

zeroom的技术专栏 2145

解锁医疗AI密码:医疗人工智能专业大学四年学习路径

医疗AI人才培养路径解析 本文系统梳理了医疗人工智能专业四年培养方案,分为基础、进阶、应用和拓展四个阶段: 大一聚焦基础学科,涵盖高等数学、医学概论、Python编程等核心课程,辅以医学数据认知实习。大二深入机器学习和医学数据处理领域,学习监督/无监督学习算法及医学影像分析技术。大三进入深度学习阶段,掌握CNN/RNN等神经网络模型,并实践医疗AI应用开发。大四关注前沿技术如大模型在医疗中的应用,完成毕业设计与企业实习。 课程体系强调医工交叉,每学期均配置实践环节,从基础编程到参与真实医疗AI项目,逐步培养

AllenLV的博客 2500

利用GPAC生成MP4文件

GPAC主要针对学生和内容创作者,代表了一个跨平台的多媒体框架,开发人员可以使用它在 LGPL 许可下制作开源媒体。GPAC多媒体框架兼容范围广泛的流行文件类型,从常见格式(如 AVI、MPEG 和 MOV)到复杂格式(如 MPEG-4 系统或 VRML/X3D)和 360 电影。

深之JohnChen的专栏 1771

[Happy DSA] 求解直方图下的最大矩形面积

问题描述: 比较给定直方图对应的值列表为[1, 2, 4, 2, 1],那么最大的矩形面积应该是[2, 4, 2]描述的区间矩形面积为6(宽度为3,高度为2)。 关于这个问题,网上有比较多的解决方案,时间复杂度从O(n^2)、O(nlgn),到O(n) (需O(n)空间)。 http://blog.youkuaiyun.com/arbuckle/article/details/710988

zeroom的技术专栏 1206

告别‘Duang’的一声:手把手解决RK3588开发板PCIe初始化卡死问题(DTS修改实战)

本文详细介绍了解决RK3588开发板PCIe初始化卡死问题的完整过程,包括问题诊断、DTS文件修改及编译烧写步骤。通过禁用未使用的PCIe硬件资源,有效解决了启动卡死问题,为嵌入式开发者提供了实用的调试方法和经验总结。

weixin_30753873的博客 215

[Happy DSA] 如何对单链表进行快速排序

通常快速排序算法都是施行于数组,但它也可以作用于单链表。 原理跟数组快速排序是一样的,先partition,然后再递归的解决子单链表的快速排序。 以下是从c-algorithms代码中摘下来的代码段: static SListEntry *slist_sort_internal(SListEntry **list,

zeroom的技术专栏 1201

uniapp [全端兼容] - 实现集成配置百度语音识别转文字,长按或开启录音并将录音文件实时转换为文字,百度智能云API实现上传录音文件并转换成文字案例(苹果安卓App、微信小程序、移动端H5网页)

uniapp对接百度智能云语音识别,uniapp中实现语音识别(app+小程序),百度语音识别录音转文字_百度智能云,uniapp使用百度语音识别语音转文字,uniapp小程序调用百度语音识别,uni-app 百度语音识别文字并展示功能,uniapp配置自定义界面百度语音识别转文字和原生使用方式,uniapp使用百度语音,uni-app语音转文字功能,使用UniApp技术实现录音并将录音转换为文字,uniapp如何实现语音输入功能功能,Uniapp集成百度智能云API实现录音转文字详细教程完整示例代码dem

🏆 前端领域优质创作者 1万+

Ardupilot chibios IO固件,IO与FMU通信,固件下载(3)

目录 文章目录目录摘要 摘要 本节主要记录自己学习IO与FMU通信

陌城烟雨 2801

glib中GTrashStack小计

GTrashStack中只有一个成员,是一个指针,也是一个指向stack前一片内存的指针。 struct GTrashStack { GTrashStack *next; }; 在回收内存时,这样的结构不会带来额外的内存开销,因为可以将next指针记录在回收的内存中。 G_INLINE_FUNC void g_trash_stack_push (GTrashStack **sta

zeroom的技术专栏 1025

【零基础学习CAPL】——CAN报文的发送(CRC——ChecSum值)

本章主要介绍带有CRC值的报文发送一般报文可使用CANoe的IG模块直接发送,但带有CRC值的报文就只能编写脚本进行发送,以下详细讲解在配合Panel面板情况下,如何进行带有循环冗余码的报文进行报文的发送。

LOVE135149的博客 1913

[Happy DSA] 2D平面上n个点,求解最接近45度的2点连线

有这么一个几何问题:2d平面的n个点,怎么求解连线最接近45度的那些点的组合。 1. 朴素方法: 我们能想到的最naitive的方法就是求解平面上所有2点连线的斜率,斜率的绝对值最接近于1的那些点的组合,就是我们想要的。要知道n个点能构成n^2条线段,故这种方法的时间复杂度就是O(n^2)。但是我们期望有更好的,时间复杂度较小的解决方法。 2. 一个比较好的方法 如果熟悉计

zeroom的技术专栏 974

RK3588高速接口实战-PCIE

摘要: RK3588的PCIe接口支持PCIe 3.0x4和PCIe 2.1x1/x2,具备Root Complex和Endpoint模式,适用于NVMe SSD、5G模块等高速设备。硬件设计需注意85Ω/100Ω阻抗匹配、220nF AC耦合电容及100MHz参考时钟。设备树需配置控制器节点、PHY模式和IOMMU映射(RC模式用iommu-map,EP模式用iommus)。调试时可通过lspci检查链路状态,dmesg查看训练日志,perf分析性能。常见问题包括设备识别失败(检查复位时序、PHY配置)、

weiyvyy的博客 503

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[Happy Coding] 一段调用STL算法的程序代码的效率分析

已知一个STD::SET,想要根据一个predicate来从中去除所有的满足predicate(返回true)的元素。 我们首先想到的是STL提供的remove_if函数。 下面我们来看看这个函数是如何实现的: 1133   template 1134     _ForwardIterator 1135     remove_if(_ForwardIterator __fir

zeroom的技术专栏 963

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[Happy DSA] 程序实现绘制箭头的原理

下图演示了如何给一条线段画上箭头的实现原理,主要也就是如何旋转一个向量。 其中rotation angle和scale都可以在程序代码中自定义。

zeroom的技术专栏 755

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[Effective DSA] 链表的反转

这里的链表为单向链表和双向链表: 单向链表的反转 单向链表的反转,只需要维护1个节点指针,每次只能反转一个节点指向。GLIB的代码如下:(充分利用传入进来的list) GSList* g_slist_reverse (GSList *list) { GSList *prev = NULL; while (list) { GSList *next = lis

zeroom的技术专栏 722

[Happy DSA] 求解最长回文子字符串

题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。 比如输入字符串google,由于该字符串里最长的对称子字符串是goog,因此输出4 关于这个问题,有一个比较好的线性时间复杂度的算法Manacher's ALGORITHM 这2篇技术博客非常好的阐述了它的算法思想: 1) http://www.felix021.com/blog/read.php?2040 (中文

zeroom的技术专栏 678

[Happy DSA] Print all interleavings of given two strings

Given two strings str1 and str2, write a function that prints all interleavings of the given two strings. You may assume that all characters in both strings are different Example: Input: str1

zeroom的技术专栏 643
上一篇: 有关僵死进程和孤儿进程的小结
下一篇: [Happy DSA] 2D平面上n个点,求解最接近45度的2点连线
zero_lee
博客等级 码龄21年 94粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值