本章讨论的问题:如何存储一组整数
具体内容是:实现一个数据结构,能进行插入和按序输出
几种实现:
1,c++的set
2,有序数组,必须首先知道最大空间,查找的效率是O(ln(n))插入的效率是O(n)
3,有序链表,查找效率是O(n),插入为O(1),链表可以使用迭代进行搜索,也可以使用组分配进行优化,即预先分配一大块内存,而不是去申请许多小内存
4,二分查找树,快速查找,快速插入,但是最坏情况下效率为O(n)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
struct BTNode { int n; BTNode* l; BTNode* r; BTNode(int _a) { l=r=NULL; n=_a; } }; class BinaryTree { public: BinaryTree(); void insert(int n); void print(); private: BTNode* insert(int a,BTNode* n); void print(BTNode* n); BTNode* m_root; }; void BinaryTree::insert( int n ) { m_root=insert(n,m_root); } BTNode* BinaryTree::insert( int a,BTNode* n ) { if(n==NULL) return new BTNode(a); else { if(a>n->n) { n->r=insert(a,n->r); }else if(a<n->n) { n->l=insert(a,n->l); } } return n; } void BinaryTree::print() { print(m_root); printf("\n"); } void BinaryTree::print( BTNode* n ) { if (n==NULL)return; print(n->l); printf("%d ",n->n); print(n->r); } BinaryTree::BinaryTree() { m_root=NULL; }
5,位向量,查找和删除的速度都是O(1),排序也是最快的,但是消耗很多内存,而且无法处理重复元素(或许可以单独记录重复元素)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class BitVector { public: BitVector(int nmax) { m_buff=new int[(nmax>>5)+1]; memset(m_buff,0,((nmax>>5)+1)*sizeof(int)); m_len=(nmax>>5)+1; } void insert(int a) { m_buff[a>>5]|=1<<(a&0x1f); } void report() { for (int i=0;i<m_len;i++) { int v=m_buff[i]; for (int j=0;j<32;j++) { if(v&(1<<j)) { printf("%d ",(i<<5)+j); } } } printf("\n"); } private: int m_len; int* m_buff; };
6,桶,相当于位向量和有序链表的结合,相对于位向量使用较少的空间,代价是速度变慢