个人项目

仓库地址

*PSP2.1* *Personal Software Process Stages* *预估耗时(分钟)* *实际耗时(分钟)*
Planning 计划 30 30
Estimate 估计这个任务需要多少时间 510 510
Development 开发 60 60
Analysis 需求分析 (包括学习新技术) 30 30
Design Spec 生成设计文档 30 30
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 30
Design 具体设计 30 30
Coding 具体编码 60 60
Code Review 代码复审 60 60
Test 测试(自我测试,修改代码,提交修改) 60 60
Reporting 报告 30 30
Test Repor 测试报告 30 30
Size Measurement 计算工作量 30 30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 30
合计 510 510

程序用动态编程算法实现,算法是最长公共子序列(LCS)。以下是算法的工作原理:

初始化

它初始化了一个名为match的2D向量,以存储两个输入字符串前缀之间的公共子序列的长度。其中s1和s2是两个字符串的输入向量。 匹配向量中的所有值初始化为0。

填充矩阵

该算法从索引1开始,遍历两个输入字符串s1和s2的每个字符。 如果当前索引的字符匹配,则将match [i] [j]中的值增加1,指示如果包含两个字符,公共子序列的长度。 如果字符不匹配,则从上面或左边的单元格中取最大值并将其赋给match [i] [j]。

计算相似性

最后,它通过将最长公共子序列的长度(在 match [s1.size()] [s2.size()] 中找到)除以第一个文档的长度(s1.size())来计算相似度。 找到了两个文档之间最长公共子序列的长度,就可以作为它们相似性的度量。

单元测试

#include <gtest/gtest.h>
#include "FirstProject.hpp" 

TEST(CompareTest, EmptyStrings) {
    std::vector<std::string> s1;
    std::vector<std::string> s2;
    double similarity = solution::compare(s1, s2);
    ASSERT_DOUBLE_EQ(similarity, 0.0);
}

TEST(CompareTest, IdenticalStrings) {
    std::vector<std::string> s1 = {"apple", "banana", "orange"};
    std::vector<std::string> s2 = {"apple", "banana", "orange"};
    double similarity = solution::compare(s1, s2);
    ASSERT_DOUBLE_EQ(similarity, 1.0);
}

TEST(CompareTest, DifferentStrings) {
    std::vector<std::string> s1 = {"apple", "banana", "orange"};
    std::vector<std::string> s2 = {"grape", "melon", "strawberry"};
    double similarity = solution::compare(s1, s2);
    ASSERT_DOUBLE_EQ(similarity, 0.0);
}

// Test case for comparing partially similar strings
TEST(CompareTest, PartiallySimilarStrings) {
    std::vector<std::string> s1 = {"apple", "banana", "orange"};
    std::vector<std::string> s2 = {"apple", "grape", "orange"};
    double similarity = solution::compare(s1, s2);
    ASSERT_DOUBLE_EQ(similarity, 0.6666666666666666); 
}

int main(int argc, char **argv) {
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

posted on 2024-03-18 22:34  NOPASSWD  阅读(5)  评论(0编辑  收藏  举报