コード例 #1
0
inline int isContained_DBSizeEqual(struct PROJ_DB *pDB, TreeNode *currentLevel, TreeNode *candidate) 
{
	
	int		myItem = pDB->Item;
	bool	myItemIsIntra = pDB->ItemIsIntra;
	int		dir;
	bool	isContained;


	TreeNode *supNode;
	TreeNode *subNode;

	if ((myItem != candidate->Item) || (candidate->Items == (currentLevel->Items+1))) 
		return 0;

	if ( candidate->Items > (currentLevel->Items + 1))
		dir=1;
	else
		dir=-1;

	if (candidate->ItemIsIntra) {
		if (myItemIsIntra) {
			candidate=candidate->Parent;
		}
		else {
			//in this case, supNode must be candidate, subNode must be currentLevel
			while (candidate->ItemIsIntra && candidate->Items >0)
				candidate = candidate ->Parent;

			candidate=candidate->Parent;
			if ((candidate->Items < currentLevel->Items) || (candidate->ItemsetNumber < currentLevel->ItemsetNumber))
				return 0;
			
		}
	}
	else {
		if (myItemIsIntra) {
			//in this case, supNode must be currentLevel, subNode must be candidate
			while (currentLevel->ItemIsIntra && currentLevel->Items >0)
				currentLevel = currentLevel ->Parent;

			currentLevel=currentLevel->Parent;
			if ((candidate->Items > currentLevel->Items) || (candidate->ItemsetNumber > currentLevel->ItemsetNumber))
				return 0;

			
		}
		else {
			candidate=candidate->Parent;
		}
	}

	
	if (currentLevel->Items == 0) {
		return 1;
	}

	if (candidate->Items == 0) {
		return -1;
	}

	if ( dir == 1) {
		supNode=candidate;
		subNode=currentLevel;	
	}
	else {
		supNode=currentLevel;
		subNode=candidate;
	}

	isContained=false;
	supNode=GetLastItemSet(supNode, &supSet);
	subNode=GetLastItemSet(subNode, &subSet);

	while (1) {
		if (subSet.IsSubsetOf(&supSet)) {
			if (subNode->Items == 0) {
				isContained=true;
				break;
			}
			if ((supNode->Items >= subNode->Items) && (supNode->ItemsetNumber >= subNode->ItemsetNumber)) {
				supNode=GetLastItemSet(supNode, &supSet);
				subNode=GetLastItemSet(subNode, &subSet);
			}
			else
				break;
		}
		else {
			if (supNode->Items == 0) // unnecessary to check any more.
				break;

			if ((supNode->Items >= subNode->Items) && (supNode->ItemsetNumber >= subNode->ItemsetNumber)) {
				supNode=GetLastItemSet(supNode, &supSet);
			}
			else
				break;
		}

	}
	if (isContained)
		return dir;
	else
		return 0;


}