Splay

本文详细介绍了Splay树的实现方法,包括节点结构、旋转操作、查找、插入和删除等核心功能。同时,提供了使用指针实现的代码示例,并讨论了与数组实现的区别与优势。

                                                      Splay

     写这玩意好累~~~~

     这里贴一份用指针写的(为什么周围的神犇不喜欢用指针呢??)

   

#include<cstdio>
#include<iostream>
#include<cstring>
#define MAXN  100000


using namespace std;


class SplayTree{
private:
  struct node
      {
         int key;
         node *lc,*rc,*fa;
      };
      node *root,*tail;
      node pool[MAXN];
  inline void rotate(node *x)
  {
      node *y=x->fa;
      node *z=y->fa;
      node *b=x==y->lc ? x->rc : x->lc;
      x->fa=z,y->fa=x;
      if(b)
        b->fa=y;
      if(z)
        ( z->lc==y ? z->lc : z->rc )=x;
      if(x==y->lc)
        x->rc=y,y->lc=b;
      else
        x->lc=y,y->rc=b;
  }
  inline void Splay(node *x,node *target=NULL)
  {
     while(x->fa!=target)
     {
          if(x->fa->fa!=target)
          {
                  if((x->fa->fa->lc==x->fa)==(x->fa->lc==x))
                    rotate(x->fa);
                  else
                    rotate(x);
          }
          rotate(x);
     }
     if(target==NULL)
        root=x;
  }
  inline node *find(int key)
  {
      node *p=root;
      while(p)
      {
         if(key>p->key)
            p=p->rc;
         else
            if(key<p->key)
            p=p->lc;
         else
            return p;
      }
      return NULL;
  }
public:
    SplayTree()
    {
               root=NULL;
               tail=pool;
    }
    inline bool  Find(const int &key)
    {
        node *p=find(key);
        if(!p)
            return false;
        Splay(p);
        return  true;
    }
    inline void Insert(const int key)
    {
        node **q=&root;
        node *p=root;
        node *fp=NULL;
        while(p)
        {
             fp=p;
             if(key>p->key)
                q=&p->rc,p=p->rc;
             else
             if(key<p->key)
               q=&p->lc,p=p->lc;
             else
             {
                 Splay(p);
                 return ;
             }
        }
        p = tail++;
        p->key = key;
        p->fa = fp, p->lc = p->rc = NULL;
        *q = p;
        Splay(p);
    }
    inline void Delete(const int key)
    {
         node *p=find(key);
         Splay(p);
         if(!p->lc&&!p->rc)
         root=NULL;
         else
            if(!p->lc)
            root->fa=NULL,root=p->rc;
            else
                if(!p->rc)
                root->fa=NULL,root=p->lc;
            else
            {
                node *pre=p->lc,*next=p->rc;
                while(pre->rc)
                    pre=pre->rc;
                while(next->lc)
                    next=next->lc;
                Splay(pre);
                Splay(next,pre);
                next->lc=NULL;
            }
    }
};

         这也有个Splay专辑~~~~~很有用呢(用数组写的)

http://www.cnblogs.com/proverbs/archive/2013/01/15/2860717.html

混合动力汽车(HEV)模型的Simscape模型(Matlab代码、Simulink仿真实现)内容概要:本文档介绍了一个混合动力汽车(HEV)的Simscape模型,该模型通过Matlab代码和Simulink仿真工具实现,旨在对混合动力汽车的动力系统进行建模与仿真分析。模型涵盖了发动机、电机、电池、传动系统等关键部件,能够模拟车辆在不同工况下的能量流动与控制策略,适用于动力系统设计、能耗优化及控制算法验证等研究方向。文档还提及该资源属于一个涵盖多个科研领域的MATLAB仿真资源包,涉及电力系统、机器学习、路径规划、信号处理等多个技术方向,配套提供网盘下载链接,便于用户获取完整资源。; 适合人群:具备Matlab/Simulink使用基础的高校研究生、科研人员及从事新能源汽车系统仿真的工程技术人员。; 使用场景及目标:①开展混合动力汽车能量管理策略的研究与仿真验证;②学习基于Simscape的物理系统建模方法;③作为教学案例用于车辆工程或自动化相关课程的实践环节;④与其他优化算法(如智能优化、强化学习)结合,实现控制策略的优化设计。; 阅读建议:建议使用者先熟悉Matlab/Simulink及Simscape基础操作,结合文档中的模型结构逐步理解各模块功能,可在此基础上修改参数或替换控制算法以满足具体研究需求,同时推荐访问提供的网盘链接获取完整代码与示例文件以便深入学习与调试。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值