泛型Binary Search Tree实现,And和STL map比较的经营业绩

泛型Binary Search Tree实现,And和STL map比较的经营业绩

大家好,又见面了,我是全栈君。

问题叙述性说明:

1.binary search tree它是一种二进制树的。对于key值。比当前节点左孩子少大于右子。

 2.binary search tree不是自平衡树。所以,当插入数据不是非常随机时候,性能会接近O(N)。N是树中节点数目;

 3.理想状态下。时间复杂度是O(lgN), N是树中节点的数目;

4.以下给出一个简单的实现,并比較其和STL map的性能。一样的操作,大约耗时为STL map 的2/3。

代码例如以下:

#ifndef _BINARY_SEARCH_TREE_H_ #define _BINARY_SEARCH_TREE_H_ #include <functional> #include <algorithm> #include <iostream> #include <map> #include "windows.h" template<class T, class V, class Cmp = std::less<T> > class BinarySearchTree { public: // node struct typedef struct tagBSNode { T key; V value; tagBSNode* leftNode; tagBSNode* rightNode; tagBSNode():key(), value(), leftNode(0), rightNode(0) { } tagBSNode( const T& _key, const V& _value ):key(_key), value(_value), leftNode(0), rightNode(0) { } }BSTNode, *pBSTNode; /* * Constructor * */ BinarySearchTree():m_root(0), m_size(0) { } /* * Copy constructor * */ BinarySearchTree( const BinarySearchTree& rhs ) { m_root = Clone( rhs.m_root ); m_size = rhs.m_size; } /* * Destructor * */ ~BinarySearchTree() { Clear(); } /* * assignment operator overload * */ BinarySearchTree& operator = ( const BinarySearchTree& rhs ) { if( this != &rhs ) { Clear(); m_root = Clone( rhs.m_root ); m_size = rhs.m_size; } return *this; } /* * Clear all node * */ void Clear() { Clear( m_root ); m_size = 0; } /* * check whether or not empty * */ bool IsEmpty() const { return m_size == 0; } /* * Retrieve the number of node in tree * */ size_t Size() const { return m_size; } /* * * */ size_t GetSize() const // only for test { return Size( m_root ); } /* * Insert key and value pair to tree * */ void Insert( const T& key, const V& value ) { Insert( m_root, key, value ); } /* * Delete node from tree for given key * */ void Delete( const T& key ) { Delete( m_root, key ); } /* * Find element from tree for given key * */ V* Find( const T& key ) { pBSTNode node = Find( m_root, key ); if( node ) return &node->value; return 0; } /* * Find the the element of max key * */ V* FindMax( T& key ) { pBSTNode node = FindMax( m_root ); if( node ) { key = node->key; return &node->value; } return 0; } /* * Find the the element of min key * */ V* FinMin( T& key ) { pBSTNode node = FindMin( m_root ); if( node ) { key = node->key; return &node->value; } return 0; } /* * inoder traversal * */ void InorderVisitor( void (*visitor)( const T&, const V& ) ) { InorderVisitor( m_root, visitor ); } /* * preoder traversal * */ void PreOrderVisitor( void (*visitor)( const T&, const V& ) ) { PreOrderVisitor( m_root, visitor ); } /* * postoder traversal * */ void PostOrderVisitor( void (*visitor)( const T&, const V& ) ) { PostOrderVisitor( m_root, visitor ); } protected: /* * Implement clone operation * */ pBSTNode Clone( pBSTNode root ) { if( 0 == root ) return root; pBSTNode node = new BSTNode( root->key, root->value ); node->leftNode = Clone( root->leftNode ); node->rightNode = Clone( root->rightNode ); return node; } /* * Implement clear opreation * */ void Clear( pBSTNode& root ) { if( 0 == root ) return; Clear( root->leftNode ); Clear( root->rightNode ); delete root; root = 0; } /* * Retrieve the number of node by way of recursive * */ size_t Size( pBSTNode root ) const { if( 0 == root ) return 0; return 1 + Size( root->leftNode ) + Size( root->rightNode ); } /* * Implement insert operation * */ void Insert( pBSTNode& root,const T& key, const V& value ) { if( 0 == root ) { root = new BSTNode( key, value ); m_size++; } if( root->key < key ) { Insert( root->rightNode, key, value ); } else if( root->key > key ) { Insert( root->leftNode, key, value ); } } /* * Implement delete operation * */ void Delete( pBSTNode& root, const T& key ) { if( 0 == root ) return; if( root->key < key ) { Delete( root->rightNode, key ); } else if( root->key > key ) { Delete( root->leftNode, key ); } else { if( root->leftNode && root->rightNode ) { pBSTNode minNode = FindMin( root->rightNode ); root->key = minNode->key; root->value = minNode->value; Delete( root->rightNode, minNode->key ); } else { pBSTNode node = root; root = root->leftNode ? root->leftNode: root->rightNode; delete node; node = 0; m_size--; //very important } } } /* * Implement find operation * */ pBSTNode Find( pBSTNode root, const T& key ) { if( 0 == root ) return root; if( root->key < key ) { return Find( root->rightNode, key ); } else if( root->key > key ) { return Find( root->leftNode, key ); } else { return root; } } /* * Find implement no recursive * */ pBSTNode FindUtil( pBSTNode root, const T& key ) { if( 0 == root ) return root; pBSTNode cur = root; while( root ) { cur = root; if( root->key < key ) { root = root->rightNode; } else if( root->key > key ) { root = root->leftNode; } else { break; } } if( cur && cur->key == key ) return cur; return 0; } /* * Implement find max element operation * */ pBSTNode FindMax( pBSTNode root ) { if( 0 == root ) return root; while( root->rightNode ) { root = root->rightNode; } return root; } /* * Implement find min element operation * */ pBSTNode FindMin( pBSTNode root ) { if( 0 == root ) return root; while( root->leftNode ) { root = root->leftNode; } return root; } /* * Implement inorder traversal * */ void InorderVisitor( pBSTNode root, void (*visitor)( const T&, const V& ) ) { if( 0 == root ) return; InorderVisitor( root->leftNode, visitor ); visitor( root->key, root->value ); InorderVisitor( root->rightNode, visitor ); } /* * Implement preorder traversal * */ void PreOrderVisitor( pBSTNode root, void (*visitor)( const T&, const V& ) ) { if( 0 == root ) return; visitor( root->key, root->value ); InorderVisitor( root->leftNode, visitor ); InorderVisitor( root->rightNode, visitor ); } /* * Implement postorder traversal * */ void PostOrderVisitor( pBSTNode root, void (*visitor)( const T&, const V& ) ) { if( 0 == root ) return; InorderVisitor( root->leftNode, visitor ); InorderVisitor( root->rightNode, visitor ); visitor( root->key, root->value ); } protected: pBSTNode m_root; size_t m_size; }; /* * Test STL map * */ void TestSTLMapBST() { const int Len = 200000; //int key[Len]; //int value[Len]; int* key = new int[Len]; int* value = new int[Len]; for( int i = 0; i < Len; i++ ) { key[i] = i; value[i] = i; } std::random_shuffle( key, key + Len ); std::random_shuffle( value, value + Len ); unsigned long start = GetTickCount(); std::map<int, int> treeObj; for( int i = 0; i < Len; i++ ) { treeObj.insert( std::make_pair( key[i], value[i] ) ); } size_t count = treeObj.size(); for( int i = 0; i < Len; i++ ) { std::map<int, int>::iterator iter = treeObj.find( key[i] ); assert( iter != treeObj.end() ); assert( iter->second == value[i] ); } for( int i = 0; i < Len; i++ ) { if( !(i % 15) ) { treeObj.erase( key[i] ); std::map<int, int>::iterator iter = treeObj.find( key[i] ); assert( iter == treeObj.end() ); } } unsigned long interval = GetTickCount() - start; printf( " STL map consume time is %d \n", interval ); delete [] key; delete [] value; } /* * vistior function for output information when traversal tree * */ template<class T, class V> void Visitor( const T& key, const V& value ) { std::cout << "key: " << key << "," <<"value: " << value << std::endl; } /* * unit test * */ void TestBST() { const int Len = 200000; //int key[Len]; //int value[Len]; int* key = new int[Len]; int* value = new int[Len]; for( int i = 0; i < Len; i++ ) { key[i] = i; value[i] = i; } std::random_shuffle( key, key + Len ); std::random_shuffle( value, value + Len ); unsigned long start = GetTickCount(); BinarySearchTree<int, int> treeObj; for( int i = 0; i < Len; i++ ) { treeObj.Insert( key[i], value[i] ); } for( int i = 0; i < Len; i++ ) { int* val = treeObj.Find( key[i] ); assert( *val == value[i] ); } int minKey = -1; int* minValue = treeObj.FinMin( minKey ); assert( minKey == 0 ); int maxKey = -1; int* maxValue = treeObj.FindMax( maxKey ); assert( maxKey == Len - 1 ); size_t size = treeObj.Size(); assert( size == Len ); int flagCount = 0; for( int i = 0; i < Len; i++ ) { if( !(i % 15) ) { treeObj.Delete( i ); int* val = treeObj.Find( i ); assert( !val ); flagCount++; } } unsigned long interval = GetTickCount() - start; printf( " binary search tree consume time is %d \n", interval ); size = treeObj.Size(); size_t count = treeObj.GetSize(); BinarySearchTree<int, int> newTreeObj; for( int i = 0; i < 10; i++ ) { newTreeObj.Insert( key[i], value[i] ); } treeObj = newTreeObj; newTreeObj.Clear(); std::cout<< "begin inorder traversal " << std::endl; treeObj.InorderVisitor( Visitor<int, int> ); std::cout<< "begin postorder traversal " << std::endl; treeObj.PostOrderVisitor( Visitor<int, int> ); std::cout<< "begin preorder traversal " << std::endl; treeObj.PreOrderVisitor( Visitor<int, int> ); treeObj.Clear(); delete [] key; delete [] value; } void TestBSTSuite() { TestSTLMapBST(); TestBST(); } #endif 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116647.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java.Utils:AES-128-CBC 加密方式

    packagecom.boob.common.utils;importorg.apache.commons.codec.binary.Base64;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importjavax.crypto.BadPaddingException;importjavax.crypto….

  • java中scanner是什么意思_java中scanner是什么

    java中scanner是什么意思_java中scanner是什么java中的scanner是一个类,是用于扫描输入文本的新的实用程序;当在Eclipse中编写Java程序时,如果变量是需要手动输入的时候,此时就可以用到scanner类。java中的scanner是一个类,是用于扫描输入文本的新的实用程序。本篇文章将给大家详细介绍一下,感兴趣的朋友可以来了解一下。当我们在Eclipse中编写Java程序时,如果我们的变量是需要手动输入的时候,我们就可以用到sca…

  • elastic search面试题_elasticsearch实战

    elastic search面试题_elasticsearch实战1.什么是Elasticsearch?Elasticsearch是一个基于Lucene的搜索引擎。它提供了具有HTTPWeb界面和无架构JSON文档的分布式,多租户能力的全文搜索引擎。Elasticsearch是用Java开发的,根据Apache许可条款作为开源发布。2.ES中的倒排索引是什么?传统的检索方式是通过文章,逐个遍历找到对应关键词的位置。倒排索引,是通过分词策略,形成了词和文章的映射关系表,也称倒排表,这种词典+映射表即为倒排索引。其中词典中

  • c语言和java哪个好学_学java前要学C语言吗?java和C语言哪个好学?

    c语言和java哪个好学_学java前要学C语言吗?java和C语言哪个好学?在编程世界,只要一提到java,总会有人联想到C语言,仿佛这两者之间有着一种密不可分的联系,那么也会有外行人在选择学习编程时,会有类似于学java前是否需要学习C语言呢?或者说java和C语言哪个会比较好学?等等之类的问题。其实大家会有这样的问题倒也不奇怪,因为学习C语言就是在学习Java,因为C语言中至少80%的语法知识都被Java继承了。Java刚开始的前半部分,如数据类型、变量、流…

  • 0基础如何自学软件编程开发

    0基础如何自学软件编程开发0基础如何自学软件编程开发?学习软件编程首先需要选择一门编程语言,如C或JAVA语言,作为基础编程语言学习,掌握语言的逻辑,学习语法,其实编程实质上就是思路的运用,编程思路有了再想学习其他的编程语言就会变得顺风顺水。软件编程开发,对于现在的学生来讲到底有多重要呢?现在是互联网快速发展的时期,在几年前谁都没有想到人们在手机上就可以完成衣食住行等所有的活动,互联网也在慢慢的改变着未来一代人。互联网广泛覆盖了我们的生活,真正实现了“远在天边,近在眼前”,在我们的生活工作中都有互联网存在的身影,随着IT行业的越

  • ubuntu支持的文件系统类型_常见的文件系统有哪两种

    ubuntu支持的文件系统类型_常见的文件系统有哪两种文件系统类型在windows中我们常见的磁盘格式有fat16、fat32和ntfs。但是windows的文件管理显得有些赘余,为打开一个文件需要打开n个地方,在一个角落里找。而且windows本身对于其他系统的文件格式就更差了,没有听说在windows里打开ext3或者mac日志式。windows是一个封闭的系统。在ubuntu中其文件系统广泛使用ext3的文件格式,从而实现了将整个

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号