第一次个人编程作业
第一次个人编程作业
这个作业属于哪个课程 | <软件工程> |
---|---|
这个作业要求在哪里 | <第一次编程作业> |
这个作业的目标 | <分析软件的性能,测试自己编程能力,对软件进行测试和优化> |
1.Github仓库链接
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(min) | 实际耗时(min) |
---|---|---|---|
Planning | 计划 | 40 | 60 |
Estimate | 估计这个任务需要多少时间 | -- | -- |
Development | 开发 | 630 | 1060 |
Analysis | 需求分析 (包括学习新技术) | 180 | 240 |
Design Spec | 生成设计文档 | 40 | 60 |
Design Review | 设计复审 | 10 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 120 | 100 |
Coding | 具体编码 | 240 | 400 |
Code Review | 代码复审 | 20 | 50 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 160 |
Reporting | 报告 | 50 | 40 |
Test Report | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 10 |
合计 | 710 | 1160 |
3.代码分析
3.1 建立工程前的准备:
运行软件:eclipse
导入的jar:hanlp.jar
分析软件:JProfiler
3.2 工程结构:
3.3 流程图:
3.4 功能的实现:
Simhash_bulit.java储存着simhash_bulit(str)方法体,用于计算传入字符串的simhash值。
Distance_getting.java储存着distance_getting(str1,str2)方法体,计算两个simhash的海明距离,进而求出重复率。
Txt_reading_writting.java储存着read(str1,str2)和write(str1,str2)方法体,用于外部文件的字符流的输入和输出。
Main.java进行以上方法连接,保证程序的正常运行。
3.5 重要算法分析:
simhash_bulit(str)和distance_getting(str1,str2)方法体运用了海明距离的算法。
计算海明距离的一种方法,就是对两个位串进行异或(xor)运算,并计算出异或运算结果中1的个数。例如110和011这两个位串,对它们进行异或运算,其结果是:
110⊕011=101,异或结果中含有两个1,因此110和011之间的海明距离就等于2。
把需要判断文本分词形成这个文章的特征单词,通过hash算法把每个词变成hash值,需要按照单词的权重形成加权数字串,把上面各个单词算出来的序列值累加,变成只有一个序列串,对这个序列串进行简化,如果每一位大于0 记为 1,小于0 记为 0。
4.接口部分的性能改进
4.1 CPU占用:
4.2 类占用:
4.3 堆内存占用:
5.单元测试
5.1 测试代码:
class Main_Test {
@Test
public void Main_test1() {
Txt_reading_writting txt=new Txt_reading_writting();
String str1=txt.read("E:\\测试文本\\orig.txt");
String str2=txt.read("E:\\测试文本\\orig_0.8_add.txt");
Simhash_bulit sim=new Simhash_bulit();
String sim1=sim.simhash_bulit(str1);
String sim2=sim.simhash_bulit(str2);
Distance_getting rate=new Distance_getting();
double str3=rate.distance_getting(sim1,sim2);
System.out.println(str3);
}
@Test
public void Main_test2() {
Txt_reading_writting txt=new Txt_reading_writting();
String str1=txt.read("E:\\测试文本\\orig.txt");
String str2=txt.read("E:\\测试文本\\orig_0.8_del.txt");
Simhash_bulit sim=new Simhash_bulit();
String sim1=sim.simhash_bulit(str1);
String sim2=sim.simhash_bulit(str2);
Distance_getting rate=new Distance_getting();
double str3=rate.distance_getting(sim1,sim2);
System.out.println(str3);
}
@Test
public void Main_test3() {
Txt_reading_writting txt=new Txt_reading_writting();
String str1=txt.read("E:\\测试文本\\orig.txt");
String str2=txt.read("E:\\测试文本\\orig_0.8_dis_1.txt");
Simhash_bulit sim=new Simhash_bulit();
String sim1=sim.simhash_bulit(str1);
String sim2=sim.simhash_bulit(str2);
Distance_getting rate=new Distance_getting();
double str3=rate.distance_getting(sim1,sim2);
System.out.println(str3);
}
@Test
public void Main_test4() {
Txt_reading_writting txt=new Txt_reading_writting();
String str1=txt.read("E:\\测试文本\\orig.txt");
String str2=txt.read("E:\\测试文本\\orig_0.8_dis_10.txt");
Simhash_bulit sim=new Simhash_bulit();
String sim1=sim.simhash_bulit(str1);
String sim2=sim.simhash_bulit(str2);
Distance_getting rate=new Distance_getting();
double str3=rate.distance_getting(sim1,sim2);
System.out.println(str3);
}
@Test
public void Main_test5() {
Txt_reading_writting txt=new Txt_reading_writting();
String str1=txt.read("E:\\测试文本\\orig.txt");
String str2=txt.read("E:\\测试文本\\orig_0.8_dis_15.txt");
Simhash_bulit sim=new Simhash_bulit();
String sim1=sim.simhash_bulit(str1);
String sim2=sim.simhash_bulit(str2);
Distance_getting rate=new Distance_getting();
double str3=rate.distance_getting(sim1,sim2);
System.out.println(str3);
}}
5.2 单元测试结果的图片:
5.3 代码覆盖率:
5.4 命令行上的结果:
6.异常处理
public String read(String str1) {
try {
File readName = new File(str1); // 相对路径
FileReader reader = new FileReader(readName);
BufferedReader in = new BufferedReader(reader);
StringBuilder sb=new StringBuilder();
String s="";
while((s=in.readLine())!=null)
sb.append(s+"\n");
String str2=sb.toString();
in.read();
in.close();
return str2;
} catch (IOException e) {
e.printStackTrace();
return str1;
}
}
public void write(double double3,String str4) {
try {
File writeName = new File(str4); // 相对路径
if(!writeName.exists()) {
writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
}
FileWriter writer = new FileWriter(writeName);
BufferedWriter out = new BufferedWriter(writer);
out.write(double3+"\r\n");
out.flush(); // 把缓存区内容压入文件
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
7.总结
通过这次实验,我学会了如何进行单元测试和功能的优化。我主要利用了海明距离算法来实现文件的查重,用的是其前人研究出的算法。研究出自己的算法来解决类似的问题是我需要去前进的方向。