[英]C++ STL: Binary Search Tree Implementation?
如果C ++ STL包含二进制搜索树(BST)实现,或者我应该构建自己的BST对象,请知道吗?
如果STL没有实施BST,是否有可用的库?
我的目标是能够尽快找到所需的记录:我有一个记录列表(它不应该是几千个。),我在该列表中执行每帧(它的计算机游戏)搜索。 我使用unsigned int作为我感兴趣的记录的标识符。 无论什么方式,最快的将最适合我。
您需要的是一种在给定密钥的情况下查找某些数据的方法。 密钥是unsigned int
,这为您提供了多种可能性。 当然,你可以使用std::map
:
typedef std::map<unsigned int, record_t> my_records;
但是,还有其他可能性。 例如, 哈希映射很可能比二叉树更快 。 散列映射在C ++中称为unordered_map
,并且是C ++ 11标准的一部分,可能已经被编译器/ std lib支持(检查编译器版本和文档)。 它们首先在C ++ TR1中可用( std::tr1::unordered_map
)
如果您的密钥分布相当紧密,您甚至可以使用简单的数组并使用密钥作为索引。 当涉及到原始速度时,没有什么能够将索引编入数组。 OTOH,如果你的密钥分配太随意,你就会浪费很多空间。
如果将记录存储为指针 ,那么移动它们很便宜,另一种方法可能是将数据按键在向量中排序:
typedef std::vector< std::pair<unsigned int, record_t*> > my_records;
由于其更好的数据局部性(可能与处理器缓存相关),简单的std::vector
通常比理论上应该具有优势的其他数据结构表现更好。 它的弱点是从中间插入/移出。 但是,在这种情况下,在32位系统上,这需要移动2 * 32bit POD的条目,您的实现可能会通过调用CPU内在函数来执行内存移动。
std::set
和std::map
通常实现为红黑树,它们是二叉搜索树的变体。 细节是依赖于实现的。
CPP中简洁明了的BST实现:
struct node {
int val;
node* left;
node* right;
};
node* createNewNode(int x)
{
node* nn = new node;
nn->val = x;
nn->left = nullptr;
nn->right = nullptr;
return nn;
}
void bstInsert(node* &root, int x)
{
if(root == nullptr) {
root = createNewNode(x);
return;
}
if(x < root->val)
{
if(root->left == nullptr) {
root->left = createNewNode(x);
return;
} else {
bstInsert(root->left, x);
}
}
if( x > root->val )
{
if(root->right == nullptr) {
root->right = createNewNode(x);
return;
} else {
bstInsert(root->right, x);
}
}
}
int main()
{
node* root = nullptr;
int x;
while(cin >> x) {
bstInsert(root, x);
}
return 0;
}
STL的集合类通常实现为BST。 它不是保证(唯一的是它的签名, template < class Key, class Compare = less<Key>, class Allocator = allocator<Key> > class set;
)但这是一个非常安全的赌注。
你的帖子说你想要速度(大概是为了更紧密的游戏循环)。
那么为什么要浪费时间在这些缓慢的糖蜜O(lg n)结构上并进行哈希映射实现呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.