zoukankan      html  css  js  c++  java
  • 编程珠玑笔记第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,桶,相当于位向量和有序链表的结合,相对于位向量使用较少的空间,代价是速度变慢

      

  • 相关阅读:
    Struts22222
    Struts2
    Java事务的概念
    Java设计模式之单例模式
    Spring的大框架
    mybatis大框架
    springmvc和spring的区别
    JavaScript-原型&原型链&原型继承&组合函数
    美丽的CSS图形和HTML5
    易买网项目的总实现超级详解
  • 原文地址:https://www.cnblogs.com/mightofcode/p/2766853.html
Copyright © 2011-2022 走看看