- 浏览: 254236 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
satan_1st:
据说可以用(*this)取得当前的lambda。
Recursive Lambda in C++ -
febird:
微软不死, 天理难容
再抱怨一下Windows7 -
sunzixun:
很有见解ace也可以精简的,我们就用阉割版的
asio/ACE/apr/libevent -
febird:
hamo2008 写道用win7以来基本上没有遇到这种情况了我 ...
造 windows 的微软很脑残 -
hamo2008:
用win7以来基本上没有遇到这种情况了
造 windows 的微软很脑残
项目地址: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
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
发表评论
-
对数复杂度的聚集算法
2010-08-05 18:24 716SQL 有5个标准聚集函数:SUM, AVG, MIN, MA ... -
使用 std::map 查找 IP 范围
2010-08-05 17:40 1995给定这样一个问题: 有一组从IP范围到地理位置信息的数据 ... -
tcmalloc 要点
2010-02-22 11:33 1484google.tcmalloc 线程缓存(th ... -
my PipelineProcessor
2010-02-01 15:43 712刚看到,intel tbb::pipeline 实现的功能,和 ... -
简单的代码生成器创建领域语言
2010-02-01 14:30 1229有一类问题,代码模板相同,但有少部分地方不同,一般可以写一个复 ... -
理想的 lazy load
2010-01-12 20:21 757在linux中碰到一个问题,可以描述如下 编译 liba.s ... -
字符串基数排序
2009-12-09 22:00 1810对字符串使用基数排序,以前,我一直觉得:因为字符串的长度不 ... -
内嵌变长数据结构范例——trbstrmap<mapped>
2009-11-03 17:43 800以前的这篇文章介绍了嵌入的变长数据结构(embeded ... -
memory pool 的高效实现
2009-10-23 02:40 2776memory pool malloc可以分配任意大小的内存, ... -
memory pool 的高效实现(代码)
2009-10-23 03:01 6748mpool.h #ifndef __febird_c_mpo ... -
可变长度数据结构
2009-09-27 17:12 1066固定长度的数据结构很简单,大家每天都在用。 可变长度数据结构 ... -
malloc/free 的开销,如何去掉这种开销?
2009-10-18 15:58 1846一般的malloc实现,对一块已分配的内存,都有两个机器字的簿 ... -
世界上应用最广泛的虚拟机是啥?
2009-10-18 16:19 859别说是JavaVM! 正确答案:x86vm x86本身是一 ... -
memory FILE in C
2009-06-30 17:18 976<script>function StorePag ... -
很基本也很诡异的fread, feof
2009-07-03 18:12 2993先看一段非常简单的程序: #include & ... -
Threaded Red-Black Tree 线索红黑树
2009-05-26 19:19 866项目地址:http://code.google.com/p/f ... -
C 语言实现的 stl-like 算法
2009-04-08 10:46 1031使用类似BOOST.PP技巧,自动生成代码,效率上小胜stl, ... -
使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数--在实际中的应用
2005-12-02 23:01 1149// 使用" 参数化基类" 和" ... -
千万注意,不要 hack std::string
2007-02-25 14:49 1059前段时间被一个bug折磨了两个星期,最后发现竟然是如此一个陷阱 ... -
一个很强大的Comparator生成器
2008-04-22 15:02 689项目地址:http://code.goog ...
相关推荐
在"01 LoserTree.zip"这个压缩包中,我们很可能是找到了关于Loser Tree的详细实现代码和相关解释。 首先,理解Loser Tree的概念至关重要。Loser Tree是一种基于二叉堆的数据结构,它通过将每个节点与其左、右子节点...
《严蔚敏数据结构与算法实现:Loser Tree解析》 在计算机科学中,数据结构与算法是构建高效软件的基础,而严蔚敏教授的教材《数据结构》因其深入浅出的讲解,一直以来都是该领域的重要参考书。本篇文章将重点解析...
【Loser Tree in C++】 Loser Tree,也称为最小堆树或败者树,是一种数据结构,主要用于高效地维护一组动态最小值。在计算机科学中,它常用于实现快速的优先队列,特别是在最坏情况下需要保持低时间复杂度的操作,...
而"losertree.h"应该是头文件,包含了输者树相关的类定义和函数声明,供其他文件引用。 在这个课设中,学生将学习到如何利用数据结构优化算法,理解输者树的工作原理,以及如何将理论应用于解决实际的大数据排序...
- 多路归并算法(Heap OR Loser Tree),其时间复杂度为\(O(m \log n)\),其中\(m\)是\(DocID, freq\)的数量,\(n\)是特征向量大小或归并方式的数量。 - Loser Tree相比堆更快约20%,但需要设置一个无限大的文档ID...
(6条消息)VMware15 + Ubuntu18.04安装_Elio_LosEr的博客-CSDN博客.html
- `LoserTree` 类型定义:用于表示loser树,这里是一个整型数组。 - `External` 类型定义:用于表示外部节点,即输入流中的元素。 #### 4.2 函数实现 - `InsertSort` 函数:实现简单的插入排序,用于预处理输入流...
8. 社会接受度与变革:韩寒的成功挑战了社会对“winner”和“loser”的刻板印象,推动了社会对多元化才能和非传统成功路径的接纳和理解。 总结:韩寒的故事揭示了教育体制的局限性,提倡对个体差异的尊重和多元化...
【标题】和【描述】中提到的“初中语文文摘历史爱情loser蔡琴”似乎是一个故事,讲述了蔡琴在经历人生低谷时如何通过朋友们的帮助重新找回自信的故事。这个故事的核心知识点是关于个人优势和成功的关系,以及如何...
语言:English 假新闻以您的方式 如果您讨厌您的新闻提要,并且希望它可以得到解决,那么此扩展名适合您。 您可以选择自己讨厌的独裁者,每当他们的名字出现在页面上时,它将更改为您想要的任何名称。...
IDA Pro mn103处理器模块源码
OPAAA LOSER机器人 :crocodile: 费拉门塔斯 > Termux > WhatsApp > 2 Celulares 在上获取BarBarKey 安装 Siga os passos abaixo! > termux-setup-storage (depois disso toque na permissão) > apt install git >...
这个过程中使用败者树(Loser Tree)结构来高效地找到最小元素。败者树是一种二叉堆结构,每个节点代表一个输入序列中的元素,每次比较选出最小的元素,直到所有元素都被取出。这样可以保证合并过程的时间复杂度为O...
cd loser # If you have a bash environment, ./gradlew :desktop:run # On windows, gradlew.bat :desktop:run 视频 游戏演示视频: 游戏内控制台演示视频: 执照 所有软件代码均在下获得许可。 所有艺术资产均...
失败者(学习操作策略选举机器人) 星际争霸2 AI提案与报告设置此设置假定您使用的计算机运行的是Linux操作系统,并且运行的是python 3.5+设置Starcraft 2无头环境转到并按照其有关安装protobuf环境的说明进行操作。...
"Biggest Loser"是一个健身目标追踪器应用,它的命名可能源自流行的电视节目,该节目激励参与者通过健康饮食和锻炼来实现体重减轻的目标。在这个项目中,我们将关注它如何使用JavaScript这一编程语言来实现功能。 ...
最大的输家利用最大的输家。 如果您在 DSi 或 3DS 系统上使用真实卡带,则在 DSi 模式下运行,否则,它将在 DS 模式下运行。 支持美国和欧盟地区。 阅读更多。
HP loser jetM1005打印机的驱动程序
Loser-s-Economics-and-works-of-neo-anderson You know, I know [ { "tips": "该文件的功能为 时间范围、中断下载等功能做准备,现在暂时用不到,您可以随时删除该文件", "totla": 10, "list": [ { "comm_msg_info":...
7. **对比与总结**:Part 4中设有“Winner”、“Runner”和“Loser”的占位,适合进行比较分析,比如项目评估或竞争者分析,用户可以列出优胜者、亚军及落后者的特征或表现。 8. **设计元素**:山峰的形象象征着...