精华内容
下载资源
问答
  • c++ 构造函数详解

    万次阅读 多人点赞 2019-05-31 17:20:58
    c++构造函数详解。(构造函数的分类、拷贝构造函数)

    c++ 构造函数详解

    构造函数是干什么的

    • 该类对象被创建的时候,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员

    构造函数的分类

    • 无参构造函数
    • 带默认值的构造函数
    • 有参(无默认值)的构造函数
    • 复制构造函数(拷贝构造函数)
      • 一种特殊的构造函数,当对象之间复制时会自动调用拷贝构造函数
      • 若类中没有显示定义拷贝构造函数,则系统会自动生成默认拷贝构造函数
    	#include <iostream>
    	using namespace std;
    	
    	class Coordinate
    	{
    	public:
    		// 无参构造函数
    		// 如果创建一个类你没有写任何构造函数,则系统自动生成默认的构造函数,函数为空,什么都不干
    		// 如果自己显示定义了一个构造函数,则不会调用系统的构造函数
    		Coordinate()
    		{
    			c_x = 0;
    			c_y = 0;
    		}     
    	
    		// 一般构造函数
    		Coordinate(double x, double y):c_x(x), c_y(y){}   //列表初始化
    		// 一般构造函数可以有多个,创建对象时根据传入的参数不同调用不同的构造函数
    	
    		Coordinate(const Coordinate& c)
    		{
    			// 复制对象c中的数据成员
    			c_x = c.c_x;
    			c_y = c.c_y;
    		}
    	
    		// 等号运算符重载
    		Coordinate& operator= (const Coordinate& rhs)
    		{
    			// 首先检测等号右边的是否就是等号左边的对象本身,如果是,直接返回即可
    			if(this == &rhs)
    				return* this;
    			// 复制等号右边的成员到左边的对象中
    			this->c_x = rhs.c_x;
    			this->c_y = rhs.c_y;
    			return* this;
    		}
    	
    		double get_x()
    		{
    			return c_x;
    		}
    	
    		double get_y()
    		{
    			return c_y;
    		}
    	
    	private:
    		double c_x;
    		double c_y;
    	};
    	
    	int main()
    	{
    		// 调用无参构造函数,c1 = 0,c2 = 0
    		Coordinate c1, c2;
    		// 调用一般构造函数,调用显示定义构造函数
    		Coordinate c3(1.0, 2.0);
    		c1 = c3;    //将c3的值赋值给c1,调用"="重载
    		Coordinate c5(c2);
    		Coordinate c4 = c2;    // 调用浅拷贝函数,参数为c2
    		cout<<"c1 = "<<"("<<c1.get_x()<<", "<<c1.get_y()<<")"<<endl
    			<<"c2 = "<<"("<<c2.get_x()<<", "<<c2.get_y()<<")"<<endl
    			<<"c3 = "<<"("<<c3.get_x()<<", "<<c3.get_y()<<")"<<endl
    			<<"c4 = "<<"("<<c4.get_x()<<", "<<c4.get_y()<<")"<<endl
    			<<"c5 = "<<"("<<c5.get_x()<<", "<<c5.get_y()<<")"<<endl;
    		return 0;
    	}
    
    	c1 = (1, 2)
    	c2 = (0, 0)
    	c3 = (1, 2)
    	c4 = (0, 0)
    	c5 = (0, 0)
    	请按任意键继续. . .
    

    拷贝构造函数

    • 拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类型的引用。当定义一个新对象并用同一类型的对象都它进行初始化时,将显示使用拷贝构造函数,当该类型的对象传递给函数返回该类型的对象时,将隐式调用拷贝构造函数
    • 当类中有一个数据成员是指针时,或者有成员表示在构造函数中分配的其他资源,必须显示定义拷贝构造函数
    • 构造函数的使用情况
      • 一个对象以值传递的方式传入函数体
      • 一个对象以值传递的方式从函数体返回
      • 一个对象需要通过另一个对象进行初始化
    	#include <iostream>
    	using namespace std;
    	
    	class Test
    	{
    	public:
    		// 构造函数
    		Test(int a):t_a(a){
    		cout<<"creat: "<<t_a<<endl;
    		}
    	
    		// 拷贝构造函数
    		Test(const Test& T)
    		{
    			t_a = T.t_a;
    			cout<<"copy"<<endl;
    		}
    	
    		// 析构函数
    		~Test()
    		{
    			cout<<"delete: "<<t_a<<endl;
    		}
    	
    		// 显示函数
    		void show()
    		{
    			cout<<t_a<<endl; 
    		}
    	
    	private:
    		int t_a;
    	};
    	
    	// 全局函数,传入的是对象
    	void fun(Test C)
    	{
    		cout<<"test"<<endl;
    	}
    	
    	int main()
    	{
    		Test t(1);
    		// 函数中传入对象
    		fun(t);
    		return 0;
    	}
    
    	creat: 1
    	copy
    	test
    	delete: 1
    	delete: 1
    	请按任意键继续. . .
    

    浅拷贝与深拷贝

    • 浅拷贝
      • 所谓浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。也就是增加了一个指针,指向原来已经存在的内存。 正常情况下,“浅拷贝”已经能很好的工作,但是一旦对象存在动态成员,浅拷贝就会出问题。让我们考虑下面一段代码:
    	#include <iostream>
    	#include <assert.h>    
    	using namespace std;
    	
    	class Test
    	{
    	public:
    		Test(){
    			p = new int(10);
    		}
    	
    		~Test(){
    			assert(p != NULL);     // assert()作用是如果他的条件返回错误,则终止程序执行 
    			delete p;
    		}
    	private:
    		int x;
    		int y;
    		int* p;
    	};
    	
    	int main()
    	{
    		Test t1;
    		Test t2(t1);    // 调用默认拷贝构造函数
    		return 0;
    	}
    

    上述程序崩溃。在使用t1复制t2时,进行的是浅拷贝,只是将成员的值进行赋值。此时,t1.p = t2.p, 即两个指针指向了堆里的同一个空间。这样,析构函数会被调用两次,这就是错误出现的原因。此问题的解决方法是“深拷贝”。

    • 深拷贝
      • 深拷贝就是对于对象中的动态成员,并不只是简单的赋值,而是重新分配空间,即资源重新分配。上述代码处理如下:
    	#include <iostream>
    	#include <assert.h>    
    	using namespace std;
    	
    	class Test
    	{
    	public:
    		Test(){
    			x = 0;
    			y = 0;
    			p = new int(10);
    		}
    	
    		Test(const Test& t)
    		{
    			x = t.x;
    			y = t.y;
    			p = new int(10);
    			*p = *(t.p);
    		}
    	
    		~Test(){
    			assert(p != NULL);     // assert()作用是如果他的条件返回错误,则终止程序执行 
    			delete p;
    		}
    	
    		int get_x(){return x;}
    		int get_y(){return y;}
    	private:
    		int x;
    		int y;
    		int* p;
    	};
    	
    	int main()
    	{
    		Test t1;
    		Test t2(t1);    // 调用默认拷贝构造函数
    		cout<<"("<<t1.get_x()<<", "<<t1.get_y()<<")"<<endl
    			<<"("<<t2.get_x()<<", "<<t2.get_y()<<")"<<endl;
    		return 0;
    	}
    
    (0, 0)
    (0, 0)
    请按任意键继续. . .
    

    此时t1与t2的p各自指向一段内存空间,但他们指向的内容相同,这就是“深拷贝”。

    展开全文
  • 二进制LDPC码的构造及译码算法

    千次阅读 2018-09-09 16:11:04
    构造好的LDPC码校验矩阵和设计性能优异的译码算法是LDPC码研究领域的重点。  常见的LDPC码一般分为两类,一类是随机LDPC码,一般由随机化方法构造;另一类是准循环LDPC码,一般由半随机方 法或者基于代数的结构化...

            构造好的LDPC码校验矩阵和设计性能优异的译码算法是LDPC码研究领域的重点。
           常见的LDPC码一般分为两类,一类是随机LDPC码,一般由随机化方法构造;另一类是准循环LDPC码,一般由半随机方

    法或者基于代数的结构化方法构造。常见的LDPC码的迭代译码方法包括基于硬判决的译码基于软判决的译码。接下来将介绍

    几种具有代表性的LDPC码构造方法以及经典的硬判决和软判决译码方法。

    1 . PEG构造和QC-PEG构造

            渐进边增长(progressive edge growth, PEG)算法[1][2][3]是一种著名的基于图的随机化LDPC码构造方法,其主要做法是依

    次对每个变量节点添加边连接校验节点来构建出所要的Tanner图,在每次添加边的时候使当前变量节点的本地围长(当前变量节

    点所参与的最短的环的长度)尽可能地大。这样虽然不能保证最终Tanner图对应的LDPC码是最优的,但是其性能一般也非常优

    异。

         一个LDPC码的校验矩阵对应着唯一的一个Tanner图,PEG算法根据给定的码长、码率以及度分布,从头开始构建Tanner

    图。假设需要构建的Tanner图的校验节点数为m,变量节点数为n,变量节点vj相连的所有边所构成的集合记为E_{v_{j}},那么容易得

    到所有的边的集合。记与vj相连的第k条边为,0\leq k\leq d_{s_{j}}-1。以vj为根节点将Tanner图展开,把

    在其展开的树上能达到l层的校验节点集合记为N_{v_{j}}^{l},与之相应的补集为\bar{N_{v_{j}}^{l}},有\bar{N_{v_{j}}^{l}}= N_{c} \setminus N_{v_{j}}^{l}Nc为所有校验节点的集合。

    其展开过程如下图1-1所示。

     

                                   

                                                                                 图1-1  k层树图展开

    根据PEG算法[2][3]的思想,逐个地为每个变量节点选择合适的校验节点,然后在他们之间建立边,这里的索引从0开始,算法

    的具体步骤描述如下:

    1.1  选择一个变量节点vj(一般就按索引的顺序)。如果当前需要添加的是此节点的第0条边,则找到当前Tanner图中具有最低度

    数的校验节点ci,v和 c连起来就可得到此节点的第0条边E_{v_{j}}^{0}。如果变量节点vj已经 添加过边,则首先以vj为根节点把当前

    Tanner图展开为树图直到深度为l,如果发现\bar{N_{v_{j}}^{l}}\neq \varnothing 而\bar{N_{v_{j}}^{l+1}}\neq \varnothing,或者有集合N_{v_{j}}^{l}中的校验节点不再继续增加但N_{v_{j}}^{l}中的校验

    节点的数目仍小于全体校验节点数m, 就在\bar{N_{v_{j}}^{l}}中选取度数最低的校验节点与vj相连。

     

    1.2  重复步骤1.1)直到vj相连的边的条数等于所给定的vj的度数。

     

    1.3  重复步骤1.1) 1.2),直到所有变量节点的边都添加完毕。

           PEG算法构造的LDPC码能有效地减少短环的形成,但是其是一种随机化的构造方法,校验矩阵没有一定的结构和规律,

    因而在硬件实现的时候需要耗费大量的空间和资源,不利于实际的应用;同时无规律的校验矩阵也不能实现快速编码,造成复

    杂度高和效率低下。Li提出了可以构造准循环LDPC码的PEG算法[4],要构造一个维数是m × n,子矩阵维数为L × L的准循环

    LDPC校验矩阵,首先把变量节点和校验节点按每组L个节点进行分组,这样可以得到R组校验节点和C组变量节点,其中

    R = m / LC = n / L。在这个的基础上,Liu等人也做出了深入的研究,初步提出了一种基于PEG的伪随机构造算法[5]。经过深

    入探讨与研究他们提出了一种构造准循环LDPC码的方法,该方法也结合了PEG算法,在保持准循环特性的基础上能够获得比

    PEG算法更佳的译码性能,并且可以灵活地选择码长和码率[6],这里称为QC-PEG算法, 其在添加边时将节点按顺序分组,每

    组包含L个节点,只需要确定一组中的一个节点,那么其它节点所连接的边就可以通过循环移位的特性确定。

            QC-PEG引入一个称之为不可靠因数的系数β用来评估一个节点信息的可靠程度。一个节点的不可靠因数β值越大,表明该

    节点的信息就越不可靠。很容易可以知道,一个节点的β值的大小和节点所参与的环的数目以及相应的环长的大小是密切相关

    的。一个节点参与的环的数目越多,且长度越短,该节点的β值就越大,那么这个算法里给出的β值的计算方法就可以表示为

                                                                                                              (1-1)

    其中,l_{i}为第i个环的长度,k为该节点参与的环的个数。从节点的不可靠系数β出发,该算法还给出了一个环的不可靠因数α的定

    义:α为组成该环所有节点的不可靠因数β之和。在选取合适的校验节点给当前变量节点vj连接新的边的过程中,如果在变量节

    vj和某个校验节点ci之间已经连接过了一条边,那么在校验节点集合Cd中的任何节点都不能和变量节点vj相连,这个集合称为与检验节点ci关联的受限节点集合,其中,每一个检验节点都有一个对应的

    Cd。接下来,将以变量节点vj所在的关键列为例,具体阐述如何确定与vj相连的校验节点,其具体过程如下:

    1. )为变量节点vj添加第一条边时,在当前已构建的Tanner图中寻找度数最小的校验节点ci,连接变量节点vj和校验节点ci这两个节点就可以得到第一条边。在添加变量节点vj的其它边时,以vj为节点将当前Tanner图展开到深度l,如果集合包含节点数停止增长但仍然小于校验节点总数,则ci中随机取一个后与vj相连。如果集合但是,则把校验节点集合定义为F1,如果F1中的校验节点的数目不唯一,那么执行步骤2)。
    2. )考虑到vj添加的当前边也会对将添加的下一条边有影响,集合F1中不同的校验节点和vj相连时产生的当前短环和对vj添加下一条边也会产生影响。把F1中每一个校验节点与vj尝试相连,然后在此基础上再尝试对vj添加下一条边,不断尝试,直到选出F1中使得当前Tanner图形成的本地围长最大且短环数目最少的校验节点组成校验节点集合F2。
    3. )在环不可避免的情况下,选取使得环的外信息度数最高的节点。找出校验节点集合F2中每个节点和vj相连时所形成的环,并计算这些环的外信息度数同时进行比较,将使得形成的环的外信息度数最小的校验节点放入一个新的集合F3。
    4. )对于校验节点集合F3中的节点,搜索出F3中每个校验节点和vj相连时所形成的环,计算每个环的不可靠因数,然后从中选取使得最小的校验节点组成校验节点集合F4。最后从F4中任意选取一个校验节点和vj相连。

           对Tanner图对应校验矩阵中的所有关键列都进行以上的步骤,直到所有的关键列都确定,然后通过准循环性质就可以确定

    整个Tanner图和校验矩阵了。

    2. 基于代数方法的结构化构造

     

            准循环LDPC码更多地是以代数方法构造的[6][7][8],一般都是基于有限域和矩阵论的,具有较强的理论性,虽然每个代数

    构造方法略有不同,但基本原理是一致的,这里简述其一般过程。

           给定有限域GF(q),为GF(q)的一个本原元,则本原元的幂次,即,给定了GF(q)上的q个元素。设P为一个大小为的循环置

    换矩阵,其第0行为一个长度为取值在GF(2)上的向量(0,1,0,,0),此向量的第1个元素为“1”,其它都是“0”。P的其它行都是上一

    行的循环右移向量。P即由(0,1,0,,0)以及(0,1,0,,0)的(q – 2)个循环右移向量组成,\mathbf{P}^{i}=\mathbf{P\times P\times\cdots \times P}iP的乘积,称为

    Pi次幂,这里1\leqslant i< q\mathbf{P}^{i}也是一个大小为\left ( q-1 \right )\times \left ( q-1 \right )的循环置换矩阵,且其首行的向量的第i个元素为“1”。特别

    地,P^{q-1}即为单位阵\mathit{\mathit{\mathbf{I}_{q-1}}}。令,则(q – 1)个循环置换矩阵构成的集合构成了一个(q – 1)阶的GF(2)上的

    矩阵乘法循环群,\mathbf{P}^{i}的乘法逆元为\mathbf{P}^{q-1-i}\mathbf{P}^{0}为单位元。

           对0\leqslant i< q-1,可用表示GF(q)的非零元\alpha ^{i},将\mathbf{P}^{i}映射为 \alpha ^{i}的操作就是前面介绍过的矩阵的分散。\mathbf{P}^{i}与非零 \alpha ^{i}之间有

    一个一一对应的关系。GF(q)中的元素0则对应全零矩阵,记为\mathbf{P}^{-\infty }

          考虑GF(q)上 R\times C的基矩阵,

                           

          其行满足以下约束:对,任意两个qn长序列 \alpha ^{^{c}}\mathbf{\omega _{i}}\alpha ^{^{l}}\mathbf{\omega _{j}}之间的

    Hamming距离至少为(n – 1)。这个约束称为行距 (row-distance, RD)约束,满足此约束的基矩阵W称为行距约束矩阵。通过将

    基矩阵W中的各个GF(q)的元素映射为对应的循环置换矩阵,就能得到最终的R\left ( q-1 \right )\times C\left ( q-1 \right )的奇偶校验矩阵H。由满足

    行距约束的W分散得到的H中不存在4环。H的零空间给定了一个长度为R(q – 1),其码率至少为(R – C) / C。在文献[5]中,归纳

    了几种满足行距约束的校验矩阵的构造方法,通过这些行距约束矩阵以及分散操作,可以构造得到几类常见的准循环LDPC码,

    这里不再赘述。

     

     

    • 参考文献

    [1]  X. Y. Hu, E. Eleftheriou, and D. M. Arnold. Progressive edge-growth Tanner graphs [C]. IEEE Global Telecommunications Conference, San Antonio, TX, USA, Nov. 2001, 2: 995-1001.

    [2]  X. Y. Hu, E. Eleftheriou, and D. M. Arnold. Regular and irregular Progressive edge-growth Tanner graphs [J]. IEEE Transactions on Information Theory, Jan. 2005, 51(1): 386-398.

    [3]  Y. Fang, P. Chen, L. Wang, and F. C. M. Lau. Design of Protograph LDPC Codes for Partial Response Channels [J]. IEEE Transactions on Communications, Oct. 2012, 60(10): 2809-2819.

    [4]  X. Liu, W. Zhang, and Z. Fan. Construction of quasi-cyclic ldpc codes and the performance on the pr4-equalized MRC channel [J]. IEEE Transactions on Magnetics, Oct. 2009, 45(10): 3699-3702.

    [5] Y.-M. Lin, H.-T. Li, M.-H. Chung, and A.-Y. Wu. Byte-Reconfigurable LDPC Codes Design With Application to High-Performance ECC of NAND Flash Memory Systems [J]. IEEE Transactions on Circuits and Systems I: Regular Papers, July 2015, 62(7): 1794-1804.

    展开全文
  • JAVA构造函数(方法)

    千次阅读 多人点赞 2018-12-27 14:47:11
    一、什么是构造函数 java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与类名相同,无返回值。 作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。 构造函数是...

    一、什么是构造函数

    java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与类名相同,无返回值。

    作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。

    构造函数是对象一建立就运行,给对象初始化,就包括属性,执行方法中的语句。

    而一般函数是对象调用才执行,用".方法名“的方式,给对象添加功能。

     

     一个对象建立,构造函数只运行一次。

     而一般函数可以被该对象调用多次。

      

    二、构造函数的特点

    1、构造函数函数名与类名相同

    2、构造函数没有返回类型,如:String、void等

    3、构造函数在类中没有体现出来,则默认有一个不带形式参数的默认构造函数

     

    注:一般函数不能调用构造函数,只有构造函数才能调用构造函数。

     

     三、示例

    1、无参构造函数中只定义了一个方法。new对象时,就调用与之对应的构造函数,执行这个方法。不必写“.方法名”。 

    package com.example.constructor;
    
    public class ConstructorDemo {
    	public static void main(String[] args) {
    		Person person = new Person(); // 输出默认构造函数。new对象一建立,就会调用对应的构造函数Person(),并执行其中的打印输出语句。
    	}
    }
    
    class Person {
    	Person() { // 定义构造函数,输出"默认构造函数"
    		System.out.println("默认构造函数");
    	}
    }

    输出:

    默认构造函数

     

     2、有参构造函数,在new对象时,将实参值传给private变量,相当于完成setter功能。

    package com.example.constructor;
    
    public class ConstructorDemo {
    	public static void main(String[] args) {
    		// 实例化Person对象,传参name="zhangsan"、age=25
    		// 因Person类重载构造函数后,原来默认构造函数被覆盖,此时此处若不传形式参数,则会在编译时报错
    		Person person = new Person("zhangsan", 25);
    	}
    }
    
    class Person {
    	private String name;
    	private int age;
    
    	// 此处定义带有形参构造函数后,原来默认的无参构造函数则被覆盖掉
    	Person(String tname, int tage) {
    		name = tname;
    		age = tage;
    		System.out.println("名称:" + name + ",年龄:" + age);
    	}
    }

    输出:

    名称:zhangsan,年龄:25

     

    三、默认构造函数

    当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造函数,方便该类初始化。只是该空构造函数是隐藏不见的。

    如下,Person(){}这个默认构造函数是隐藏不显示的。

    class Person {
    	Person() {
    		//默认构造函数,默认不显示,若对构造函数重载后需要调用默认构造函数,则需显示定义默认构造函数
    	}
    }


    当在该类中自定义了构造函数,默认构造函数就没有了。

    如果仍要构造函数,则需要自己在类中显示定义默认构造函数。

     

    四、构造函数的重载

    构造函数也是函数的一种,同样具备函数的重载(Overloding)特性。

    package com.example.constructor;
    
    public class ConstructorDemo {
    	public static void main(String[] args) {
    		Person person1 = new Person();
    		Person person2 = new Person("lisi");
    		Person person3 = new Person(30);
    		Person person4 = new Person("lisi", 28);
    	}
    }
    
    class Person {
    	private String name;
    	private int age;
    
    	Person() {
    		System.out.println("名称:" + name + ",年龄:" + age);
    	}
    
    	Person(String tname) {
    		name = tname;
    		System.out.println("名称:" + name + ",  年龄:" + age);
    	}
    
    	Person(int tage) {
    		age = tage;
    		System.out.println("名称:" + name + ",年龄:" + age);
    	}
    
    	Person(String tname, int tage) {
    		name = tname;
    		age = tage;
    		System.out.println("名称:" + name + ",  年龄:" + age);
    	}
    }

    输出:

    名称:null,年龄:0
    名称:lisi,  年龄:0
    名称:null,年龄:30
    名称:lisi,  年龄:28

    展开全文
  • LDPC构造及编码

    万次阅读 2018-05-08 11:47:11
    LDPC码构造方法有很多,我所了解的如下:1. 随机构造法:首先随机生成一个满足要求的规则H矩阵,由于随机法无法满足无短环要求,所以至少还需要消除4环这一步骤。然而4环并不是那么好消除的,所以可能消除4环的效果...

    LDPC码构造方法有很多,我所了解的如下:

    1. 随机构造法:首先随机生成一个满足要求的规则H矩阵,由于随机法无法满足无短环要求,所以至少还需要消除4环这一步骤。然而4环并不是那么好消除的,所以可能消除4环的效果不怎样,导致的结果就是后面译码性能差。另外,消除四环的过程中很可能将H变为非规则码,所以这种方法构造的码往往是非规则码。消短环后很可能导致H出现很多列重低于3的情况,带来低列重码字。

    2. 组合数学完备循环差集构造法:这种方法构造的H是无4环规则码,且同一行列数要求下的H很多(是MACKAY或者欧式几何码的数量不能相比的),这种方法构造的码优点很多,觉得还不错。

    相关文章:LDPC码的一种循环差集构造法

    3. 对角线法:这种方法主要用于构造规则码(也可以用于不规则码)。

    相关文章:点击打开链接

    LDPC编码方法

    LDPC编码方法主要有两种,高斯消元法和近似下三角形法。

    1. 全下三角法:将已经得到的H矩阵通过高斯变换转换为全下三角形式,这样编码得到的是系统码,编码简单,但由于高斯变换会改变矩阵的稀疏性,而LDPC码的编码复杂度主要就是有H的稀疏性决定的,所以这种方法的编码复杂度很大,为O(n3),码长较短时还好说,码长很长时这样的复杂度受不了。(其中n为分组码的码长)

    相关文章:《LDPC码基础与应用》人民邮电出版社,贺鹤云 编著

    2. 系统编码法:也是通过高斯变换将得到的H转化为系统形式,这样编码简单,同样由于破坏了稀疏矩阵的稀疏性导致编码复杂度(主要是高斯变换过程复杂)很高,复杂度同上。

    3. 近似下三角法:将已经得到的H通过行列变换转化为近似下三角形,因为行列变换不改变矩阵的稀疏性,所以这种方法复杂度最低,也适用于长码。编码复杂度为O(n)。

    其中第二种方法,系统编码法通用性最好,但由于编码复杂度过高导致实用性不强;第三种方法,近似下三角形法,通用性良好,但受限于g尽可能小的情况下才能实现线性复杂度编码;第一种方法,采用初等行列变换将H转换为下三角形式的可能性比较小,所以一般采用高斯变换,这样一来编码复杂度很高。


    展开全文
  • C++ 类(构造函数和析构函数)

    万次阅读 多人点赞 2018-07-20 19:00:51
    构造函数和析构函数的由来? 构造函数和析构函数的基本语法 C++编译器构造析构方案 PK 对象显示初始化方案 构造函数的分类以及调用 默认的构造函数 构造函数调用规则 构造函数和析构函数的总结 构造函数和析构...
  • Java构造方法

    千次阅读 多人点赞 2019-09-09 19:26:39
    Java构造方法 当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,...
  • 哈夫曼树原理,及构造方法

    万次阅读 多人点赞 2018-08-05 12:13:21
    哈夫曼树(最优二叉树) 百度百科:... 一.... 找出存放一串字符所需的最少的二进制编码 二. 构造方法: 首先统计出每种字符出现的频率!(也可以是概率)//权值 ----------------------------...
  • [Java基础]-- 有参构造方法和无参构造方法

    万次阅读 多人点赞 2016-03-03 15:06:44
    java构造方法:有参构造方法和无参构造方法   一、无参构造方法 1、定义: 如果编写一个javaBean时没有添加无参构造方法,那么编译器会自动添加无参构造方法; 但是如果编写时添加了有参构造方法而未添加无参...
  • C++ 拷贝构造函数和赋值构造函数

    万次阅读 多人点赞 2019-04-06 16:43:35
    在C++中复制控制是一个比较重要的话题,主要包括复制构造函数、重载赋值操作符、析构函数这三部分,这三个函数是一致的,如果类需要析构函数,则它也需要复制操作符 和 复制构造函数,这个规则被称为 C++的“三法则...
  • Java中的构造方法(构造函数)与普通方法区别

    千次阅读 多人点赞 2020-10-17 00:50:29
    Java中的构造方法(构造方法)与普通方法区别 ** 一、明白什么是构造方法,什么是普通方法? 所谓的构造方法,是一种特殊的方法,其作用是用来创建对象时初始化对象,即为对象成员变量赋初始值,总是与new运算符一起...
  • c++学习笔记八:构造函数和析构函数详解

    千次阅读 多人点赞 2020-11-08 22:21:02
    一、构造函数和析构函数基本概念 对象的初始化和清理也是两个非常重要的安全问题 ​一个对象或者变量没有初始状态,对其使用后果是未知 ​同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题 c++...
  • NX10.0后处理构造

    2015-01-08 11:22:13
    NX10.0后处理构造器,覆盖安装目录下面的同名文件夹即可
  • Java的构造函数与默认构造函数(深入版)

    千次阅读 多人点赞 2020-03-07 22:39:11
    我们知道在创建对象的时候,一般会通过构造函数来进行初始化。在Java的继承(深入版)有介绍到类加载过程中的验证阶段,会检查这个类的父类数据,但为什么要怎么做?构造函数在类初始化和实例化的过程中发挥什么作用...
  • c++拷贝构造函数

    千次阅读 多人点赞 2019-06-28 16:22:40
    什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象...
  • C++——构造函数、析构函数以及复制构造函数

    千次阅读 多人点赞 2021-03-09 16:28:49
    文章目录一、构造函数1.1 构造函数是什么?1.2 为什么要有构造函数?1.3 如何使用构造函数?1.4 构造函数的实现二、使用步骤 一、构造函数 在程序执行的过程中,当遇到与对声明语句时,程序会向操作系统申请一定的...
  • 构造函数与拷贝构造函数

    千次阅读 多人点赞 2019-04-03 09:07:15
    拷贝构造函数和构造函数不能分开说,他们都是初始化对象的一种方法。但是我们这里用构造函数辅助说明拷贝构造函数,主要说说拷贝构造函数的声明,用途和使用注意事项。 众所周知,构造函数是一个初始化类对象的函数...
  • Dart 构造函数最详细的解析

    千次阅读 2019-12-10 18:53:43
    本文讲述了Dart中构造函数写法 。工厂构造函数 常量构造函数 普通构造函数的关系
  • 《aws云端企业实战圣经:亚马逊如何构造云端计算》是市场上第一本完整剖析、深入介绍亚马逊云计算服务(amazon web services,aws)应用的图书,作者林允溥是有多年 aws操作经验的专家,擅长构建社群网站和游戏网站...
  • 一文搞懂Java的 构造方法 和 访问权限

    千次阅读 多人点赞 2020-07-20 16:41:54
    Java是一门当今最火的编程语言之一,拥有很多现成可用的库,在我们编程生涯中,有着无比重要的地位。本文主要讲解Java中的构造方法和四种类的访问权限。
  • C++构造函数(详细)

    千次阅读 2020-06-14 15:00:13
    一、普通类的构造函数 class A { int a,b; public: A(){cout<<"默认构造函数"<<endl;}//自己定义的默认构造函数,什么也不坐 A(int x):a(x){cout<<"转换构造函数1"<<endl;}//转换构造...
  • js的构造函数理解

    万次阅读 多人点赞 2018-11-02 18:05:55
    文章目录1、什么是构造函数2、为什么要使用构造函数?3、构造函数的执行过程4、构造函数的返回值5构造函数首字母必须大写吗?6不用new关键字,直接运行构造函数,是否会出错?如果不会出错,那么,用new和不用new...
  • C++构造函数详解及显示调用构造函数

    万次阅读 多人点赞 2018-10-08 10:55:11
    c++类的构造函数详解 一、 构造函数是干什么的 class Counter { public:  // 类Counter的构造函数  // 特点:以类名作为函数名,无返回类型  Counter()  {  ...
  • 构造器(有参、无参)

    千次阅读 多人点赞 2020-07-26 16:59:59
    构造器: 就是和类名相同但无返回类型的方法。用于当前或某一对象的实例化,并将当前或某一对象返回。无参构造:1、如果使用new关键字实际上是调用无参构造器;2、无参构造往往是为了初始化一些值。有参构造:一旦...
  • C++构造函数的几种写法

    千次阅读 2019-02-27 10:35:02
    C++构造函数的几种写法 ** 主要借鉴了https://blog.csdn.net/zxc024000/article/details/51153743 之前学习了构造函数的方法,但是对于类似于初始化列表的方式不太理解,于是自己在网上查阅了一些博客之后,在这里...
  • Java构造函数

    千次阅读 多人点赞 2018-11-22 13:06:46
    Java构造函数创建java构造函数的规则Java构造函数的类型没参数的构造函数 (默认函数的构造类型)Java参数化构造函数Java 构造函数重载java的构造函数和方法之间的区别Q)构造函数没有返回值 ?Q)可以构造函数执行...
  • 好的,说到构造器,我们先来看一什么是构造器: 最简单直白的话,当你要new一个对象的时候,必须要有构造器才能new出来,类里面默认有无参的构造器,看不到的,当我们要创建一个有参构造的时候,最好也把无参构造写...
  • Java有参构造方法和无参构造方法详解

    千次阅读 多人点赞 2020-12-09 12:05:16
    一:有参数构造方法 在之前我们要为一个对象赋值,先要创建好对象之后然后“对象名.属性名”或者调用属性的setter为属性赋值。但是在很多时候觉得这样做很麻烦,最好的做法是在创建对象的时候完成属性的初始化操作...
  • 构造器 与构造方法的关系

    万次阅读 2020-06-28 22:48:42
    构造器的作用: 构造器的产生过程实际上是一个**代码收敛的过程**,**编译器会把语句块**(对于实例构造器而言是“{}”块,对于类构造器而言是“static{}”块)、**变量初始化**(实例变量和类变量)、**调用父类的...
  • Dart中的类——初始化列表、命名构造器、factory构造器、常量构造器、构造器私有化、get和set方法、枚举 1、调用成员变量——使用"."来调用成员变量或方法 var p = Point(2, 2); // Set the value of the instance ...
  • C++默认构造函数

    万次阅读 多人点赞 2018-02-08 12:43:51
    本文围绕3个问题来理解C++的默认构造函数: 什么是默认构造函数? 默认构造函数什么时候被调用? 编译器在什么情况下会生成默认构造函数? 一. 什么是默认构造函数? 我们一般会认为默认构造函数就是编译器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,175,198
精华内容 1,270,079
关键字:

构造