`
febird
  • 浏览: 254238 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通用的 LoserTree

    博客分类:
  • C++
阅读更多

项目地址:http://code.google.com/p/febird

 

 - 共有 n 个内部结点,n 个外部结点
 - winner 只用于初始化时计算败者树,算完后即丢弃
 - winner/loser 的第 0 个单元都不是内部结点,不属于树中的一员
 - winner 的第 0 个单元未用
 - m_tree 的第 0 个单元用于保存最终的赢者, 其它单元保存败者

 - 该初始化需要的 n-1 次比较,总的时间复杂度是 O(n)

 - 严蔚敏&吴伟民 的 LoserTree 初始化复杂度是 O(n*log(n)),并且还需要一个 min_key,
   但是他们的初始化不需要额外的 winner 数组

 - 并且,这个实现比 严蔚敏&吴伟民 的 LoserTree 初始化更强壮

其中引用的一些代码比较长,故未贴出

#define LT_iiter_traits typename std::iterator_traits<typename std::iterator_traits<RandIterOfInput>::value_type>

template
< class RandIterOfInput

        , 
class KeyType = LT_iiter_traits::value_type

        , 
bool StableSort = false //!< same Key in various way will output by way order

        , 
class Compare = std::less<KeyType>

        , 
class KeyExtractor = typename boost::mpl::if_c<
                boost::is_same
<KeyType,
                               LT_iiter_traits::value_type
                              
>::value,
                boost::multi_index::identity
<KeyType>,
                MustProvideKeyExtractor
            
>::type

        , CacheLevel HowCache 
= cache_default
        
>
class LoserTree :
    
public CacheStrategy< typename std::iterator_traits<RandIterOfInput>::value_type
                        , KeyType
                        , KeyExtractor
                        , HowCache
                        
>,
    
public MultiWay_SetOP< LT_iiter_traits::value_type
                         , KeyType
                         , LoserTree
<RandIterOfInput, KeyType, StableSort, Compare, KeyExtractor, HowCache>
                         
>
...{
    DECLARE_NONE_COPYABLE_CLASS(LoserTree)

    typedef CacheStrategy
< typename std::iterator_traits<RandIterOfInput>::value_type
                        , KeyType
                        , KeyExtractor
                        , HowCache
                        
>
    super;

    friend 
class MultiWay_SetOP< LT_iiter_traits::value_type
                         , KeyType
                         , LoserTree
<RandIterOfInput, KeyType, StableSort, Compare, KeyExtractor, HowCache>
                         
>;
public:
    typedef typename std::iterator_traits
<RandIterOfInput>::value_type way_iter_t;
    typedef typename std::iterator_traits
<way_iter_t     >::value_type value_type;
    typedef KeyType  key_type;
    typedef KeyExtractor key_extractor;
    typedef boost::integral_constant
<bool, StableSort> is_stable_sort;

    typedef typename super::cache_category  cache_category;
    typedef typename super::cache_item_type cache_item_type;

public:
    
/**//**
     @brief construct

     @par 图示如下:
     @code

RandIterOfInput                                          this is guard value
      ||                                                          ||     
      ||                                                          ||     
      /                                                          /      
     first--> 0 way_iter_t [min_value.........................max_value] 
       /      1 way_iter_t [min_value.........................max_value] <--- 每个序列均已
       |      2 way_iter_t [min_value.........................max_value]      按 comp 排序
       |      3 way_iter_t [min_value.........................max_value]
      <       4 way_iter_t [min_value.........................max_value]
       |      5 way_iter_t [min_value.........................max_value]
       |      7 way_iter_t [min_value.........................max_value]
             8 way_iter_t [min_value.........................max_value]
     last---> end

     @endcode

     @param comp    value 的比较器

     @note 每个序列最后必须要有一个 max_value 作为序列结束标志,否则会导致未定义行为
     
*/

    LoserTree(RandIterOfInput first, RandIterOfInput last,
              
const KeyType& max_key,
              
const Compare& comp = Compare(),
              
const KeyExtractor& keyExtractor = KeyExtractor())
    
...{
        init(first, last, max_key, comp, keyExtractor);
    }

    LoserTree(RandIterOfInput first, 
int length,
              
const KeyType& max_key,
              
const Compare& comp = Compare(),
              
const KeyExtractor& keyExtractor = KeyExtractor())
    
...{
        init(first, first 
+ length, max_key, comp, keyExtractor);
    }


//     LoserTree(RandIterOfInput first, RandIterOfInput last,
//               const cache_item_type& min_item,
//               const cache_item_type& max_item,
//               const KeyType& max_key,
//               const Compare& comp = Compare(),
//               const KeyExtractor& keyExtractor = KeyExtractor())
//     {
//         init_yan_wu(first, last, min_item, max_item, comp, keyExtractor);
//     }
//     LoserTree(RandIterOfInput first, int length,
//               const cache_item_type& min_item, // yan_wu init need
//               const cache_item_type& max_item,
//               const KeyType& max_key,
//               const Compare& comp = Compare(),
//               const KeyExtractor& keyExtractor = KeyExtractor())
//     {
//         init_yan_wu(first, first + length, min_item, max_item, comp, keyExtractor);
//     }

    LoserTree()
    
...{
    }


    
/**//**
     @brief 初始化
      
    - 共有 n 个内部结点,n 个外部结点
    - winner 只用于初始化时计算败者树,算完后即丢弃
    - winner/loser 的第 0 个单元都不是内部结点,不属于树中的一员
    - winner 的第 0 个单元未用
    - m_tree 的第 0 个单元用于保存最终的赢者, 其它单元保存败者

    - 该初始化需要的 n-1 次比较,总的时间复杂度是 O(n)

    - 严蔚敏&吴伟民 的 LoserTree 初始化复杂度是 O(n*log(n)),并且还需要一个 min_key,
      但是他们的初始化不需要额外的 winner 数组

    - 并且,这个实现比 严蔚敏&吴伟民 的 LoserTree 初始化更强壮
     
*/

    
void init(RandIterOfInput first, RandIterOfInput last,
              
const KeyType& max_key,
              
const Compare& comp = Compare(),
              
const KeyExtractor& keyExtractor = KeyExtractor())
    
...{
        m_comp 
= comp;
        m_key_extractor 
= keyExtractor;

        m_beg 
= first;
        m_end 
= last;

        m_max_key 
= max_key;

        
int len = int(last - first);
        
if (0 == len)
        
...{
            
throw std::logic_error("LoserTree: way sequence must not be empty");
        }


        m_tree.resize(len);

        
this->resize_cache(len);

        
int i;
        
for (i = 0; i != len; ++i)
        
...{
            
// read first value from every sequence
            this->input_cache_item(i, *(first+i));
        }

        
if (1 == len)
        
...{
            m_tree[
0= 0;
            
return;
        }


        
int minInnerToEx = len / 2;

        std::vector
<int> winner(len);

        
for (i = len - 1; i > minInnerToEx; --i)
        
...{
            exter_loser_winner(m_tree[i], winner[i], i, len);
        }

        
int left, right;
        
if (len & 1// odd
        ...// left child is last inner node, right child is first external node
            left = winner[len-1];
            right 
= 0;
        }

        
else
        
...{
            left 
= 0;
            right 
= 1;
        }

        get_loser_winner(m

 

项目地址:http://code.google.com/p/febird

 

分享到:
评论

相关推荐

    01 LoserTree.zip

    在"01 LoserTree.zip"这个压缩包中,我们很可能是找到了关于Loser Tree的详细实现代码和相关解释。 首先,理解Loser Tree的概念至关重要。Loser Tree是一种基于二叉堆的数据结构,它通过将每个节点与其左、右子节点...

    01 LoserTree.rar

    《严蔚敏数据结构与算法实现:Loser Tree解析》 在计算机科学中,数据结构与算法是构建高效软件的基础,而严蔚敏教授的教材《数据结构》因其深入浅出的讲解,一直以来都是该领域的重要参考书。本篇文章将重点解析...

    LoserTreeOfC++

    【Loser Tree in C++】 Loser Tree,也称为最小堆树或败者树,是一种数据结构,主要用于高效地维护一组动态最小值。在计算机科学中,它常用于实现快速的优先队列,特别是在最坏情况下需要保持低时间复杂度的操作,...

    数据结构课设_sdu_cs_大二_输者树外排序代码

    而"losertree.h"应该是头文件,包含了输者树相关的类定义和函数声明,供其他文件引用。 在这个课设中,学生将学习到如何利用数据结构优化算法,理解输者树的工作原理,以及如何将理论应用于解决实际的大数据排序...

    Text Clustering

    - 多路归并算法(Heap OR Loser Tree),其时间复杂度为\(O(m \log n)\),其中\(m\)是\(DocID, freq\)的数量,\(n\)是特征向量大小或归并方式的数量。 - Loser Tree相比堆更快约20%,但需要设置一个无限大的文档ID...

    (6条消息)VMware15 + Ubuntu18.04安装_Elio_LosEr的博客-CSDN博客.html

    (6条消息)VMware15 + Ubuntu18.04安装_Elio_LosEr的博客-CSDN博客.html

    数据结构源代码 严蔚敏版本的

    - `LoserTree` 类型定义:用于表示loser树,这里是一个整型数组。 - `External` 类型定义:用于表示外部节点,即输入流中的元素。 #### 4.2 函数实现 - `InsertSort` 函数:实现简单的插入排序,用于预处理输入流...

    初中语文文摘历史校园loser韩寒

    8. 社会接受度与变革:韩寒的成功挑战了社会对“winner”和“loser”的刻板印象,推动了社会对多元化才能和非传统成功路径的接纳和理解。 总结:韩寒的故事揭示了教育体制的局限性,提倡对个体差异的尊重和多元化...

    初中语文文摘历史爱情loser蔡琴

    【标题】和【描述】中提到的“初中语文文摘历史爱情loser蔡琴”似乎是一个故事,讲述了蔡琴在经历人生低谷时如何通过朋友们的帮助重新找回自信的故事。这个故事的核心知识点是关于个人优势和成功的关系,以及如何...

    Billion Dollar Loser-crx插件

    语言:English 假新闻以您的方式 如果您讨厌您的新闻提要,并且希望它可以得到解决,那么此扩展名适合您。 您可以选择自己讨厌的独裁者,每当他们的名字出现在页面上时,它将更改为您想要的任何名称。...

    mn10300-06062717_loser

    IDA Pro mn103处理器模块源码

    bot1-loser

    OPAAA LOSER机器人 :crocodile: 费拉门塔斯 &gt; Termux &gt; WhatsApp &gt; 2 Celulares 在上获取BarBarKey 安装 Siga os passos abaixo! &gt; termux-setup-storage (depois disso toque na permissão) &gt; apt install git &gt;...

    外部排序算法

    这个过程中使用败者树(Loser Tree)结构来高效地找到最小元素。败者树是一种二叉堆结构,每个节点代表一个输入序列中的元素,每次比较选出最小的元素,直到所有元素都被取出。这样可以保证合并过程的时间复杂度为O...

    loser:一个二维鸭模拟器

    cd loser # If you have a bash environment, ./gradlew :desktop:run # On windows, gradlew.bat :desktop:run 视频 游戏演示视频: 游戏内控制台演示视频: 执照 所有软件代码均在下获得许可。 所有艺术资产均...

    LOSER:星际争霸2 AI

    失败者(学习操作策略选举机器人) 星际争霸2 AI提案与报告设置此设置假定您使用的计算机运行的是Linux操作系统,并且运行的是python 3.5+设置Starcraft 2无头环境转到并按照其有关安装protobuf环境的说明进行操作。...

    biggest-loser:健身目标追踪器

    "Biggest Loser"是一个健身目标追踪器应用,它的命名可能源自流行的电视节目,该节目激励参与者通过健康饮食和锻炼来实现体重减轻的目标。在这个项目中,我们将关注它如何使用JavaScript这一编程语言来实现功能。 ...

    The-Biggest-Loser:最大的输家 DSDSi 漏洞

    最大的输家利用最大的输家。 如果您在 DSi 或 3DS 系统上使用真实卡带,则在 DSi 模式下运行,否则,它将在 DS 模式下运行。 支持美国和欧盟地区。 阅读更多。

    惠普打印机驱动M1005

    HP loser jetM1005打印机的驱动程序

    毕业设计反病毒虚拟机源码-Loser-s-Economics-and-works-of-neo-anderson:你知道,我知道

    Loser-s-Economics-and-works-of-neo-anderson You know, I know [ { "tips": "该文件的功能为 时间范围、中断下载等功能做准备,现在暂时用不到,您可以随时删除该文件", "totla": 10, "list": [ { "comm_msg_info":...

    山峰蓝色图层效果PPT模板.pptx

    7. **对比与总结**:Part 4中设有“Winner”、“Runner”和“Loser”的占位,适合进行比较分析,比如项目评估或竞争者分析,用户可以列出优胜者、亚军及落后者的特征或表现。 8. **设计元素**:山峰的形象象征着...

Global site tag (gtag.js) - Google Analytics