文本相似度算法(一):LCS动态规划
来源:互联网 发布:美国学费 知乎 编辑:程序博客网 时间:2024/06/08 02:45
#include<iostream>#include<algorithm>#include<string>#include<cassert>#include<fstream>using namespace std;char s1[100];char s2[100];int dp[105][105] = { 0 };int s1_len;int s2_len;/* 求出两文件的最长子序列 */int LCS(){ s1_len = strlen(s1); s2_len = strlen(s2); cout << s1_len << " " << s2_len << endl; for (int i = 1; i <= s1_len; i++) { for (int j = 1; j <= s2_len; j++) { if (s1[i - 1] == s2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1; else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); } } return dp[s1_len][s2_len];}/* 打印最长子序列内容 */void Print(int i, int j){ if (i == -1 || j == -1) return; if (s1[i] == s2[j]) { Print(i - 1, j - 1); cout << s1[i]; } else { if (dp[i - 1][j] > dp[i][j - 1]) Print(i - 1, j); else Print(i, j - 1); }}int main(){ string file_name1("s1.txt"); string file_name2("s2.txt"); ifstream fin; fin.open(file_name1.data()); if (!fin.is_open()) { cout << file_name1 << " 无法打开\n"; return -1; } fin.getline(s1, 100); fin.close(); fin.open(file_name2.data()); if (!fin.is_open()) { cout << file_name2 << " 无法打开\n"; return -1; } fin.getline(s2, 100); fin.close(); int lcs = LCS(); cout << "最长公共子序列长度为:" << lcs << endl; cout << "最长公共子序列为:"; Print(s1_len - 1, s2_len - 1); cout << "\n相似度为:" << (lcs * 2 * 100) / (s1_len + s2_len) << "%\n"; return 0;}
此算法是针对最长公共子序列,不是子串。
具体情况远不止如此简单,还要考虑相似度基于的是字符还是单词,具体算法看实际情况。
1 0
- 文本相似度算法(一):LCS动态规划
- 文本相似度算法----动态规划求子串
- 【算法之动态规划(三)】动态规划算法之:最长公共子序列 & 最长公共子串(LCS),字符串相似度算法
- 算法(一) --DP动态规划(LIS和LCS)
- LCS算法实现简单中文文本相似度分析
- 动态规划(5)字符串相似度算法
- 动态规划(5)字符串相似度算法
- 一、动态规划(1)相似基因
- LCS的动态规划算法
- 文本相似度算法
- 文本相似度算法
- 文本相似度算法
- 文本相似度算法
- 文本相似度算法
- 文本相似度算法
- 文本相似度算法
- 最长共同子序列(LCS)的动态规划算法
- LCS问题实现---------------(动态规划, 取自算法导论)
- 指针_基本概念
- 文件存储空间的管理:成组链接法
- 求最大公约数
- MAVEN项目中JSP页面使用JSTL标签
- 排序3:插入排序
- 文本相似度算法(一):LCS动态规划
- Java内存管理(二)
- RESTful架构
- 异常Exception 基础
- ubuntu sever16.04修改过ip后,能ping通,但是shell连不上的原因
- 排序4:归并排序
- 堆栈练习3:HDOJ1022
- Tensorflow实现卷积神经网络
- 开心的小明