
软件复用是将已有的软件及其有效成分用于构造新的软件或系统。它不仅是对软件程序的复用,还包括对软件生产过程中其它劳动成果的复用,如项目计划书、可行性报告、需求分析、概要设计、详细设计、编码(源程序)、测试用例、文档与使用手册等等。因此,软件复用包括软件产品复用和软件过程复用两部分的内容。
软件复用不同于软件移植。软件移植是指对软件进行修改和扩充,使之在保留原有功能、适应原有平台的基础上,可以运行于新的软硬件平台。而复用则指在多个系统中,尤其是在新系统中使用已有的软件成分。
从对复用产品的了解程度和复用方式看,也可分为白盒复用与黑盒复用。黑盒复用指对已有产品或构件不需作任何修改,直接进行复用,这是理想的复用方式。它主要基于二进制代码的复用,包括可执行程序的复用和基于库(包括动态链接库和静态库)的复用。白盒复用指根据用户需求对已有产品进行适应性修改后才可使用。白盒复用一般为源代码一级的复用,以及相应的测试用例、文档等的复用。
无论白盒复用还是黑盒复用,都需要花费一定的代价熟悉和掌握被复用的软件系统。作为经济上的考虑,要求复用的代价必须大大小于重新开发的代价,否则就不应该考虑。
软件复用的一个关键因素是抽象。抽象是对软件可复用对象的提炼和概括,即将可复用对象的基本属性和相应的 *** 作,从具体的语言、环境和其他细节中提炼出来。软件的复用性很大程度上取决于对可复用对象的认识深度或者说可复用对象的抽象层次。抽象层次越高、与具体环境和特定细节越无关,则它被未来系统复用的可能性也越大。领域分析则是进行抽象的有力工具。领域分析借助特定领域、特定行业的专业知识与技能,对软件系统对象进行抽象和分类,提炼认知的对象及其相互关系,获得系统整体结构,从而生成可复用的软件构件。
通过软件复用,在应用系统开发中可以充分地利用已有的开发成果,减少了包括分析、设计、编码、测试等在内的许多重复劳动,从而提高了软件开发的效率,同时,通过复用高质量的已有开发成果,避免了重新开发可能引入的错误,从而提高了软件的质量。
软件复用有三个基本原则,一是必须有可以复用的对象;二是所复用的对象必须是有用的,三是复用者需要知道如何去使用被复用的对象。软件复用包括两个相关过程:可复用软件(构件)的开发(DevelopmentforReuse)和基于可复用软件(构件)的应用系统构造(集成和组装)(DevelopmentwithReuse)。解决好这几个方面的问题才能实现真正成功的软件复用。
可复用软件(构件)的开发是实现软件复用的基本条件,对象技术的广泛使用,提供了建造和使用构件的概念基础和实用工具,有了可复用软件,基于可复用软件(构件)的应用系统构造(集成和组装)才能得以实现。软件的生产也可以象硬件的生产一样,在设计好框架后通过标准的构件组装而成。一般认为构件是具有一定功能、能够独立工作或同其他构件组合起来协调工作的程序体,一经产生,就与它的具体实现语言无关,可以认为是一段二进制码和数据段,其内部具体实现是无法看到的,可将成熟的构件当作商品出售,在保证开发者的利益同时最大地满足社会需求。采用构件来开发软件可以更有效地重用他人已有的劳动成果。
哈夫曼编码为最优前缀码
由哈夫曼树求得编码为最优前缀码的原因:
① 每个叶子字符ci的码长恰为从根到该叶子的路径长度li,平均码长(或文件总长)又是二叉树的带权路径长度WPL而哈夫曼树是WPL最小的二叉树,因此编码的平均码长(或文件总长)亦最小
② 树中没有一片叶子是另一叶子的祖先,每片叶子对应的编码就不可能是其它叶子编码的前缀即上述编码是二进制的前缀码
哈夫曼编码的算法
(1)思想方法
给定字符集的哈夫曼树生成后,求哈夫曼编码的具体实现过程是:依次以叶子T[i](0≤i≤n-1)为出发点,向上回溯至根为止上溯时走左分支则生成代码0,走右分支则生成代码1
注意:
① 由于生成的编码与要求的编码反序,将生成的代码先从后往前依次存放在一个临时向量中,并设一个指针start指示编码在该向量中的起始位置(start初始时指示向量的结束位置)
② 当某字符编码完成时,从临时向量的start处将编码复制到该字符相应的位串bits中即可
③ 因为字符集大小为n,故变长编码的长度不会超过n,加上一个结束符'\0',bits的大小应为n+1
(2)字符集编码的存储结构及其算法描述
typedef struct {
char ch; //存储字符
char bits[n+1]; //存放编码位串
}CodeNode;
typedef CodeNode HuffmanCode[n];
void CharSetHuffmanEncoding(HuffmanTree T,HuffmanCode H)
{//根据哈夫曼树T求哈夫曼编码表H
int c,p,i;//c和p分别指示T中孩子和双亲的位置
char cd[n+1]; //临时存放编码
int start; //指示编码在cd中的起始位置
cd[n]='\0'; //编码结束符
for(i=0,i=0){//直至上溯到T[c]是树根为止
//若T[c]是T[p]的左孩子,则生成代码0;否则生成代码1
cd[--start]=(T[p)1child==C)'0':'1';
c=p; //继续上溯
}
strcpy(H[i]bits,&cd[start]); //复制编码位串
}//endfor
}//CharSetHuffmanEncoding
以下是哈夫曼编码
#include<iostream>
#include<mathh>
#include<string>
#include<iomanip>
using namespace std;
int n;
int isin(string str,char a)
{
int temp=0;
for(int i=0;i<strlength();i++)
{
if(str[i]==a) temp=1;
}
return temp;
}
void bubble(double p[],string sign[])//排序
{
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(p[i]<p[j])
{
double temp=p[i];
p[i]=p[j];
p[j]=temp;
string m=sign[i];
sign[i]=sign[j];
sign[j]=m;
}
}
}
}
void huff(double tempp[],string tempstr[])
{
double p[20][20];
string sign[20][20];
sign[0][i]=tempstr[i]; //符号放在sign数组中
for(int i=0;i<n;i++)
{
p[0][i]=tempp[i]; //p数组放对应的概率(第1列中)
}
for(i=0;i<n-1;i++)
{
bubble(p[i],sign[i]); //第一次排序
for(int j=0;j<n-2-i;j++)
{
p[i+1][j]=p[i][j]; //前n-2-i个概率重新放在p数组中(是数组的第2列中)
sign[i+1][j]=sign[i][j];
}
p[i+1][j]=p[i][j]+p[i][j+1];//第一次两个最小概率求和
sign[i+1][j]=sign[i][j]+sign[i][j+1];//符号跟随
for(j=n-1-i;j<n;j++)
{
p[i+1][j]=0;
}
}
string final[20];
for(i=n-2;i>=0;i--)
{
for(int k=0;k<n;k++)
{
if(isin(sign[i][n-2-i],sign[0][k][0])) final[k]+="0";
if(isin(sign[i][n-1-i],sign[0][k][0])) final[k]+="1";
}
}
cout<<setw(9)<<"哈弗曼编码如下:"<<endl;
for(i=0;i<n;i++)
{
cout<<setw(7)<<sign[0][i]<<setw(7)<<p[0][i]<<setw(10)<<final[i]<<
setw(7)<<final[i]length()<<endl;
}
}
void main()
{
char a[50];
cout<<"该字符串符号为:";
cin>>a;
string s=a;
n=slength();
char b[20][2];
for(int i=0;i<n;i++)
{
b[i][0]=a[i];
b[i][1]='\0';
}
string str[20];
for(i=0;i<n;i++)
{
str[i]=b[i];
}
double tempp[20];
cout<<"字符概率依次为:";
for(i=0;i<n;i++)
{
cin>>tempp[i];
}
huff(tempp,str);
}
B)7
解析:
标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号
另外,团IDC网上有许多产品团购,便宜有口碑
以上就是关于什么是软件复用全部的内容,包括:什么是软件复用、哈夫曼编码实现最优前(最短期望长度)缀码 的源程序 要用到kiaft不等式约束条件,最优码长的界,、跪求C语言进行哈夫曼编码、算术编码和LZW编码,要求源程序要有注释。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)