zoukankan      html  css  js  c++  java
  • 多路归并排序之败者树

    #include<iostream>
    #include<iomanip>
    #define M  4
    using namespace std;
    
    class LoserTree
    {
    private:
        // 调整K为2的整数次幂
        int round(int k)
        {
            if(k&(k-1)!=0)
            {
                int i=0;
                for(i=31;i>=0;i--)
                {
                    if(((1<<i)&k)!=0)
                    {
                        cout<<i<<endl;
                        break;
                    }
                }
                return 0x1<<(i+1);
            }
            return k;
        }
        void ajust(int s)
        {
            cout<<"调整:"<<s<<endl;
            int sData=_ls[s];
            int t=s/2;  
            while(t>=1)
            {
                if(_data[_ls[t]]<_data[sData])
                {
                    int tmp=sData;
                    sData=_ls[t];
                    _ls[t]=tmp;
                }
                t=t/2;
            }
            _ls[0]=sData;
        }
        const int _k;
        int       _n;   // 败者树应留下多少空间存放根节点    
        int   *_data;   // 存放数据
        int    *_ls;     // 存放败者树的结构
    public:
        const int MINKEY;
        const int MAXKEY;
        void print(int *ls,int n)
        {
            cout<<"|||||||||||||||"<<endl;
            for(int i=0;i<n;i++)
                cout<<setw(5)<<i;
            cout<<endl;
            for(int i=0;i<n;i++)
            {
                cout<<setw(5)<<ls[i];
            }
            cout<<endl;
        }
    
        int  init(int input[],int m) // 初始化败者树,并返回胜者的下标
        {
            if(m!=_k)
            {
                return -1;
            }
            int i;
            for(i=0;i<_n+1;i++)
            {
                _ls[i]=_k;       // 映射到最小值
            }
            for(i=0;i<_k;i++)
            {
                _data[i]=input[i];
            }
            for(i=_n+1;i<_n+_k+1;i++)
            {
                
                _ls[i]=i-(_n+1);
            }
            for(i=_n+_k;i>=_n+1;i--)
            {
                ajust(i);
                print(_ls,_n+_k+1);
            }
            return _ls[0];
        }
        int next(int index,int value)
        {
            _data[index]=value;
             ajust(index);
             return _ls[0];
        }
        LoserTree(int k):_k(k),MINKEY(1<<31),MAXKEY(~(1<<31))
        {
             _n=round(_k)-1;  // 计算前面应当预留多少空间
            _data=new int[_k+1];  
            _ls=new int [_n+_k+1];
            _ls[_k]=MINKEY;
        }
        ~LoserTree()
        {
            delete []_data;
            delete []_ls;
        }
    };
    
    
    int main()
    {
        int input[M],i;
        for(i=0;i<M;i++)
        {
            input[i]=rand()%20;
            cout<<input[i]<<"  ";
        }
        cout<<endl;
        LoserTree lt(M);
        int index=lt.init(input,M); // 初始化败者树,并放入到数据缓冲器,此时会返回一个胜者的下标,根据下标可以调用next函数输入下一个数据
        cout<<"min index:"<<index<<"min:"<<input[index]<<endl;
        system("pause");
    }
  • 相关阅读:
    文件上传漏洞及解决办法
    block,inline和inline-block概念和区别
    java中toString() 、(String)、String.valueOf的区别
    实用的原生js图片轮播
    JSON如何处理-jsonpath使用举例
    gRPC初识
    用Rust写一个控制台的俄罗斯方块
    nginx 反向代理报400错误与Host关系
    JPA分页查询与条件分页查询
    Java reactor响应式编程
  • 原文地址:https://www.cnblogs.com/dyc0113/p/4600548.html
Copyright © 2011-2022 走看看