大作业的一部分,写倒排求交算法并用数据测试,但老师给的数据不会用……
数据集描述(有ExpIndex与Expquery两个文件):
1、ExpIndex是二进制倒排索引文件,全部数据均为四字节无符号整数(小端)。格式为:
[数组1]长度,[数组1],[数组2]长度,[数组2]….
2、ExpQuery是文本文件,文件内每一行为一条查询记录;行中的每个数字对应索引文件的数组下标(term编号)。
注:ExpQuery文件在Windows系统下请使用写字板等工具打开。
要求是对ExpQuery中全部查询请求,进行列表(来自于ExpIndex)求交运算,计算平均响应时间和吞吐率。
想问一下这两个文件怎么样处理?主要是二进制文件应该怎么样操作使其存进一个个链表,谢谢。
数据集描述(有ExpIndex与Expquery两个文件):
1、ExpIndex是二进制倒排索引文件,全部数据均为四字节无符号整数(小端)。格式为:
[数组1]长度,[数组1],[数组2]长度,[数组2]….
2、ExpQuery是文本文件,文件内每一行为一条查询记录;行中的每个数字对应索引文件的数组下标(term编号)。
注:ExpQuery文件在Windows系统下请使用写字板等工具打开。
要求是对ExpQuery中全部查询请求,进行列表(来自于ExpIndex)求交运算,计算平均响应时间和吞吐率。
想问一下这两个文件怎么样处理?主要是二进制文件应该怎么样操作使其存进一个个链表,谢谢。
解决方案
40
仅供参考,不一定对:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
FILE *fi;
struct _INDEX {
unsigned short len;
unsigned short *arr;
} *idx;
int MAXARRS=100;
unsigned short i,alen;
unsigned short *aarr;
int j,n;
int main() {
fi=fopen("ExpIndex","rb");
if (NULL==fi) {
printf("Can not open file ExpIndex!\n");
return 1;
}
idx=(struct _INDEX *)malloc(MAXARRS*sizeof(struct _INDEX));
if (NULL==idx) {
printf("Can not malloc %d bytes for idx!\n",MAXARRS*sizeof(struct _INDEX));
return 2;
}
j=0;
while (1) {
fread(&alen,sizeof(unsigned short),1,fi);
if (feof(fi)) break;
aarr=(unsigned short *)malloc(alen*sizeof(unsigned short));
if (NULL==aarr) {
printf("Can not malloc %d bytes for aarr!\n",alen*sizeof(unsigned short));
return 3;
}
for (i=0;i<len;i++) {
fread(&aarr[i],sizeof(unsigned short),1,fi);
if (feof(fi)) break;
}
if (feof(fi)) break;
idx[j].len=alen;
idx[j].arr=aarr;
j++;
if (j>=MAXARRS) {
printf("Too many arrays(>=%d)!\n",MAXARRS);
break;
}
}
fclose(fi);
n=j;
for (j=0;j<n;j++) {
printf("j=%03d ",j);
printf("len=%03d",idx[j].len);
for (i=0;i<len;i++) printf(" %hu",idx[j].arr[i]);
printf("\n");
}
for (j=0;j<n;j++) free(idx[j].arr);
free(idx);
return 0;
}