第一次个人编程作业
#作业要求&github
| 软件工程| 软件工程 |
| ----------------- |--------------- |
| 这个作业要求在哪里 | 个人项目作业 |
| 这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。 |
|github地址|github|
#psp表格:
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
| ------- | --------------------------------- | -------- | --------- |
| Planning | 计划 | 15 | 10|
| Estimate | 估计这个任务需要多少时间 | 300 | 480 |
| Development | 开发 | 60 |80 |
| Analysis | 需求分析 (包括学习新技术) | 20 | 60 |
| Design Spec | 生成设计文档 | 5 | 10 |
| Design Review | 设计复审 | 5 | 10 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
| Design | 具体设计 | 5 | 5 |
| Coding | 具体编码 | 60 | 120 |
| Code Review | 代码复审 | 15 | 15 |
| Test | 测试(自我测试,修改代码,提交修改) | 40 | 90 |
| Reporting | 报告 | 30 | 50 |
| Test Repor | 测试报告 | 20 | 20 |
| Size Measurement | 计算工作量 | 10 | 10 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 10 |
| 合计 | | 610 | 975 |
#代码模块
main为程序入口
MySimHash为文本查重算法
FileUtils为文本上传
#SimHash算法
simhash算法的输入是一个向量,输出是一个f位的签名值。为了陈述方便,假设输入的是一个文档的特征集合,每个特征有一定的权重。比如特征可以是文档中的词,其权重可以是这个词出现的次数。simhash算法如下:
1,将一个f维的向量V初始化为0;f位的二进制数S初始化为0;
2,对每一个特征:用传统的hash算法对该特征产生一个f位的签名b。对i=1到f:
如果b的第i位为1,则V的第i个元素加上该特征的权重;
否则,V的第i个元素减去该特征的权重。
3,如果V的第i个元素大于0,则S的第i位为1,否则为0;
4,输出S作为签名。
#模块接口性能分析
#单元测试
package Au73.Dc;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class AppTest
extends TestCase
{
public void test1() {
try {
Main.start("D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig.txt",
"D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig_0.8_add.txt",
"D:\\\\\\\\Dc\\\\Dc\\\\src\\\\test\\\\java\\\\Au73\\\\Dc\\\\answer.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail();
}
}
public void test2() {
try {
Main.start("D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig.txt",
"D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig_0.8_del.txt",
"D:\\\\\\\\Dc\\\\Dc\\\\src\\\\test\\\\java\\\\Au73\\\\Dc\\\\answer.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail();
}
}
public void test3() {
try {
Main.start("D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig.txt",
"D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig_0.8_dis_1.txt",
"D:\\\\\\\\Dc\\\\Dc\\\\src\\\\test\\\\java\\\\Au73\\\\Dc\\\\answer.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail();
}
}
public void test4() {
try {
Main.start("D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig.txt",
"D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig_0.8_dis_10.txt",
"D:\\\\\\\\Dc\\\\Dc\\\\src\\\\test\\\\java\\\\Au73\\\\Dc\\\\answer.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail();
}
}
public void test5() {
try {
Main.start("D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig.txt",
"D:\\\\Dc\\Dc\\src\\test\\java\\Au73\\Dc\\orig_0.8_dis_15.txt",
"D:\\\\\\\\Dc\\\\Dc\\\\src\\\\test\\\\java\\\\Au73\\\\Dc\\\\answer.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail();
}
}