#include #include #include void Compact(int i, int j, int nTuples, char newName[]); void Swap(int i, int j); void PrintRelData(); #define MAXRELS 10 int nRels; int nAttrs; int T[MAXRELS]; char name[MAXRELS][1000]; // Name of relation // Initially: R, S, T, U // Can change to: R |X| S, etc int nData; int V[MAXRELS][5]; char rel = 'R'; char attr = 'a'; double Cost[MAXRELS][MAXRELS]; int main(int argc, char *argv[]) { int i, j, k; char a, b; /* ================================ Read # relations and T(R) data ================================ */ scanf("%d %d\n", &nRels, &nAttrs); printf("# relations = %d, # attributes = %d\n", nRels, nAttrs); for ( k = 0; k < nRels; k++ ) { scanf("%s", name[k]); scanf("%d\n", &T[k]); printf("T(%s) = %d\n", name[k], T[k]); } /* ==================================== Read # data points and V(R,a) data ==================================== */ scanf("%d\n", &nData); printf("# input data = %d\n", nData); for ( i = 0; i < nRels; i++ ) for ( j = 0; j < nRels; j++ ) V[i][j] = -1; for ( k = 0; k < nData; k++ ) { char relName[100]; int x; scanf("%s %c", relName, &b); scanf("%d\n", &x); for (i = 0; i < nRels; i++) { if ( strcmp( relName, name[i] ) == 0 ) { V[i][b-attr] = x; break; } } if ( i == nRels ) { printf("**** Relation %s not found - exit\n", relName); exit(1); } else printf("V(%s,%c) = %d\n", name[i], b, V[i][b-attr]); } /* ============================= Join 2 ============================= */ int bestI, bestJ; double bestCost = 999999999; putchar('\n'); for ( i = 0; i < nRels; i++ ) { for ( j = i; j < nRels; j++ ) { if ( i == j ) continue; double max = 1; for ( k = 0; k < nAttrs; k++ ) { if ( V[i][k] > 0 && V[j][k] > 0 ) max = ( V[i][k] > V[j][k] ) ? V[i][k] : V[j][k] ; } Cost[i][j] = T[i]*T[j]/max; printf("Cost %s|X|%s = %d * %d / %7.1lf", name[i], name[j], T[i],T[j],max); printf(" = %7.2lf", Cost[i][j]); if ( Cost[i][j] < bestCost ) { bestCost = Cost[i][j]; bestI = i; bestJ = j; printf(" +++++\n"); } else { printf("\n"); } } } char newName[100]; if ( T[bestI] <= T[bestJ] ) { sprintf(newName, "(%s|X|%s)", name[bestI], name[bestJ]); } else { sprintf(newName, "(%s|X|%s)", name[bestJ], name[bestI]); } printf("(1) ====> %s\n\n\n", newName); }