在自然语言处理领域,有一种算法叫做词嵌入向量(Word Embedding)法,算法的核心便是将语言抽象成代数中矩阵的形式进行运算。而其中一种很重要的方法便是词频统计法,该方法通过统计一段文本中每个单词出现的频数、建立文本段落的词频向量来确定文本的特征。其中词频向量是一个 1 x m的矩阵,其中每个分量都对应着某个单词的出现次数。
下面将给出若干段由小写英文字母组成的文本内容,请你通过上文描述的词频统计法计算出每段文本对应的词频向量,再判断这些向量所构成的向量组是否满足线性相关性质......
但是,善良的龙龙不忍心让你做这么繁琐又无聊的字符串处理工作。于是他偷偷帮你处理出了所有文本的词频向量,剩下的工作交给你了!
输入描述
第一行输入一个正整数 T [1,100],表示数据组数。
接下来 T 组数据,每组数据将输入 n+1 行,第一行输入两个正整数 n [1,10] 和 m [1,4] ,分别表示有 n 段文本,他们的词频向量维度都是 m 。
接下来 n 行,每行输入m 个非负整数,相邻两个整数由空格间隔开,其中第 i 行的输入表示龙龙帮你处理完的第 i 段文本的词频向量是 的形式,保证 0<=ai<=100。
输出描述
对于每组数据,请输出一行,如果这些词频向量组满足线性相关的性质,则请输出YES
,如果它们线性无关则请输出NO
,注意换行。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 2秒 | 64M | 0 |
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
int team;
scanf("%d",&team);
int n,m,pivotrow,nonzero,i,j,k;
float temp;
float a[20][20];
while(team--)
{
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
a[i][j]=0;
}
nonzero=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
{
for(j=1;j<=m;j++)
{
scanf("%f",&a[j][i]);
}
}
for(i=1;i<=m-1;i++)
{
pivotrow=i;
for(j=i+1;j<=m;j++) //寻找头值域最小的那一行
{
if(fabs(a[j][i])>fabs(a[pivotrow][i])) pivotrow=j;
}
for(k=i;k<=n;k++) //将第i行和标记行调换
{
temp=a[i][k];
a[i][k]=a[pivotrow][k];
a[pivotrow][k]=temp;
}
for(j=i+1;j<=n;j++)
{
if(a[i][i]==0) break; // 排除零行
temp=a[j][i]/a[i][i];
for(k=i;k<=n;k++)
{
a[j][k]-=a[i][k]*temp;
}
}
}
if(m>n) m=n;
for(i=1;i<=m;i++)
{
if(fabs(a[i][i]-0)>0.001) nonzero++;
//printf("%d\n",a[i][i]);
}
if(nonzero==n) printf("NO\n");
else printf("YES\n");
}
}