数据结构-红黑树扩张-顺序统计树

算法导论第十四章数据结构的扩张 《算法导论》14数据结构的扩张 阅读详情

发布一个k8s部署视频:https://edu.youkuaiyun.com/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.youkuaiyun.com/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.youkuaiyun.com/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件
————————————————------------------------------------------------------------------------------------------------------------------

 

package com.data.struct;


public class OrderStatisticTree {
	private Node root;
	//private Node nil;
	
	public OrderStatisticTree(int []data){
		for(int i=0;i<data.length;i++){
			Node node=new Node();
			node.setValue(data[i]);
			node.setSize(1);
			insert(node);
		}
	}
	
	/**
	 * 查找第i小的节点
	 * @param i
	 * @return
	 */
	public Node select(int i){
		return select(root,i);
	}
	/**
	 * 查找第i小的节点
	 * @param i
	 * @return
	 */
	private Node select(Node node,int i){
		int r;
		if(node.left!=null){
			r=node.left.size+1;
		}else{
			r=1;
		}
		
		if(i==r){
			return node;
		}else if(i<r){
			return select(node.left,i);
		}else {
			return select(node.right,i-r);
		}
	}
	/**
	 * 查找元素node质
	 * @param node
	 * @return
	 */
	public int rank(Node node){
		int r;
		if(node.left==null){
			r=1;
		}else{
			r=node.left.size+1;
		}
		Node y=node;
		while(y!=root){
			if(y==y.parent.right){
				if(y.parent.left==null){
					r=r+1;
				}else{
					r=r+y.parent.left.size+1;
				}
			}
			y=y.parent;
		}
		return r;
	}
	/**
	 * 中序遍历
	 */
	public void inorderTreeWalk(){
		innerInorderTreeWalk(root);
		System.out.println();
	}
	/**
	 * 中序遍历
	 */
	private void innerInorderTreeWalk(Node node){
		if(node!=null){
			innerInorderTreeWalk(node.left);
			System.out.print("-->"+node.value);
			innerInorderTreeWalk(node.right);
		}
	}
	/**
	 * 先序遍历
	 */
	public void preorderWalk(){
		System.out.println("      "+((root.color==Node.RED?"R":"B")+root.value));
		innerPreorderWalk(root,1);
		System.out.println();
	}
	private void innerPreorderWalk(Node node,int depth){
		if(node!=null){
			if(node.left!=null){
				for(int i=6-depth*2;i>0;i--){
					System.out.print(" ");
				}
				System.out.print((node.left.color==Node.RED?"R":"B")+node.left.value+node.value);
			}else{
				System.out.print("  ");
			}
			if(node.right!=null){
				System.out.print("  ");
				System.out.print((node.right.color==Node.RED?"R":"B")+node.right.value+node.value);
			}else{
				System.out.print("  ");
			}
			if(node.left!=null||node.right!=null){
				System.out.println();
			}
			innerPreorderWalk(node.left,depth+1);
			innerPreorderWalk(node.right,depth+1);
			
		}
		
	}
	/**
	 * 后续遍历
	 */
	public void postorderWalk(){
		innerPostorderWalk(root);
		System.out.println();
	}
	private void innerPostorderWalk(Node node){
		innerPostorderWalk(node.left);
		innerPostorderWalk(node.right);
		System.out.print("-->"+node.value);
	}
	/**
	 * 查找值为value的节点
	 * @param value
	 * @return
	 */
	public Node search(int value){
		return innerSearch(root,value);
	}
	private Node innerSearch(Node node,int value){
		if(node==null||node.value==value){
			return node;
		}
		if(node.value>value){
			return innerSearch(node.left,value);
		}else{
			return innerSearch(node.right,value);
		}
	}
	/**
	 * 返回最小值节点
	 * @return
	 */
	public Node minimum(){
		return innerMinimum(root);
	}
	private Node innerMinimum(Node node){
		if(node.left!=null){
			return innerMinimum(node.left);
		}
		return node;
	}
	/**
	 * 返回最大值节点
	 * @return
	 */
	public Node maximum(){
		return innerMaximum(root);
	}
	private Node innerMaximum(Node node){
		if(node.right!=null){
			return innerMaximum(node.right);
		}
		return node;
	}
	/**
	 * 返回给定节点的后继结点
	 * @param node
	 * @return
	 */
	public Node successor(Node node){
		if(node.right!=null){
			return innerMinimum(node.right);
		}
		Node y=node.parent;
		while(y!=null&&y.right==node){
			node=y;
			y=y.parent;
		}
		return y;
	}
	/**
	 * 插入
	 * @param node
	 */
	private void insert(Node node){
		Node y=null;
		Node x=root;
		while(x!=null){
			y=x;
			x.size+=1;
			if(node.value<x.value){
				x=x.left;
			}else{
				x=x.right;
			}
			
		}
		node.parent=y;
		if(y==null){
			root=node;
		}else if(y.value>node.value){
			y.left=node;
		}else{
			y.right=node;
		}
		root.parent=null;
		node.color=Node.RED;
		preorderWalk();
		insertFixUp(node);
		preorderWalk();

	}
	/**
	 * 插入修复颜色
	 * @param node
	 */
	private void insertFixUp(Node node){
		if(node.parent==null){
			node.color=Node.BLACK;
		}else if(node.parent.parent==null){
			node.color=Node.RED;
		}else {
			while(node.parent==null||node.parent.color==Node.RED){
				if(node.parent==null){
					node.color=Node.BLACK;
					return;
				}else if(node.parent==node.parent.parent.left){
					Node y=node.parent.parent.right;
					if(y==null||y.color==Node.RED){
						node.parent.color=Node.BLACK;
						if(y!=null){
							y.color=Node.BLACK;
						}else{
							node.parent.parent.color=Node.RED;
							rightRotate(node.parent.parent);
							return;
						}
						node.parent.parent.color=Node.RED;
						
						node=node.parent.parent;
					}else if(node==node.parent.right){
						node=node.parent;
						leftRotate(node);
					}else{
						node.parent.color=Node.BLACK;
						node.parent.parent.color=Node.RED;
						rightRotate(node.parent.parent);
					}
				}else{
					Node y=node.parent.parent.left;
					if(y==null||y.color==Node.RED){
						node.parent.color=Node.BLACK;
						if(y!=null){
							y.color=Node.BLACK;
						}else{
							node.parent.parent.color=Node.RED;
							leftRotate(node.parent.parent);
							return;
						}
						node.parent.parent.color=Node.RED;
						
						node=node.parent.parent;
					}else if(node==node.parent.left){
						node=node.parent;
						rightRotate(node);
					}else{
						node.parent.color=Node.BLACK;
						node.parent.parent.color=node.RED;
						leftRotate(node.parent.parent);
					}
				}
			}
		}
	}
	public void insert(int value){
		Node node=new Node();
		node.setValue(value);
		node.setSize(1);
		insert(node);
	}
	private void delete(Node node){
		Node y=node;
		int yoc=y.color;
		Node x;
		if(node.left==null&&node.right!=null){
			 x=node.right;
			transplant(node, node.right);
		}else if(node.right==null&&node.left!=null){
			 x=node.left;
			transplant(node, node.left);
		}else if(node.left==null&&node.right==null){
			if(node.parent==null){
				root=null;
				System.out.println("root is null");
				return;
			}
			x=node.parent;
			if(node==node.parent.left){
				node.parent.left=null;
				if(x.color==Node.RED){
					leftRotate(x);
					preorderWalk();
					return;
				}else if(x.color==Node.BLACK&&node.color==Node.BLACK){
					x=node.parent.right;
					deleteFixUp(x);
					return;
				}
			}else{
				node.parent.right=null;
				if(x.color==Node.RED){
					rightRotate(x);
					preorderWalk();
					return;
				}else if(x.color==Node.BLACK&&node.color==Node.BLACK){
					x=node.parent.left;
					deleteFixUp(x);
					return;
				}
			}
		}else{
			y=innerMinimum(node.right);
			yoc=y.color;
			 
			if(y.parent!=node){
				transplant(y, y.right);
				y.right=node.right;
				y.right.parent=y;
			}
			transplant(node, y);
			x=y.right;
			y.left=node.left;
			y.left.parent=y;
			y.color=node.color;
			if(x==null){
				preorderWalk();
				y.color=Node.RED;
				if(y.left!=null){
					y.left.color=Node.BLACK;
					rightRotate(y);
				}else if(y.right!=null){
					y.right.color=Node.RED;
					leftRotate(y);
				}else{
					y.color=Node.RED;
				}
				preorderWalk();
				return;
				
			}
		}
		preorderWalk();
		if(yoc==Node.BLACK){
			deleteFixUp(x);
			preorderWalk();
		}
		
	}
	private void deleteFixUp(Node node){
		if(node==null){
			
		}
		while(node!=root&&node.color==Node.BLACK){
			Node w;
			if(node==node.parent.left){
				w=node.parent.right;
				if(w.color==Node.RED){
					w.color=Node.BLACK;
					node.parent.color=Node.RED;
					leftRotate(node.parent);
					w=node.parent.right;
				}
				if(w.left.color==Node.BLACK&&w.right.color==Node.BLACK){
					w.color=Node.RED;
					node=node.parent;
				}else if(w.right.color==Node.BLACK){
					w.left.color=Node.BLACK;
					w.color=Node.RED;
					rightRotate(w);
					w=node.parent.right;
				}
				w.color=node.parent.color;
				node.parent.color=Node.BLACK;
				w.right.color=Node.BLACK;
				leftRotate(node.parent);
				node=root;
				
			}else{
				w=node.parent.left;
				if(w.color==Node.RED){
					w.color=Node.BLACK;
					node.parent.color=Node.RED;
					rightRotate(node.parent);
					w=node.parent.left;
				}
				if(w.right.color==Node.BLACK&&w.left.color==Node.BLACK){
					w.color=Node.RED;
					node=node.parent;
				}else if(w.left.color==Node.BLACK){
					w.left.color=Node.BLACK;
					w.color=Node.RED;
					leftRotate(w);
					w=node.parent.left;
				}
				w.color=node.parent.color;
				node.parent.color=Node.BLACK;
				w.left.color=Node.BLACK;
				rightRotate(node.parent);
				node=root;
			}
		}
		node.color=Node.BLACK;
		
	}
	/**
	 * 左旋转
	 * @param node
	 */
	private void leftRotate(Node node){
		Node y=node.right;
		y.size=node.size;
		node.right=y.left;
		if(y.left!=null){
			y.left.parent=node;
		}
		y.parent=node.parent;
		if(node.parent==null){
			root=y;
		}else if(node==node.parent.left){
			node.parent.left=y;
		}else{
			node.parent.right=y;
		}
		y.left=node;
		node.parent=y;
		
		if(node.left==null&&node.right!=null){
			node.size=node.right.size+1;
		}else if(node.right==null&&node.left!=null){
			node.size=node.left.size+1;
		}else if(node.left==null&&node.right==null){
			node.size=1;
			return;
		}else{
			node.size=node.left.size+node.right.size+1;
		}
	}
	/**
	 * 右旋转
	 * @param node
	 */
	private void rightRotate(Node node){
		Node y=node.left;
		y.size=node.size;
		node.left=y.right;
		if(y.right!=null){
			y.right.parent=node;
		}
		y.parent=node.parent;
		if(node.parent==null){
			root=y;
		}else if(node==node.parent.left){
			node.parent.left=y;
		}else{
			node.parent.right=y;
		}
		y.right=node;
		node.parent=y;
		if(node.left==null&&node.right!=null){
			node.size=node.right.size+1;
		}else if(node.right==null&&node.left!=null){
			node.size=node.left.size+1;
		}else if(node.left==null&&node.right==null){
			node.size=1;
			return;
		}else{
			node.size=node.left.size+node.right.size+1;
		}
		
	}
	private void transplant(Node u,Node v){
		if(u.parent==null){
			root=v;
		}else if(u==u.parent.left){
			u.parent.left=v;
		}else{
			u.parent.right=v;
		}
		if(v!=null){
			v.parent=u.parent;
		}
	}
	/**
	 * 删除节点
	 * @param value
	 */
	public void delete(int value){
		delete(search(value));
	}
	private static class Node{
		public static final int RED=1;
		public static final int BLACK=2;
		private Node left;
		private Node right;
		private Node parent;
		private int value;
		private int color;
		private int size;
		public Node getLeft() {
			return left;
		}
		public void setLeft(Node left) {
			this.left = left;
		}
		public Node getRight() {
			return right;
		}
		public void setRight(Node right) {
			this.right = right;
		}
		public Node getParent() {
			return parent;
		}
		public void setParent(Node parent) {
			this.parent = parent;
		}
		public int getValue() {
			return value;
		}
		public void setValue(int value) {
			this.value = value;
		}
		public int getColor() {
			return color;
		}
		public void setColor(int color) {
			this.color = color;
		}
		public int getSize() {
			return size;
		}
		public void setSize(int size) {
			this.size = size;
		}
		
		
		
	}
	public static void main(String[] args) {
		int [] data=new int[]{8,3,2,6,3,9,1,10,11};
		OrderStatisticTree tree=new OrderStatisticTree(data);
		tree.inorderTreeWalk();
		System.out.println("===========");
		//System.out.println(tree.rank(tree.select(3)));
		//System.out.println(tree.rank(tree.select(7)));
		System.out.println(tree.rank(tree.select(8)));
	}
}

 

深入C++学习还必须掌握的一基础知识精讲 施磊C++语言基础提高课程笔记,包括了new/delete;malloc/free;引用和指针;const,指计和引用的结合;函数重载,inline的数,参数带默认值的函数;函数模板等知识点 阅读详情

相关推荐

MATLAB2022a安装避坑指南:从下载到破解的完整流程(附常见错误解决方案)

本文提供MATLAB2022a在Windows系统下的完整安装教程与深度配置指南。内容涵盖从系统兼容性检查、安装媒介验证到分步安装、自定义产品选择及安装后优化设置的全流程。重点解析了安装过程中常见的权限、空间、许可证错误,并提供了系统性的故障诊断与解决方案,旨在帮助用户构建稳定高效的科研计算环境。

weixin_29057695的博客 443

算法导论——(4)有序统计树(OrderStatisticTree,以红黑树为基本数据结构)

有序统计树是以红黑树为基本数据结构,增加了一个字段size,size表示以当前结点为树根的树上的节点数目,很明显有这样的关系根节点的size等于左孩子的size加上右孩子的size+1。 另外,如果之前有了解过有序统计量的相关知识,其中有一个操作便是查找排好顺序的列表中的某个特定索引的元素。那么有序统计树也是在红黑树的基础上加了这个操作。下面来分析OST(有序统计树)在红黑树上变化的部分。 1.

a591193965的博客 2739

宋浩线性代数笔记

Miao-A-SongHao-Linear-Algebra-Notes bilibili 宋浩老师 “惊叹号” 系列 《线性代数》网课 笔记及时间点目录 Github项目地址:https://github.com/cy69855522/Miao-A-SongHao-Linear-Algebra-Notes ???? 前言 我发现吧,线代没记笔记真不行。 浩浩学习,天天向上。数学网课推荐????宋浩老师的免...

Knife丶小刀博客 4万+

完整的C++实现算法导论十三章红黑树以及十四章中的顺序统计树

#include using namespace std; class BRTree; class BRTreeNode{ private: friend class BRTree; int key; bool color; int size; BRTreeNode *left; BRTreeNode *right; BRTreeNode *parent; public: //创

qq_22335577的专栏 1000

保姆级教程:用SSC Tool 5.13为先楫HPM6E00EVK生成8轴EtherCAT从站代码(含XML配置详解)

本文详细介绍了如何使用SSC Tool 5.13为先楫HPM6E00EVK开发板配置8轴EtherCAT从站,包括XML文件深度配置、代码生成与工程整合、烧录与调试技巧。教程涵盖从环境准备到性能优化的全流程,帮助开发者快速实现符合CIA402标准的8轴控制。

weixin_30352645的博客 260

保姆级教程:手把手教你用Python+Zemax仿真一个简易的Nd:YAG固体激光器谐振腔

本文提供了一份详细的Python与Zemax结合的Nd:YAG固体激光器谐振腔仿真教程。从基础理论到实战操作,涵盖晶体参数化、谐振腔设计、泵浦建模、动态仿真及热效应补偿等关键步骤,适合光学专业学生和工程师快速掌握激光器仿真技术。

weixin_30500473的博客 744

【算法导论-34】红黑树、顺序统计树的Java实现

Wiki在《算法导论》网易公开课的“扩充的数据结构、动态有序统计和区间树”这节课中,作者提供了由两种新型数据结构,即动态有序统计树(Dynamic Order Static Tree,简写为OSTress)和线段树。这两种数据结构都是通过红黑树来扩展产生的。红黑树的java实现在我的博客“【算法导论学习-26】 二叉树专题4:红黑树、AVL树、B-Tree”中,描述了几种树型数据结构的应用场景。红黑

BrilliantEagle的专栏 1834

【永磁同步电机】simulink永磁同步电机PMSM矢量控制【含Matlab源码 7372期】

simulink永磁同步电机PMSM矢量控制 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1029

算法导论--动态顺序统计与区间树

本文的基础是红黑树 算法导论–红黑树通过在基础的数据结构中添加一些附加信息,来扩张一种标准的数据结构,然后编写新的操作来支持所需要的应用。下面是介绍在红黑树的基础上扩张的数据结构。1.动态顺序统计动态顺序统计可以在O(lgn)时间内确定任何的顺序统计量(即在n个元素的集合中,能在O(lgn)的时间内确定第i小的元素),同时也可以在O(lgn)的时间内计算一个元素的秩(即它在中序遍历下的位置顺序)

勿在浮砂筑高台 5124

从后端角度浅谈抗辐射设计----三模冗余(TMR)

三模冗余设计(TMR),是最常用的一种容错技术,三个模块采取相同的操作,以多数相同的输出作为表决系统的正确输出,即3取2,因为三个模块是相互独立的,而其中两个模块同时出错的概率是极小的,因此便可保证系统输出的可信度。然而这个设计也会存在面积浪费,功耗的增加,而且由于是冗余的设计,在后续进行综合或者pr的时候会被工具优化,因此需要对模块进行don’t touch设置;通过增值表得到,逻辑关系表达式为:Q=(Q1&Q2)|(Q1&Q3)|(Q2&Q3),通过工艺库的stdcell进行搭建,得到如下电路。

芯冰乐 329

ros_gz_bridge__镜像__readme

Run。

1113

算法导论第十四章利用红黑树查找顺序统计量

利用红黑树可以早lg(n)内查找任意个顺序统计量,这比前面讲到的在O(n)内查找效率要高,但是实现起来比较麻烦。在前面红黑树的基础上实现就比较简单,在树的节点域上加上size整型变量,用来标记以该节点为根的树中有多少节点。特别的叶子节点的size为1.在红黑树中需要修改的是在插入和删除节点时记得要重新调整size的数值,本代码中利用中序遍历的方法对size重新调整:代码如下: void Size

小博客 4502

OpenClaw 生成测试用例

OpenClaw 只是躯干,Skills 才是灵魂。很多同学觉得 OpenClaw 没用,就像是买了一台顶级电脑却没装操作系统。通过这四步走,不仅可以学会如何让 AI 干活,更重要的是,可以学会如何管理 AI 的能力。

十二测试录 740

算法导论第十四章数据结构扩张学习总结

本章主要介绍两种通过扩张红黑树构造出的数据结构,一种是动态顺序统计树,另一种是区间树,之后介绍了如何扩张现有数据结构的一个通用方法。 动态顺序统计 秩:一个元素在集合线性序中的位置 顺序统计树:在红黑树上新增加1个size属性,这个属性包含了以x为根的子树(包括x本身)的(内)结点数,则该红黑树为顺序统计树,如下图所示: 查找具有给定秩的元素:找出T中的第i个小的元素,调用OS-SELECT(T,i),伪代码如下: 确定一个元素的秩:返回对T进行中序遍历后得到的线性序中x的位置,伪代码如下: 对子树规

weixin_44062852的博客 346

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

算法导论(6) 红黑树

红黑树许多“平衡”搜索树中的一种,可以保证在最坏情况下基本动态集合操作的时间复杂度为O(lgn)。一颗红黑树是满足下面红黑性质的二叉搜索树(当一个结点没有子结点或者父结点时,指针设为空,并且将空指针视为叶结点(外部结点),为黑色): (1)每个结点或是红色的,或是黑色的。 (2)根结点是黑色的。 (3)每个叶结点是黑色的。 (4)如果一个结点是红色的,则它的两个子结点都是黑色的。 (5)对

hzbxiaop的博客 453

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法导论读书笔记-第十四章-数据结构的扩张

算法导论第14章 数据结构的扩张 一些工程应用需要的只是标准数据结构, 但也有许多其他的应用需要对现有数据结构进行少许的创新和改造, 但是只在很少情况下需要创造出全新类型的数据结构, 更经常的是通过存储额外信息的方法来扩张一种标准的数据结构, 然后对这种数据结构编写新的操作来支持所需要的应用. 但是对数据结构的扩张并不总是简单直接的, 因为新的信息必须要能被该数据结构上的常规操作更新和维护. 14...

weixin_34075551的博客 239

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《算法导论》学习分享——14. 数据结构的扩张

14. 数据结构的扩张 文章目录14. 数据结构的扩张动态顺序统计量查看给定秩的元素查看一个元素的秩维护size如何扩张数据结构区间树 一些工程应用需要的只是教科书中的标准数据结构,也有许多其他的应用需要对现有数据结构进行少许的创新和改造,但只有很少的情况需要创造全新类型的数据结构。 更经常的是,通过存储额外信息的方法来扩张标准的数据结构,然后对这种数据结构编写新的操作来支持所需要的应用。 比如:...

MaoMao-go 295

《算法导论》第14章 数据结构的扩张 (1)动态顺序统计

《数据结构扩张》是《算法导论》第三部分的最后一章。在介绍学习了这么多种数据 结构之后,简要介绍了当这些基本数据结构不满足需求时,如何扩张它们来满足需求。 这才是学习算法的目的,能够根据需求选择合适的数据结构和算法,并在无法满足需求 时能够扩张它。这才是对算法的思想和本质的学习! 可以将本章看做深入学习的前奏吧,因为紧接着就要开始进入第四部分《高级设计和分析 技术》了。那么赶快来看

西代零零发 3343

《算法导论》Ch.14_学习笔记

数据结构的扩张>

qq_42943306的博客 587

算法导论 14章 数据结构的扩张

本章介绍了两种红黑树的扩张一,动态顺序统计秩:在集合线性序中的位置,中序遍历树时输出的位置。顺序统计树:向红黑树的结构中添加一个size域,表示包含自身节点的当前节点的子树节点的数目。(1)查找给定秩的元素OS_SELECT(x,i) r = size[left[x]]+1; //先计算x的处于的位置 if i = r //x正好是第i小的关键字

博客 519

第十四章 数据结构的扩张

第14章数据结构的扩张概要14.1动态顺序统计 概要 本章节讨论的数据结构均是通过对红黑树的扩张所构造的。14.1介绍了动态集合上顺序统计操作的数据结构;14.2抽象出数据结构的扩张过程;14.3介绍了区间数。 14.1动态顺序统计 顺序统计的概念在《算法导论》的前面章节已经做过介绍,对于一个无序的集合,可以在O(n)时间内确定任何的顺序统计量。本章节介绍如何修改红黑树,使得可以在O(lgn)时间...

qq_28871239的博客 498

算法导论笔记——第十二~十四章 数据结构(二)树

第十二章 二叉搜索树 >=左子树的所有key,<=右子树的所有key 在一棵高度为h的二叉搜索树上,动态集合上的操作SEARCH,MINIMUM,MAXIMUM,SUCCESSOR,PREDECESSOR,INSERT和DELETE可以在O(h)时间内完成。 h>=(lgn向下取整) 和快速排序算法一样,其平均性能更接近于最好情形。 随机构建二叉搜索树期望高度为O(lg...

weixin_33905756的博客 163

“学习笔记”之《算法导论》----第三部分----数据结构----第十四章----数据结构的扩张

本人大四即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接。 放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以...

Mr.π的博客 231
上一篇: 数据结构-红黑树
下一篇: 数据结构-红黑树扩张-区间树
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值