• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
X_yyds
博客园    首页    新随笔    联系   管理    订阅  订阅

第一次个人编程作业

第一次个人编程作业

这个作业属于哪个课程 <软件工程>
这个作业要求在哪里 <第一次编程作业>
这个作业的目标 <分析软件的性能,测试自己编程能力,对软件进行测试和优化>

1.Github仓库链接

click on

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.总结

通过这次实验,我学会了如何进行单元测试和功能的优化。我主要利用了海明距离算法来实现文件的查重,用的是其前人研究出的算法。研究出自己的算法来解决类似的问题是我需要去前进的方向。

posted @ 2021-09-19 23:58  X_yyds  阅读(52)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3