编程珠玑笔记第13章

本章讨论的问题:如何存储一组整数

具体内容是:实现一个数据结构,能进行插入和按序输出

几种实现:

1,c++的set

2,有序数组,必须首先知道最大空间,查找的效率是O(ln(n))插入的效率是O(n)

3,有序链表,查找效率是O(n),插入为O(1),链表可以使用迭代进行搜索,也可以使用组分配进行优化,即预先分配一大块内存,而不是去申请许多小内存

4,二分查找树,快速查找,快速插入,但是最坏情况下效率为O(n)

View Code
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),排序也是最快的,但是消耗很多内存,而且无法处理重复元素(或许可以单独记录重复元素)

View Code
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,桶,相当于位向量和有序链表的结合,相对于位向量使用较少的空间,代价是速度变慢

  

原文地址:https://www.cnblogs.com/mightofcode/p/2766853.html