数据结构-数据结构的扩展

1 如何做数据扩张

4个步骤:

  1. 选择一种基础数据结构
  2. 确定基础数据结构中要维护的附加信息
  3. 检查基础数据结构上一些操作是否需要维护附加信息
  4. 为附加信息添加一些新的操作

2 举例

扩展红黑树(或是其他树),能够在O(lgn)内获取第i小的元素.

为每个节点添加一个size成员变量,表示当前节点所有子节点的个数+1,加1是因为自己还有一个.因此:

pre->size=pre->left->size+pre->right->size+1;

要想找到第i小的元素

RBNode* RBTree::find(size_t i)
{
  return axu_find(mp_root,i);
}

RBNode* RBTree::aux_find(RBNode* cur,size_t i)
{
  size_t index = cur->left->size+1;//当前节点在书中的序号,秩
  if(index==i)
  {
    return cur;
  }else if(index < i){ //i还有在 cur 的后面
	return aux_find(cur->right,i-r);// i-r 表示,之前已经有r个了,再往后找i-r个就是了
  }else if(index > i){ // i 在 cur 的前面
    return aux_find(cur->left);  // 没有跳过任何元素,因此直接传 i
  }
}

相对应的,也可以找到第i大的元素,也就是根节点size-i+1小的元素.

确定一个节点在树中的是第几小的.

size_t* RBTree::find(RBNode *node)
{
  size_t index = node->left->size+1; // 这只是自己统治下节点的排序.
  RBNode* pre = node;
  while(pre != mp_root)
  {
    //只有自己是一个右节点的时候,才要加上左节点的元素数目,如果不是,就不加.
    if(pre == pre->p->right)
    {
      r=r+pre->p->left->size+1; //自己父节点的右子树个数 + 父节点的1
    }
    pre = pre->p;
    //向上递归,直到p是根节点.
  }
}

size的维护

插入过程:

  • 添加元素时,所有元素途径的路径上 size+1,添加以后,自己的size=1,O(lgn)
  • 旋转,以左旋为例: 原先父节点pre,旋转以后父节点cur

    新的父节点的size等于原先父节点的size.(因为元素个数没变)

    原先父节点的个数变为 pre->size=pre->left->size+cur->right->size+1

删除过程:

  • 删除操作,遍历路径从根节点到节点replace_node,路径上所有节点size-1
  • 旋转,同插入

原文地址:https://www.cnblogs.com/perfy576/p/8665672.html

时间: 2024-11-08 22:43:10

数据结构-数据结构的扩展的相关文章

[考研系列之数据结构]数据结构概述

1.脑图 2.数据结构 2.1 抽象数据类型 表示法: (D,S,P) D:数据对象 S:D上的关系集 P:对D的基本操作集 ADT格式 ADT 抽象数据类型名{ 数据对象:<数据对象定义> 数据关系:<数据对象的定义> 基本操作:<基本操作的定义> }ADT 抽象数据类型名 基本操作的格式: 基本操作名(参数表) 初始条件:<初始条件描述> 操作结构:<操作结果描述> 2.2 分类 2.2.1 按值的不同特性 原子类型的值是不能分解的,如C中基

PHP中的数据结构:DS扩展

PHP7以上才能安装和使用该数据结构扩展,安装比较简单: 1. 运行命令 pecl install ds 2. 在php.ini中添加 extension=ds.so 3. 重启PHP或重载配置  Collection Interface:包含本库中所有数据结构通用功能的基本interface. It guarantees that all structures are traversable, countable, and can be converted to json using json

数据结构之二叉树扩展AVL,B-,B+,红黑树

1.AVL 1.基本概念 AVL是平衡二叉查找树,它或者是一颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1. 若将二叉树结点上的平衡因子BF(Balance Factor)定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只能是-1,0,1. 2.性质 平衡二叉查找树,在添加或者删除的结点的过程中,如果失去平衡,则需要进行平衡调整.调整的过程中,要保持根大于左,小于右的特性. 3.应用场景 最早的平衡

Java核心类库—数据结构—数据结构的概述

什么是数据结构: 数据结构是计算机存储.组织数据的方式. 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率.数据结构往往同高效的检索算法和索引技术相关. 常见的数据结构,数组(Array),栈(Stack),链表(Linked List),哈希表(Hash),队列(Queue),堆(Heap),图(Graph),树(Tree) java中集合框架其实就是数据结构的实现的封装,这里是模拟和实现数据结构. 不同的数据结构的操作性

算法系列笔记5(扩展数据结构-动态顺序统计和区间树)

在编程中,我们往往使用已有的数据结构无法解决问题,这是不必要急着创建新的数据结构,而是在已有数据结构的基础上添加新的字段.本节在上一次笔记红黑树这一基础数据结构上进行扩展,得出两个重要的应用-动态顺序统计和区间树. 动态顺序统计 在算法系列笔记2中我们在线性时间内完成了静态表的顺序统计,而这里我们在红黑树上进行扩展,在O(lgn)时间内完成该操作,主要包括返回第i 排名的元素os_select(i)和给定一个元素x,返回其排名(os_rank(x)). 思想:添加新项:在红黑树的结点上记录下该结

Python中的高级数据结构(转)

add by zhj: Python中的高级数据结构 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据 结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供 选择,例如Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint.本文将介绍这些数据结构的用法,看 看它

iOS中XML、JSON数据结构解析以及第三方类的引用

今天讲到数据结构解析的内容:XML和JSON两种 XML数据结构:是扩展于HTML,主要使用标签对<start></start> 其解析有两种: 1.SAX解析(Simple API for XML).是基于事件驱动的解析方式,逐行解析数据(采用协议回调机制) NSXMLParser是iOS自带的XML解析类.解析过程由NSXMLParserDelegate协议方式回调 解析过程:开始标签-->取值-->结束标签-->取值 使用过程如下: @interface T

magento 数据结构

首先要知道是EAV模式,这种结构要比普通数据结构更容易扩展,但是带来的就是查询速度慢,好在magento的缓存机制不错 最重要的3张表eav_entity_type,eav_entity_attribute,eav_attribute eav_entity_type表用来定义实体的基本信息 比如entity_type_id = 1是customer实体 eav_entity_attribute表用来定义实体模型包含哪些属性(当然这里还涉及到set和group) select * from eav

json数据结构

JSON即JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合服务器与JavaScript的交互.JSON易于人阅读和编写.同时也易于机器解析和生成.JSON采用完全独立语言的文本格式,但是也是用了类似于C语言家族的习惯(包括C,C++,C#,JAVA,JavaScript,Perl,Python等).这些特性使JSON成为理想的数据交换语言. XML也是一种数据交换格式,不过XML标记比较多,往往使得标记比需要传递的数据都还多,这样会增加字符传输的负担.