精华内容
下载资源
问答
  • 哈夫曼树也叫做最优二叉树。。如果扩充二叉树的外部节点都带有一定...(摘抄自算法与数据结构课本)。 而关于哈夫曼树的应用,有哈夫曼编码与二路归并排序。。哈夫曼编码就是比如说要用二进制编译一段文字编码。。所以就

    哈夫曼树也叫做最优二叉树。。如果扩充二叉树的外部节点都带有一定的权值,可将外部路径长度这一概念加以推广。设扩充二叉树具有m个带权值的外部节点,那么从根节点到各个外部节点的路径长度与相应结点权值的乘积的和,叫做扩充二叉树的带权的外部路径长度。。记作WPL。。。(摘抄自算法与数据结构课本)。

    而关于哈夫曼树的应用,有哈夫曼编码与二路归并排序。。哈夫曼编码就是比如说要用二进制编译一段文字编码。。所以就需要把出现频率比较高的字符的编码放在靠近根结点的位置,这样的话,想要找到该字符的编码就能够节省相当一部分篇幅了。。。而二路归并排序就是说有n个已经排序的文件,每个文件包含的记录个数都已知可以采用两两合并的方法,把所有的文件的记录合到一个大文件中去,使得这个文件中的记录全部排序。。

    说了这么多,,有没有赶脚到挺迷惑的啊。哈哈,直接上代码吧。。。

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    #include <map>
    #include <queue>
    #include <stack>
    #define INF 0x3f3f3f3f
    #define mem(a,b) memset(a,b,sizeof(a));
    #define For(a,b) for(int i = a;i<b;i++)
    #define LL long long
    #define MAX_N 100010
    using namespace std;
    struct HfNode
    {
        int oval;
        int lchil;
        int rchil;
        int par;
    };
    struct HfTree
    {
        int m;
        int root;
        struct HfNode * ht;
    };
    typedef struct HfTree * PHtTree;
    PHtTree Pht;
    PHtTree huffman(int num,int *w)
    {
        /*
            申请指向哈夫曼数的指针
        */
        Pht = (PHtTree)malloc(sizeof(HfNode));
        if(Pht == nullptr)
        {
            cout<<"Out of space"<<endl;
            return Pht;
        }
        /*
    
            申请对于该哈夫曼树的一个空间是 ——  2*num-1 ——
            的顺序线性表空间
    
        */
        Pht->ht = (HfNode *)malloc(sizeof(HfNode) * (2 * num - 1));
        if(Pht->ht == nullptr)
        {
            cout<<"Out of space"<<endl;
            return Pht;
        }
        /*
    
            该for循环是给顺序线性表中的各元素初始化或者说叫作标记
        */
        for(int i = 0; i<2*num-1; i++)
        {
            Pht->ht[i].lchil = -1;
            Pht->ht[i].rchil = -1;
            Pht->ht[i].par = -1;
            if(i<num) Pht->ht[i].oval = w[i];
            else Pht->ht[i].oval = -1;
        }
        /*
    
            该for循环是将一个最佳的哈夫曼树在顺序链表中存储
    
        */
        for(int i = 0; i<num-1; i++)
        {
            int m1 = INF,m2 = INF;
            int x1 = -1,x2 = -1;
            for(int j = 0; j<num + i; j++)
            {
                if(Pht->ht[j].oval < m1 && Pht->ht[j].par == -1)
                {
                    m2 = m1;
                    x2 = x1;
                    x1 = j;
                    m1 = Pht->ht[j].oval;
                }
                else if(Pht->ht[j].oval < m2 && Pht->ht[j].par == -1)
                {
                    m2 = Pht->ht[j].oval;
                    x2 = j;
                }
            }
            Pht->ht[x1].par = num + i;
            Pht->ht[x2].par = num + i;
            Pht->ht[num + i].oval = m1 + m2;
            Pht->ht[num + i].lchil = x1;
            Pht->ht[num + i].rchil = x2;
        }
        Pht->root = 2*num-2;
        return Pht;
    }
    int main()
    {
        Pht = nullptr;
        int w[4] = {9,6,3,2};
        huffman(4,w);
        int WPL = 0,WPL2 = 0;
        /*
    
            从外部结点入手,计算带权最短外部路径长度
    
        */
        for(int i = 0; i<4; i++)
        {
            int ways = 0;
            int parent = 0;
            int cur = i;
            /*
    
                该while循环是为了找到此外部节点到根结点的路径距离
    
            */
            while(parent != -1)
            {
                ways++;
                parent = Pht->ht[cur].par;
                cur = parent;
            }
            ways--;
            WPL += (Pht->ht[i].oval*ways);
        }
        cout<<"第一种扩充二叉树的带权的最短外部路径长度:"<<WPL<<endl<<endl;
        /*
    
            从内部结点入手,计算带权最短外部路径长度
    
        */
        for(int i = 0; i<2*4-1; i++)
        {
            /*
    
                判断是否是扩充二叉树的内部节点。是则加,否则不处理。。
                而且,如果把i的初始值改为4,则不需要判断,可直接加。。
    
            */
            if(Pht->ht[i].lchil != -1 && Pht->ht[i].rchil != -1)
            {
                WPL2 += Pht->ht[i].oval;
            }
        }
        cout<<"第二种扩充二叉树的带权的最短外部路径长度:"<<WPL2<<endl<<endl;
        return 0;
    }
    

    展开全文
  • RT,我在写代码时碰到一个以下问题: 1.类A 的无参构造方法中 调用 有参构造y

    RT,我在写代码时碰到一个以下问题:

    1.类A 的无参构造方法中 调用 有参(参数类型为B)构造方法,出现了以下问题.

    2.1.若B为A的内部类,则编译出错

    2.2.若B为普通类,则无问题.

    代码如下:


    内部类:

    public class A1 {
    	B1 b;
    
    	public A1() {
    		this(new B1());//此处编译出错
    	}
    
    	public A1(B1 b) {
    		this.b = b;
    	}
    
    	public class B1 {
    	}
    }

    普通类:

    public class A2 {
    	B2 b;
    
    	public A2() {
    		this(new B2());//此处没有问题
    	}
    
    	public A2(B2 d) {
    		this.b = d;
    	}
    }
    
    class B2 {
    }


    有什么解决办法吗?

    1. 把内部类B改成 static

    2.因为一些原因,内部类B不能是static,有什么别的解决办法吗?


    补充:


    内部类这么写也没问题:

    public class A1 {
    	B1 b;
    
    	public A1() {
    		b=new B1();//这么写没问题.
    //		this(new B1());
    	}
    
    	public A1(B1 b) {
    		this.b = b;
    	}
    
    	public class B1 {
    	}
    }
    

    参数资料:

    http://blog.csdn.net/shuixin536/article/details/8989776

    http://stackoverflow.com/questions/2741066/why-does-a-sub-class-class-of-a-class-have-to-be-static-in-order-to-initialize-t

    展开全文
  • 私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有...

    私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量.

    然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明:

    疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误?

    class CTest {
    public:
        CTest(int i); 
        CTest(const CTest& rhs);
        CTest& operator=(const CTest& rhs);
        void printCTest(const CTest& rhs);
    private:
        int value;
    };
    
    CTest::CTest(int i):value(i)
    {
        cout<<"Contructor of CTest"<<endl;
    }
    
    CTest::CTest(const CTest& rhs):value(rhs.value)
    {
        cout<<"Copy contructor of CTest"<<endl;
    }
    
    CTest& CTest::operator=(const CTest& rhs)
    {
        cout<<"Assign function of CTest"<<endl;
        if(this == &rhs)
            return *this;
        value = rhs.value;                //通过对象访问私有成员变量
        return *this;
    }
    
    void CTest::printCTest(const CTest& rhs)
    {
        cout<<rhs.value<<endl;        //通过对象访问私有成员变量
    }
    
    int main()
    {
        CTest t = 1;
        CTest tt = 2;
        //  cout<<t.value<<endl;        //通过对象访问私有成员变量,编译错误
        //  cout<<tt.value<<endl;        //通过对象访问私有成员变量,编译错误
        t.printCTest(tt);
    }

    产生这种疑惑的原因是自己对私有成员变量的理解有误,封装是编译期的概念,是针对类型而非对象的,在类的成员函数中可以访问同类型实例对象的私有成员变量

    具体的解析如下:从变量value的符号是怎么解析的分析

    1.确定符号的查找域

    如第26行代码,当编译器发现value变量时,它会在value变量所属的对象rhs的类域中寻找该符号.

    2.确定当前域中哪些符号可以访问

    由第1步可知,当前查找的域是类域,而printCTest函数在CTest类体中,所以printCTest可以访问CTest类中的所有变量(包括私有成员变量),因而value符号在CTest类域中被找到.

    如第39行代码,main函数不在CTest类体中,所以main函数不可以访问CTest类域中的私有成员变量.

    3.符号已查找到,编译通过

    类成员变量的访问权限是编译器强加的,编译器可以找到value,通过编译,自然就可以访问到value变量的值.

    直觉上,我们会以为第26行代码中value符号的查找域应该是对象rhs对应的作用域,然而C++编译器的实现却是在对象rhs的类域查找value符号.

    启发:有些直觉是靠不住的,需要深入分析其背后的实现原理,才可以理解透彻.

     

    原文链接:https://www.cnblogs.com/woshizhizhong-tech/p/8450475.html

    展开全文
  •         
    
    展开全文
  • HIT 软件构造 抽象数据类型

    千次阅读 2019-06-12 17:14:42
    抽象数据类型(ADT) ...直接构造出一个新的对象,可以参数,但是不能直接将参数作为返回值 可能实现为构造函数或者静态函数 producer 生产器 基于旧的对象生成新的对象 observer 观察器 查看rep的...
  • public class Car{ String type; //属性1,类型 String colour; //属性2,颜色 String id; // 属性3,车牌号 ... //构造方法1 ----无参数构造方法 public Car(){} //构造方法2 ----...
  • PostMan导入 csv、json 外部数据

    千次阅读 2019-04-12 14:56:38
    PostMan导入 csv、json 外部数据 一、使用场景 postman 支持导入外部数据(csv 格式或 json 格式),使用外部数据循环执行某一组 collection ,实现了业务和测试数据分离。构造测试数据满足了一个接口边界值覆盖测试...
  • 文章目录概述调用顺序Feign构造参数GET请求Feign构造参数POST请求 概述 Spring Cloud-06服务消费者整合Feign中将消费者和Feign整合在了一起,示例中Feign客户端接口中的参数只有1个,如下 实际开发中,多个请求...
  • 什么是构造函数 建立一个对象时,通常最需要立即做的工作是初始化对象,如对数据成员赋初值 构造函数就是用来在创造对象时初始化对象,为对象数据成员赋初始值
  • 面向对象编程的Java,类(或者类实例...参数外部的,可以影响类内部属性的状态,简单的说就是影响属性值的变化。类中的属性是随着类实例的创建而产生并存在的。不依赖于外部参数,尽管属性可能没有值。操作数据都是
  • 数据结构——外部排序

    千次阅读 2015-10-30 16:43:43
    之前有写过内部排序,这次看到严蔚敏老师的书上还介绍了外部排序,就一起记录一下,以便以后可以看看: 1.外部排序 外部排序是指数据量很大,一下子不能将所有的数据放入内存里面进行排序,只能一部分一部分从硬盘中...
  • spark2.0中,提供了两种扩展外部数据源的接口, 第一种外部数据源为文件,第二种外部数据源为系统 spark内部调用外部数据源包的类是下面,包括解析BaseRelation,提取schema等 package org.apache.spark.sql....
  • 1.标准构造函数,可选参数,默认参数,初始化列表,命名构造函数,工厂构造函数,命名工厂构造函数,get,set,静态方法,抽象方法,抽象类 //所有的类都继承自Object class Person { String name; int age; Person(this....
  • Effective Java学习笔记 通过使用Builder模式,解决构造函数中参数过多的问题
  • 新手小白学JAVA 面向对象2 构造函数 构造代码块 this

    万次阅读 多人点赞 2021-05-10 08:34:24
    构造方法与普通方法一样也可以重载. 1.2 形式 与类同名,且没有返回值类型,可以含参也可以不含参 1.3 练习:构造方法创建对象/构造方法赋值 创建包: cn.tedu.oop 创建类: TestConstructor.java package cn.tedu.oop;...
  • [c#]基类中不包含0个参数构造函数

    千次阅读 2016-01-05 19:46:33
    由于好久没摸代码了 最近忙着找工作又重新写点基础的...其实这里的构造函数如果参数后面不写东西的话那就会默认调用父类的无参数构造函数的 但是由于父类的构造函数我把无参的构造函数覆盖了所以就出现了调用不到的情
  • Java构造方法和子类构造方法

    千次阅读 多人点赞 2019-07-21 23:50:09
    Java构造方法 构造方法是用于初始化一个新建的对象。 普通构造方法 方法名与类名相同 无返回类型 子类不能继承父类的构造方法 不能被static、final、abstract修饰(有final和abstract修饰的是不能被子类继承的,...
  • Kotlin的主构造方法和从构造方法

    千次阅读 2019-07-31 01:51:07
    目录前言正文区别 前言 这个知识点不太清晰,写文章记录一下。 正文 区别 声明位置不同:主构造器通常是主要而简洁的初始化类的方法,在类体外部声明;从构造器在类体内部声明。 ...
  • @1、实例构造函数: #1:若构造函数有修饰符extern,则表示该构造函数为外部构造函数,外部构造函数不提供任何实际的实现,函数体中仅由一个分号组成。一般情况下,构造函数总是public类型,若为private类型,表明...
  • scala主构造函数中参数加val/var和不加的区别 不加val或var 此时该参数只能作为类的不可变参数使用,外部无法访问该变量 ...当构造参数前加上var或val时,该参数由不可变参数变成成员变量,外部可以调用 ...
  • 特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。 1.2 C++构造函数 C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造...
  • 【java基础】构造器是啥?有啥用?

    千次阅读 2019-06-08 16:08:57
    不过即使在创建对象时没有写构造器也不用担心,因为系统会默认提供一个无参数构造器。此构造器能对各种数据类型进行赋初值。 类型 初始值 数值类型 0 布尔类型 false 引用类型 null 自定义...
  • 软件构造:01-软件构造基础

    千次阅读 2019-02-25 21:21:54
    软件构造之软件构造基础注意从多维视角看软件构造(Multi-Dimensional Views of Software Construction)引言关键从哪些维度来看软件构造编程时、某一时刻、代码视角编程时、某一时期、代码视角编程时、某一时刻、...
  • 利用Python读取外部数据文件

    千次阅读 2019-04-07 16:46:24
    利用Python进行数据分析,同样最重要的一步就是如何将数据导入到Python中,然后才可以实现后面的数据分析、数据可视化、数据挖掘等。 在本期的Python学习中,我们将针对Python如何获取外部数据做一个详细的介绍,...
  • 转换构造函数

    千次阅读 2017-12-26 14:56:13
    通常使用转换构造函数将一个指定的...2、在这个类中定义一个只有一个参数构造函数,参数是待转换类型的数据,在函数体中指定转换的方法**#include using namespace std; class complex { public: complex() { }
  • 构造函数就是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。拷贝构造函数是一种特殊的构造函数,用基于同一类的一个对象构造和初始化另一个对象。当一个类的对象向该类的另一个对象赋值时...
  • java 构造函数有很多参数如何做

    千次阅读 2018-02-23 10:25:27
    有个例子,过多的参数构造函数时,写法。有多种有好有坏。http://blog.csdn.net/lms1719/article/details/70741691这里的第三种写法是推荐的。只是这里写成了内部类了。我还不清楚是写成外部类好还是内部类好。...
  • 2)静态成员数据必须有确定的值,但由于在类的定义中不能对成员数据直接进行初始化,故必须在类定义的外部对静态成员数据再声明一次,并进行初始化,此时,前面不需要加关键字static。同时为了保持静态成员数据取值...
  • Scala之主构造函数

    万次阅读 2016-03-15 19:10:19
    构造函数首先,我们必须要非常清晰明确的认识到:主构造函数不是你看到class后面跟的参数列表,那怎么可能是主构造函数呢?那只是主构造函数的函数列表!那主构造函数的函数体在那里呢?答案是:class body里所有...
  • 2静态构造函数,不能访问实例成员,只能用来初始化一些静态字段或者属性,仅在第一次调用类的任何成员时自动执行,不带访问修饰符,不带任何参数,每个类只能有一个静态构造函数,但可以同时还有一个无参实例构造...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 342,929
精华内容 137,171
关键字:

哪些数据是外部可以构造的