| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2478 人关注过本帖
标题:看到一个很好的题,写了半天,没调出来。大家一起研究看看。
只看楼主 加入收藏
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
以下是引用Devil_W在2009-9-15 23:10的发言:

本质上求rank的都不应该是你们两个说的那样
 
我看到过SBT树求rank的效率是最高的。
 
比RBT更高的效率。
对于这个题构造树的时候需要的比教的次数跟2n很接近,对于找第三个数来说没什么优势,如果是找地n个,n比较大的时候这才会有实际意义。

身体是玩命的本钱
2009-09-15 23:55
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
回复 11楼 zhddragon
你说的是对的, 第三也许体现不出rank的优势。

我修改后的代码基本实现了。


程序代码:
#include<iostream>         
using namespace std;       
struct BiNode{             
    long key;              
    BiNode *pre;           
    BiNode *next;          
    BiNode(long n){ key =n ;pre=NULL; next=NULL;}
};                                               
class BiTree{                                    
private:                                         
    static int Rank;                             
    void BiTreeInsert(BiNode *&root,long n)      
        {                                        
            if( NULL == root)                    
            {                                    
                root= new BiNode(n);             
            }                                    
            else                                 
            {                                    
                if( root->key > n )              
                    BiTreeInsert(root->pre ,n);  
                if(root->key < n )               
                    BiTreeInsert(root->next,n);  
            }                                    
        }                                        
    void BiTreeRank(BiNode * root, int r , long & key ,bool & status)
        {                                                            
            if( NULL == root)                                        
            {                                                        
                return ;                                             
            }                                                        
            else                                                     
            {                                                        
                BiTreeRank( root->next, r , key, status);            
                Rank++;                                              
                if( Rank == r)                                       
                {                                                    
                    key=root->key;                                   
                    status =true;                                    
                }                                                    
                BiTreeRank( root->pre, r, key, status);              
            }                                                        
        }                                                            
    void BiTreeShow(BiNode * root )                                  
        {                                                            
            if(NULL == root)                                         
                return ;                                             
            BiTreeShow(root->pre);                                   
            cout<<root->key<<" ";                                    
            BiTreeShow(root->next);                                  
        }                                                            
    void BiTreeDestroy(BiNode *root){                                
        if( NULL == root)                                            
            return ;                                                 
        BiTreeDestroy(root->pre);                                    
        BiTreeDestroy(root->next);                                   
        delete root;                                                 
    }                                                                
public:                                                              
    BiNode *root;                                                    
    BiTree(){ root = NULL ;}                                         
    ~BiTree()                                                        
        {                                                            
            BiTreeDestroy(root);                                     
        }                                                            
    void insert(long n){ BiTreeInsert(root, n);}                     
    long rank(int r)                                                 
        {                                                            
            long k;                                                  
            bool sta=false;                                          
            Rank=0;                                                  
            BiTreeRank(root,r, k,sta);
            if( sta == true )
                return k;
            else
                return -1;
        }
    void show(){ BiTreeShow( root);}
};
int BiTree::Rank=0;
int main()
{
    int n;
    long key;
    while(cin>>n)
    {
        if ( 0 == n)
            break;
        BiTree *tree=new BiTree();
        for( int i=0;i<n;i++)
        {
            cin>>key;
            tree->insert(key);
        }

        //tree->show();
        //cout<<endl;
        int rank_key ;
        rank_key=tree->rank(3);
        if( rank_key == -1  )
            cout<<"NO such score!"<<endl;
        else
            cout<<rank_key<<endl;
    }
    return 0;
}
2009-09-16 00:01
ericajong
Rank: 1
等 级:新手上路
帖 子:5
专家分:7
注 册:2009-9-6
收藏
得分:3 
额。   太深奥了, 初学者。。
2009-09-16 00:04
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
- -|||没人知道QuickSelect算法么……

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-09-16 03:16
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 14楼 StarWing83
选择

类似 快速排序, 比快速排序简单

我就是真命天子,顺我者生,逆我者死!
2009-09-16 08:37
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
两位能不能写代码密码,我没听说过那个Q S
2009-09-16 09:09
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
快速选择和快排差不多,使用跟快排一样的方法把序列大于和小于参考值分成两部分,如果参考值前面有k个则选择前半部分作为新的序列,如果小于k个,选择后半部分作为新的序列,然后用同样的方法处理新序列(其实就是一个递归,跟快排的区别就是把其中一部分直接丢弃不处理),直到参考值刚好时第k个(即前面部分有k-1个)。这种方法在随机化的情况下大概要进行2n次比较,最坏的情况为n^2次比较。

对于k<=3的情况跟直接找需要的比较次数很接近甚至更大,而且编码相比直接找复杂,这时候没什么优势。

身体是玩命的本钱
2009-09-16 12:43
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
编码其实很简单,partition五行可以搞定,quickselect最多四行。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-09-16 13:20
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
那就搞定他。
2009-09-16 13:56
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
话说这题N久以前我就过了的吧……

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-09-16 14:17
快速回复:看到一个很好的题,写了半天,没调出来。大家一起研究看看。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036301 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved