⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hunt2.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
# include "refer..c"static int *coord 0;int hh[50]; extern int *hfreq, hfrflg, hcomp(), hexch();extern int prfreqs;doquery(hpt, nhash, fb, nitem, qitem, master)	union ptr {unsigned *a; long *b;} master;	long *hpt;	FILE *fb;	char *qitem[];{long k;union ptr prevdrop;int nf 0, best 0, nterm 0, i, g, j;int *prevcoord;long lp;extern int lmaster, colevel, reached;long getl(); unsigned getw(); extern int iflong;# if D1fprintf(stderr, "entering doquery nitem %d\n",nitem);fprintf(stderr, "first few hashes are %ld %ld %ld %ld %ld\n", hpt[0],hpt[1],hpt[2],hpt[3],hpt[4]);fprintf(stderr, "and frequencies are  %d %d %d %d %d\n",hfreq[0],hfreq[1],hfreq[2],hfreq[3],hfreq[4]);# endif_assert (lmaster>0);if (coord==0)	coord = zalloc(lmaster, sizeof(lmaster));if (colevel>0)	{	prevdrop.a=zalloc(lmaster,iflong?4:2);	prevcoord = zalloc(lmaster, sizeof(lmaster));	}else	{	prevdrop.a=master.a;	prevcoord=coord;	}# if D1fprintf(stderr, "nitem %d\n",nitem);# endiffor(i=0; i<nitem; i++)	{	hh[i] = hash(qitem[i])%nhash;# if D1	fprintf(stderr,"query wd X%sX has hash %d\n", qitem[i], hh[i]);# endif	}# if D1fprintf(stderr, "past that loop nhash %d hpt is %lo\n", nhash, hpt);# endifif (prfreqs)	for(i=0; i<nitem; i++)		fprintf(stderr,"item %s hash %d hfreq %d\n",qitem[i], hh[i], hfreq[hh[i]]);/* if possible, sort query into decreasing frequency of hashes */if (hfrflg)	shell (nitem, hcomp, hexch);# if D1for(i=0; i<nitem; i++) fprintf(stderr, "item hash %d frq %d\n", hh[i], hfreq[hh[i]]);# endif	lp = hpt [hh[0]];# if D1fprintf(stderr,"first item hash %d lp %ld 0%lo\n", hh[0],lp,lp);# endif_assert (fb!=NULL);_assert (fseek(fb,lp,0)==NULL);for(i=0; i<lmaster; i++)	{	if (iflong)		master.b[i] = getl(fb);	else		master.a[i] = getw(fb);	coord[i]=1;# if D2	if (iflong)	fprintf(stderr,"master has %ld\n",(master.b[i]));	else	fprintf(stderr,"master has %d\n",(master.a[i]));# endif	_assert (i<lmaster);	if (iflong)		{		if (master.b[i] == -1L) break;		}	else		{		if (master.a[i] == -1) break;		}	}nf= i;for(nterm=1; nterm<nitem; nterm++)	{# ifdef D1	fprintf(stderr, "item %d, hash %d\n", nterm, hh[nterm]);# endif	if (colevel>0)		{		for(j=0; j<nf; j++)			{			if (iflong)			prevdrop.b[j] = master.b[j];			else			prevdrop.a[j] = master.a[j];			prevcoord[j] = coord[j];			}		}	lp = hpt[hh[nterm]];	_assert (fseek(fb, lp, 0)==0);# if D1	fprintf(stderr,"item %d hash %d seek to %ld\n",nterm,hh[nterm],lp);# endif	g=j=0;	while (1)		{		if (iflong)			k = getl(fb);		else			k = getw(fb);		if (k== -1) break;# if D2		fprintf(stderr,"next term finds %ld\n",k);# endif# if D3		if (iflong)		fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.b[j],(long)(k));		else		fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.a[j],(long)(k));# endif		while (j<nf && (iflong?prevdrop.b[j]:prevdrop.a[j])<k)			{# if D3			if (iflong)			fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",			j,nf,prevdrop.b[j], prevcoord[j], colevel, nterm, (long)(k));			else			fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",			j,nf,prevdrop.a[j], prevcoord[j], colevel, nterm, (long)(k));# endif			if (prevcoord[j] + colevel <= nterm)				j++;			else				{				_assert (g<lmaster);				if (iflong)				master.b[g] = prevdrop.b[j];				else				master.a[g] = prevdrop.a[j];				coord[g++] = prevcoord[j++];# if D1if (iflong)fprintf(stderr, " not skip g %d doc %d coord %d note %d\n",g,master.b[g-1], coord[g-1],master.b[j-1]);elsefprintf(stderr, " not skip g %d doc %ld coord %d nterm %d\n",g,master.a[g-1], coord[g-1],nterm);# endif				continue;				}			}		if (colevel==0 && j>=nf) break;		if (j<nf && (iflong? prevdrop.b[j]: prevdrop.a[j]) == k)			{			if (iflong)			master.b[g]=k;			else			master.a[g]=k;			coord[g++] = prevcoord[j++]+1;# if D1if (iflong)			fprintf(stderr, " at g %d item %ld coord %d note %ld\n",g,master.b[g-1],coord[g-1],master.b[j-1]);else			fprintf(stderr, " at g %d item %d coord %d note %d\n",g,master.a[g-1],coord[g-1],master.a[j-1]);# endif			}		else		if (colevel >= nterm)			{			if (iflong)			master.b[g]=k;			else			master.a[g]=k;			coord[g++] = 1;			}		}# if D1fprintf(stderr,"now have %d items\n",g);# endif	if (colevel>0)	for ( ; j<nf; j++)		if ((iflong?prevcoord.b[j]:prevcoord.a[j])+colevel > nterm)			{			_assert(g<lmaster);			if (iflong)			master.b[g] = prevdrop.b[j];			else			master.a[g] = prevdrop.a[j];			coord[g++] = prevcoord[j];# if D3if(iflong)fprintf(stderr, "copied over %ld coord %d\n",master.b[g-1], coord[g-1]);elsefprintf(stderr, "copied over %d coord %d\n",master.a[g-1], coord[g-1]);# endif			}	nf = g;	}if (colevel>0)	{	best=0;	for(j=0; j<nf; j++)		if (coord[j]>best) best = coord[j];# if D1	fprintf(stderr, "colevel %d best %d\n", colevel, best);# endif	reached = best;	for(g=j=0; j<nf; j++)		if (coord[j]==best)			{			if (iflong)			master.b[g++] = master.b[j];			else			master.a[g++] = master.a[j];			}	nf=g;# if D1	fprintf(stderr, "yet got %d\n",nf);# endif	}# ifdef D1	fprintf(stderr, " returning with %d\n",nf);# endifif (colevel)	{	free(prevdrop, lmaster, iflong?4:2);	free(prevcoord, lmaster, sizeof (lmaster));	}# if D3for(g=0;g<nf;g++)if(iflong)fprintf(stderr,":%ld\n",master.b[g]);elsefprintf(stderr,":%d\n",master.a[g]);# endifreturn(nf);}longgetl(fb)	FILE *fb;{int x[2];long *lp;x[0] = getw(fb);x[1] = getw(fb);lp= x;return(*lp);}putl(ll, f)	long ll;	FILE *f;{int *x;x = &ll;putw(x[0], f);putw(x[1], f);}hcomp( n1, n2){return (hfreq[hh[n1]]<=hfreq[hh[n2]]);}hexch( n1, n2 ){int t;t = hh[n1];hh[n1] = hh[n2];hh[n2] = t;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -