植树节,程序员要爬哪些“树”?
作者 | 程序猿小吴、进击的Hello_World
转载自五分钟学算法(ID: CXYxiaowu)
公历 3 月 12 日是一年一度的植树节。旨在宣传保护森林,并动员群众参加植树造林活动。说到树,程序猿们肯定不陌生,趁着这个植树节,普及一下程序猿们经常遇见的树。
二叉搜索树
定义
二叉搜索树又称二叉查找树,亦称为二叉排序树。设 x 为二叉查找树中的一个节点,x 节点包含关键字 key,节点x 的 key 值记为 key[x] 。如果 y 是 x 的左子树中的一个节点,则 key[y] <= key[x] ;如果 y 是 x 的右子树的一个节点,则 key[y] >= key[x] 。
查找性能
当数据数目为 N,树高度保持 logN 附近。则平均查找长度与 logN 成正比,查找平均时间复杂度为 O(logN) 。 当先后插入的关键字有序时,二叉搜索树退化成单支树结构。此时树高 N 。平均查找长度为 (N+1)/2 ,查找的平均时间复杂度为 O(N) 。
插入性能
插入效率与查找效率一致。
删除性能
删除节点时,若节点为叶子节点,或者节点只有单一子树,则时间复杂度为 O(1) 。若节点既有左子树又有右子树,则需要执行递归过程,对应时间复杂度为 O(logN) 。
应用场景
二叉排序树就既有链表的好处,也有数组的好处,因此 在处理大批量的动态的数据是比较有用。
种树
平衡二叉树
定义
平衡二叉树是一种特殊的二叉搜索树。平衡二叉树保证节点平衡因子的绝对值不超过1,保证了树的平衡。
查找性能
平衡二叉树是严格平衡的,那么查找过程与二叉搜索树一样,只是平衡二叉树不会出现最差的单支树情形。因此查找效率最好,最坏情况时间复杂度为 O(logN) 。
插入性能
插入数据之前需要进行查找操作,查找到插入位置。插入数据后需要进行旋转操作,旋转操作复杂度为常量级。因此插入数据的时间复杂度与查找相同为 O(logN)。
删除性能
删除数据同样需要查找数据,在删除数据后需要进行调整。一次删除最多需要需要O(logN)次旋转,因此删除数据的时间复杂度为O(logN)+O(logN)=O(2logN)。
应用场景
SGI/STL的 set/map 底层都是用红黑树(平衡二叉树的一种)实现的。
种树
红黑树
定义
平衡二叉树的严格平衡策略以牺牲建立查找结构(插入,删除操作)的代价,换来了稳定的O(logN) 的查找时间复杂度。红黑树采用了折中策略,即不牺牲太大的建立查找结构的代价,同时又能保证稳定高效的查找效率。
查找性能
由于红黑树的性质(最长路径长度不超过最短路径长度的 2 倍),可以说明红黑树虽然不像平衡二叉树一样是严格平衡的,但平衡性能还是要比二叉搜索树要好。其查找代价基本维持在 O(logN) 左右,但在最差情况下(最长路径是最短路径的 2 倍少 1),比平衡二叉树效率低一些。
插入性能
红黑树插入结点时,需要旋转操作和变色操作。但由于只需要保证红黑树基本平衡就可以了。因此插入结点最多只需要2次旋转,这一点和平衡二叉树的插入操作一样,但是变色操作的时间复杂度为O(logN)。
删除性能
红黑树的删除操作代价要比平衡二叉树要好的多,删除一个结点最多只需要 3 次旋转操作,保证了删除时间复杂度维持在常量级。
应用场景
应用场景有很多。
Java 中的 TreeSet ,TreeMap,HashMap
C++ 的 STL中的 map 和 set 都是用红黑树实现的
epoll 在内核中的实现,用红黑树管理事件块
nginx 中,用红黑树管理 timer 等
linux 进程调度 Completely Fair Schedule r,用红黑树管理进程控制块
种树
B 树
定义
B树是一种多路平衡查找树,在相同数据数目情形下,B树的高度更小,这样就减少了磁盘的IO次数,在文件系统以及数据库索引等场景下提升了查找效率。
查找性能
B树的查找分成两种:一种是从一个结点查找另一结点的地址的时候,需要定位磁盘地址(查找地址),查找代价极高。另一种是将结点中的有序关键字序列放入内存,进行优化查找(可以用折半),相比查找代价极低。而B树的高度很小,因此在这一背景下,B树比任何二叉结构查找树的效率都要高很多。
插入性能
B树的插入会发生结点的分裂操作。当插入操作引起了 s 个节点的分裂时,磁盘访问的次数为 h (读取搜索路径上的节点) +2s (回写两个分裂出的新节点) +1(回写新的根节点或插入后没有导致分裂的节点)。因此,所需要的磁盘访问次数是 h+2s+1,最多可达到 3h+1。因此插入的代价较大。
删除性能
B树的删除会发生结点合并操作。最坏情况下磁盘访问次数是 3h=(找到包含被删除元素需要h次读访问)+(获取第2至h层的最相邻兄弟需要h-1次读访问)+(在第3至h层的合并需要h-2次写访问)+(对修改过的根节点和第2层的两个节点进行3次写访问)。
应用场景
B树/B+树主要用于磁盘文件组织 数据索引和数据库索引等场景。
种树
B+ 树
定义
B+树是B-树的一种变体,B+树相比B-树的特点:
(1)索引节点的key值均会出现在叶子节点中。
(2)索引节点中的key值在叶子节点中或者为最大值或者为最小值。
(3)叶子节点使用单链表的形式链接起来。
查找性能
(1)在相同数量的待查数据下,B+树查找过程中需要调用的磁盘IO操作要少于普通B-树。由于B+树所在的磁盘存储背景下,因此B+树的查找性能要好于B-树。
(2)B+树的查找效率更加稳定,因为所有叶子结点都处于同一层中,而且查找所有关键字都必须走完从根结点到叶子结点的全部历程。因此同一颗B+树中,任何关键字的查找比较次数都是一样的。而B树的查找是不稳定的。
插入性能
B+树的插入过程与B树类似,性能也基本一致。
删除性能
删除性能与B树也基本一致。
应用场景
B树/B+树主要用于磁盘文件组织 数据索引和数据库索引等场景。
种树
霍夫曼树
定义
给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为霍夫曼树(Huffman Tree)。
霍夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
应用场景
霍夫曼树主要用于霍夫曼编码,进行数据压缩领域。
今日互动,上面这六种树中,你爬过哪几种树?
◆
线上分享会
◆
分享者:董文馨(00后,畅销书“你也能看得懂的Python算法书”作者之一。斯坦福大学计算机系和剑桥大学双Offer。)
最短路径问题在我们生活中无处不在,本次分享将会用四个不同的Python算法解决最短路径问题,并且分析每一个算法在实际应用中的利与弊。
推荐阅读:
00后的算法学习之路:拿下斯坦福和剑桥双offer
Deep Reading | 从0到1再读注意力机制,此文必收藏!
75道常见AI面试题,看看你的知识盲点在哪?(附解析)
10行Python,搭建一个游戏AI | 视频教程
权威预测:未来一年,企业云服务将会如何发展?
“5G 将是一个彻底的失败通信技术” | 畅言
diss一时爽, 打脸啪啪响! "05年互联网不如传真机", 如今区块链也是一种肮脏的...
13岁女学生因两行JavaScript代码被捕!
没有一个人,能躲过程序员的诱惑!
❤点击“阅读原文”,查看历史精彩文章。
相关文章:
把JS 脚本嵌入CS运行
下面这段视频,是让您知道怎样把播放器的javascript放入C#类别中。在调用这个类别时,只传入相关的参数,即可运行。一时类别封装了,在前台xxx.aspx或xxx.aspx.cs看不到播放器的代码。 另一个就是在CS内怎样运行Javascript脚本。此工…
【C++】Google C++编码规范(四):其他C++
引用参数 所有按引用传递的参数必须加上const; 这在Google Code上是一个硬性约定:输入参数是值参或const的引用参数,输出参数为指针,输入参数可以是const指针,但决不能是非const的引用参数,除非用于交换,比…
使用Ceph集群作为Kubernetes的动态分配持久化存储
2019独角兽企业重金招聘Python工程师标准>>> 使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储。 Kubernetes集群要使用Ceph集群需要在每个Kubernetes节点上安装ceph-common 1. 为kubernetes创建一个存储池 1 2 #…
Cosmos的基石:IL2CPU编译器--.net/C#开源操作系统学习系列三
本文的代码包以cosmos-12304.zip为例(从这个包开始,COSMOS的内核算是有了个基本的雏形,就像是一颗大树在出芽前会先长出庞大的根系,现在就要破土长出第一颗芽了) IL2CPU之于COSMOS就相当与GCC之于LINUX,查看…
【面试 多线程】【第九篇】多线程的问题
1.多线程有什么用 发挥多核CPU优势,防止阻塞,更快的处理数据 2.多线程的实现方式有哪几种,分别的特点优势是什么样的 1》继承Thread类,重写run方法,start启动多线程 2》实现Runnable接口,重写run方法&…
那个大战AlphaGo的柯洁,将免试入读清华大学工商管理专业
日前,柯洁将免试入读清华大学的消息经媒体曝光了出来。《2019 年优秀运动员免试入学推荐名单》3 月 10 日开始公示,围棋世界冠军柯洁的名字出现在名单上,其中表明他将就读清华大学工商管理类专业。据了解,柯洁预计今年下半年入学清…
【Qt】设置背景
1、使用样式表qss设置背景 QDialog 设置背景图片: dlg->setStyleSheet("QDialog{border-image: url(://test.png);}"); 设置背景颜色: dlg->setStyleSheet("QDialog{background-color: red;}"); QWidget 设置背景图片: wgt->setStyleSheet…
基于Hadoop的MapReduce框架研究报告
http://www.doc88.com/p-19830708273.html
【Qt】设置窗口透明度
1、使用setWindowOpacity设置透明度 setWindowOpacity(0.5); 设置完成会使窗体、标题栏、子控件都透明 2、使用样式表qss设置窗体透明 dlg->setStyleSheet("QDialog{background-color: rgba(255, 0, 0, 0.5);}");wgt->setStyleSheet("QWidget{backgrou…
7行Python代码,搭建可以识花的机器学习App|视频教程
你想学Python,却不知如何着手,那你需要一种更加有趣的学习方式。Siraj Raval是一位人工智能领域的编程高手,毕业于哥伦比亚大学,曾任职于 Twilio 和 Meetup,他通过制作教程类短视频的方式在Youtube上积累了大量的粉丝&…
java中缀表达式转后缀表达式(逆波兰算法)
四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式数字直接输出为后缀表达式一部分如果是符号,则判断与栈顶元素的优先级高于栈顶元素优先级直接入栈低于或等于栈顶优先级栈顶元素出栈并输出为后缀…
Wpf消息循环之消息传递
几天遇见一个问题需要检查某个wpf程序是否已经运行,如果没有运行则启动传递参数,如果已运行则需要直接传递消息。在没有运行 情况下传递参数很简单,我们只需要Process cmd窗口启动并传递参数,在程序中处理。但是如果程序已经启动有…
【Qt】使用sqlite3数据库时,主键自增和获取自增后的主键的
创建数据表格,设置主键自增 创建数据库时,启用主键自增加特性 Create table testTable (id INTEGER PRIMARY KEY AUTOINCREMENT,。。。。 注意事项:设置主键自增时(AUTOINCREMENT),主键类型必须是INTEGER&…
拿下斯坦福和剑桥双offer,00后的算法学习之路
董文馨,00后,精通英语,西班牙语。斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习。10岁开始在国外上学;12岁学Scratch;13岁学HTML & CSS;14岁开始学Python & Java&…
Mybatis【配置文件】就是这么简单
配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理sql语句 Statement的实际位置…
cto denalil
Denali使用准虚拟化技术来提高x86电脑上虚拟机的性能。Denali的虚拟机为因特网服务专门支持了最小化的操作系统。 系统可以运行上千虚拟机。Xen与Denali不同,因为它试图运行适当数量的完整操作系统,而非大量轻量级操作系统。转载于:https://blog.51cto.c…
Redis学习笔记 - 数据类型与API(1)Key
Redis学习笔记 - 数据类型与API(1)Key Key相关命令 1. 常用命令 命令含义时间复杂度keys查找所有符合给定模式 pattern 的 keyO(N), N 为数据库中 key 的数量dbsize计算key的总数O(1)exists检查key是否存在O(1)del删除指定的key-valueO(1)exp…
【Qt】enum和QString的相互
使用Q_ENUM注册enum Q_ENUM使用元对象系统meta-object来注册,因此在enum所在的类中必须包含宏Q_OBJECT或者Q_GADGET。 例子如下 class MyClass : public QObject{Q_OBJECTpublic:MyClass(QObject *parent = 0);~MyClass();enum Priority { High, Low, VeryHigh, VeryLow };Q_…
Gmail全球大规模宕机
整理 | 非主流出品 | AI科技大本营(ID: rgznai100)今天(3 月 13 日),Google 的多项服务在全球范围内出现了不同程度的宕机,包括 Gmail、Google Drive、 Hangouts、谷歌地图等。受影响最大的是拥有超 10 亿用…
搭建域控服务器
作业环境 服务器端(VirtualBox VM) 操作系统:Windows Server 2003 Enterprise Edition SP2 IPAddress:192.168.1.1/255.255.255.0 Gateway:null 客户端(VirtualBox VM) 操作系统:Windows XP SP3 IPAddress:192.168.1.2…
【Git】ubuntu安装git
sudo apt-get install git 图形界面的:sudo apt-get install git-gui 查看ssh服务是否启动 sudo ps -e | grep ssh 如果没有启动执行如下命令; sudo service ssh start 如果没有ssh,使用如下命令安装 sudo apt-get install ssh
Composer 篇
学习网站Composer 中文网 资源包 Packagist Packagist / Composer 中国全量镜像如何安装 Composer下载 Composer安装前请务必确保已经正确安装了PHP。打开命令行窗口并执行php -v查看是否正确输出版本号。打开命令行并依次执行下列命令安装最新版本的 Composer:php …
西工大开源拥挤人群数据集生成工具,大幅提升算法精度 | CVPR 2019
作者 | 周强(CV君)转载自 我爱计算机视觉(公众号id:aicvml)近年来,因为拥挤人群计数在视频监控、公共安全方面的应用广泛,引起了不少学者的关注。简单说来这个任务就是给定图像,返回…
getElementById 不能取得visible=false 的控件解决方法
想要绑定textbox的回车事件到一个按钮上,但不想显示这个按钮,如果你把这个button的visible设置为false,那么你使用 getElementById是获取不到的,或者说取到的为空。这是因为Visiblefalse,在编译后,该控件在页面上不显示…
【Git】在本地创建git库管理自己的代码
1、创建本地库 git init . 新建库 git config --global user.email “hello163.com” git config --global user.name “laoer” git config --global core.editor vim //将默认编辑器由nano更改为vim 2、提交 2.1 git add . 将当前目录下所有文件添加到提交缓冲区 2.2 git …
“智慧血联网平台”亮相军民融合技术装备博览会
该平台可实现血液全程跟踪溯源,为大众提供安全、透明、便捷的用血服务。 一个打造智慧化血液管理新模式的血联网平台最近亮相第三届中国军民融合技术装备博览会。该平台可实现血液全程跟踪溯源,为大众提供安全、透明、便捷的用血服务。 此次博览会以“聚…
AI专利之争:小米超华为,国家电网才是大Boss?
作者 | 一一编辑 | 琥珀出品 | AI科技大本营(ID:rgznai100)以往相关机构发布 AI 专利数量排行榜时,如果表明“中国在 AI 专利申请数量上已经超过美国,中国在 AI 技术实力上已在国际上遥遥领先”,这类榜单会招致对中国科…
SLF4J 的几种实际应用模式--之二:SLF4J+Logback
前面讲的 SLF4J 的用法之一是 SLF4JLog4J,而这里要推出的组合是 SLF4JLogBack。不用 Log4J?难道还有比 Log4J 更好的日志实现吗?是的,答案就是 LogBack。假如你知道 LogBack 和 Log4J 是同出一位大师之手,你就不会觉得…
10行Python,搭建一个游戏AI | 视频教程
昨天为大家推荐了三个Python视频,包含:《利用Python,用4分钟时间搭建一个情感分析系统》、《7行Python代码,搭建一个可以识花的机器学习APP》、《10行Python,搭建一个可以自动作曲的神经网络》,今天营长再为…
ABAP git客户端
Jerry习惯把自己写的小程序放到自己的github上:https://github.com/i042416 对于写的ABAP程序,需要先把SAPGUI里的代码手动拷贝到本地,然后用git客户端push到github上。 但是其实可以直接在SAPGUI里通过一个ABAP实现的git客户端将代码push到g…