zoukankan      html  css  js  c++  java
  • 竞赛树的简单创建

      很多书本,网上的资料,对竞赛树的构造都比较复杂,需要一些数学运算。先要经过一些运算确定位置。我认为这些繁琐的计算其实可以免去,下面的是我的一种竞赛树的实现方法。

      如果要新建一个包含n个需要比较大小的元素的赢者树,我创建一个2*n大小的数组来存放树的每个节点。每个节点都存放元素的位置。设需要比较的是int a[n],构造出来的树是int T[2*n]。其中T[1]存放的是树的根。先在T的最后n个位置放上a的个元素位置,然后从n-1位置开始比较其子节点大小。也就是1~n-1存放内部节点(比较过了),n~2*n-1存放n个外部节点(单纯的记录对象数组元素)。

      如果某个元素改变了,在这个T的存储结构中确定位置也非常简单,比如i位置的改变了,那就对应T[2*n-1-i]。具体看图和相关代码:

    create
    void CWinTree::create(int a[],int n)
    {
    count
    = n;
    t
    =newint[n+n];// tree
    T=newint[n];// src
    memcpy(T,a,sizeof(int)*n);
    int now=0;
    int i,m;
    for (i=n+n-1;i>0;i--)
    {
    if(now<n)
    t[i]
    =now++;// extern element
    else// inside element
    {
    m
    = T[t[2*i]]>T[t[2*i+1]]?t[2*i]:t[2*i+1];
    t[i]
    = m;
    }
    }
    }
    change
    void CWinTree::change(int pos,int value)
    {
    if (pos>count-1)
    return;
    T[pos]
    = value;
    int i=count+count-1-pos;
    bool c =true;
    int old;
    while(c && i>1)// 可以优化
    {
    old
    = t[i/2];
    t[i
    /2] = T[t[i/2*2]]>T[t[i/2*2+1]]?t[i/2*2]:t[i/2*2+1];
    i
    = i/2;
    }

    }
    class CWinTree
    {
    public:
    CWinTree();
    ~CWinTree();
    void create(int a[],int n);
    int winner();
    void change(int pos,int value);
    private:
    int count;
    int*t;
    int*T;
    };
  • 相关阅读:
    centos安装字体
    【C++ Primer | 15】访问控制与继承、继承中的类作用域
    树与二叉树 | 哈夫曼树
    【C++ Primer | 10】泛型算法
    【APUE | 03】文件I/O
    二叉树
    图论算法
    【深度探索C++对象模型 | 02】构造函数语意学
    【APUE | 08】进程控制
    c++重点理解
  • 原文地址:https://www.cnblogs.com/v2m_/p/winner_tree.html
Copyright © 2011-2022 走看看