亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hnsrtreefileobj1.cpp

?? SR-tree is an index structure for high-dimensional nearest neighbor queries
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
    int reinsertCount = numClusters * info.getReinsertFactor() / 100;
    HnPoint centroid;
    int i, axis;
    HnSRTreeReinsertionEntry *entries;

    /* initialize flags */
    if ( flags != NULL ) {
	delete[] flags;
    }
    flags = new ReinsertFlag[numClusters];

    for ( i=0; i<numClusters; i++ ) {
	flags[i] = REINSERT_NONE;
    }

    /* calculate centroid */
    centroid = new_HnPoint(dimension);

    for ( axis=0; axis<dimension; axis++ ) {
	double sum = 0;
	int total = 0;

	for ( i=0; i<numClusters; i++ ) {
	    double coord = clusters[i].getCentroid().getCoordAt(axis);
	    int weight = clusters[i].getWeight();

	    sum += coord * weight;
	    total += weight;
	}

	centroid.setCoordAt(sum / total, axis);
    }

    /* initialize entries */
    entries = (HnSRTreeReinsertionEntry *)
	HnMalloc(sizeof(HnSRTreeReinsertionEntry) * numClusters);

    for ( i=0; i<numClusters; i++ ) {
	entries[i].index = i;
	entries[i].distance = clusters[i].getCentroid().getDistance(centroid);
    }

    /* sort clusters by distance in descent order */
    qsort(entries, numClusters, sizeof(HnSRTreeReinsertionEntry),
	  HnSRTreeCompareReinsertionEntries);

    /* make reinsert flags */
    i=0;
    while ( i<reinsertCount ) {
	flags[entries[i].index] = REINSERT;
	i++;
    }
    while ( i<numClusters ) {
	flags[entries[i].index] = STAY;
	i++;
    }

    if ( debug ) {
	fprintf(stderr, "HnSRTreeFileObj::selectClusters:\n");
	fprintf(stderr, "    REINSERT\n");
	for ( i=0; i<numClusters; i++ ) {
	    if ( flags[i] == REINSERT ) {
		fprintf(stderr,
			"    clusters[%d].getCentroid()."
			"getDistance(centroid) = %g\n",
			i, clusters[i].getCentroid().getDistance(centroid));
	    }
	}
	fprintf(stderr, "    STAY\n");
	for ( i=0; i<numClusters; i++ ) {
	    if ( flags[i] == STAY ) {
		fprintf(stderr,
			"    clusters[%d].getCentroid()."
			"getDistance(centroid) = %g\n",
			i, clusters[i].getCentroid().getDistance(centroid));
	    }
	}
    }

    *flags_return = flags;

    HnFree(entries, sizeof(HnSRTreeReinsertionEntry) * numClusters);
}

/*
 * Split
 */

void
HnSRTreeFileObj::splitLeaf(HnSRTreeStack &stack,
			   const HnPoint &newPoint,
			   const HnDataItem &newDataItem)
{
    HnSRTreeLeaf leaf, left, right;
    int i;
    HnPointArray points;
    SplitFlag *flags;

    leaf = stack.getTopLeaf();

    if ( debug ) {
	fprintf(stderr, "HnSRTreeFileObj::splitLeaf: leaf = %s\n",
		(char *)leaf.toString());
    }

    /* put points into an array */
    points = new_HnPointArray(leaf.getCount() + 1);
    for ( i=0; i<leaf.getCount(); i++ ) {
	points[i] = leaf.getPointAt(i);
    }
    points[i] = newPoint;

    /* split points */
    splitPoints(points, &flags);

    /* put points into the left and right leaves */
    left = new_HnSRTreeLeaf(info, leaf.getOffset());
    right = allocateLeaf();

    for ( i=0; i<leaf.getCount(); i++ ) {
	switch ( flags[i] ) {
	case LEFT:
	    left.addElement(leaf.getPointAt(i), leaf.getDataItemAt(i));
	    break;
	case RIGHT:
	    right.addElement(leaf.getPointAt(i), leaf.getDataItemAt(i));
	    break;
	default:
	    HnAbort("split flag is incorrectly assigned.");
	}
    }
    switch ( flags[i] ) {
    case LEFT:
	left.addElement(newPoint, newDataItem);
	break;
    case RIGHT:
	right.addElement(newPoint, newDataItem);
	break;
    default:
	HnAbort("split flag is incorrectly assigned.");
    }

    if ( debug ) {
	fprintf(stderr, "HnSRTreeFileObj::splitLeaf: left  = %s\n",
		(char *)left.toString());
	fprintf(stderr, "HnSRTreeFileObj::splitLeaf: right = %s\n",
		(char *)right.toString());
    }

    writeLeaf(left);
    writeLeaf(right);

    stack.pop();

    updateNode(stack,
	       left.getCluster(), left.getOffset(),
	       right.getCluster(), right.getOffset());

    profile->numLeafSplits ++;
}

void
HnSRTreeFileObj::splitNode(HnSRTreeStack &stack,
			   const HnSRTreeCluster &newCluster, long newOffset)
{
    HnSRTreeNode node, left, right;
    int i;
    HnSRTreeClusterArray clusters;
    SplitFlag *flags;

    node = stack.getTopNode();

    if ( debug ) {
	fprintf(stderr, "HnSRTreeFileObj::splitNode: node = %s\n",
		(char *)node.toString());
    }

    /* put clusters into an array */
    clusters = new_HnSRTreeClusterArray(node.getCount() + 1);
    for ( i=0; i<node.getCount(); i++ ) {
	clusters[i] = node.getClusterAt(i);
    }
    clusters[i] = newCluster;

    /* split clusters */
    splitClusters(clusters, &flags);

    /* put clusters into the left and right nodes */
    left = new_HnSRTreeNode(info, node.getOffset());
    right = allocateNode();

    for ( i=0; i<node.getCount(); i++ ) {
	switch ( flags[i] ) {
	case LEFT:
	    left.addElement(node.getClusterAt(i), node.getOffsetAt(i));
	    break;
	case RIGHT:
	    right.addElement(node.getClusterAt(i), node.getOffsetAt(i));
	    break;
	default:
	    HnAbort("split flag is incorrectly assigned.");
	}
    }
    switch ( flags[i] ) {
    case LEFT:
	left.addElement(newCluster, newOffset);
	break;
    case RIGHT:
	right.addElement(newCluster, newOffset);
	break;
    default:
	HnAbort("split flag is incorrectly assigned.");
    }

    if ( debug ) {
	fprintf(stderr, "HnSRTreeFileObj::splitNode: left  = %s\n",
		(char *)left.toString());
	fprintf(stderr, "HnSRTreeFileObj::splitNode: right = %s\n",
		(char *)right.toString());
    }

    writeNode(left);
    writeNode(right);

    stack.pop();

    updateNode(stack,
	       left.getCluster(), left.getOffset(),
	       right.getCluster(), right.getOffset());

    profile->numNodeSplits ++;
}

void
HnSRTreeFileObj::updateNode(HnSRTreeStack &stack,
			    const HnSRTreeCluster &leftCluster,
			    long leftOffset,
			    const HnSRTreeCluster &rightCluster,
			    long rightOffset)
{
    HnSRTreeNode node;
    int cursor;

    if ( stack.getDepth() == 0 ) {
	extendTree(leftCluster, leftOffset, rightCluster, rightOffset);
    }
    else {
	node = stack.getTopNode();
	cursor = stack.getCursor();

	node.setElementAt(leftCluster, leftOffset, cursor);

	if ( node.isFull() ) {
	    int reinsertCount =
		(node.getCount() + 1) * info.getReinsertFactor() / 100;

	    if ( stack.getDepth() == 1 ) {
		/* the parent is the root node */
		splitNode(stack, rightCluster, rightOffset);
	    }
	    else if ( reinsertCount <= 0 ) {
		/* no entry needs to be reinserted */
		splitNode(stack, rightCluster, rightOffset);
	    }
	    else {
		/* reinsert some of entries */
		int index = -1;

		if ( (index =
		      reinsertedBlocks.indexOf(node.getOffset())) < 0 ) {
		    reinsertedBlocks.addElement(node.getOffset());
		    reinsertNode(stack, rightCluster, rightOffset);
		}
		else {
		    reinsertedBlocks.removeElementAt(index);
		    splitNode(stack, rightCluster, rightOffset);
		}
	    }
	}
	else {
	    node.addElement(rightCluster, rightOffset);

	    writeNode(node);
	    updateCluster(stack);
	}
    }
}

void
HnSRTreeFileObj::extendTree(const HnSRTreeCluster &leftCluster,
			    long leftOffset,
			    const HnSRTreeCluster &rightCluster,
			    long rightOffset)
{
    HnSRTreeNode node;

    node = allocateNode();
    node.addElement(leftCluster, leftOffset);
    node.addElement(rightCluster, rightOffset);
    writeNode(node);

    info.setRootOffset(node.getOffset());
    info.setHeight(info.getHeight() + 1);
    writeSuperBlock();
}

/*
 * Split
 */

struct HnSRTreeAxisSortEntry {
    int index;
    double coord;
};

static int
HnSRTreeCompareAxisSortEntries(const void *ptr1, const void *ptr2)
{
    HnSRTreeAxisSortEntry *entry1 = (HnSRTreeAxisSortEntry *)ptr1;
    HnSRTreeAxisSortEntry *entry2 = (HnSRTreeAxisSortEntry *)ptr2;

    if ( entry1->coord == entry2->coord ) {
	return 0;
    }
    else {
	if ( entry1->coord < entry2->coord ) {
	    return -1;
	}
	else {
	    return 1;
	}
    }
}

/*
 * Split (leaf)
 */

void
HnSRTreeFileObj::splitPoints(const HnPointArray &points,
			     SplitFlag **flags_return)
{
    static SplitFlag *flags = NULL;
    int numPoints = points.length;
    int dimension = info.getDimension();
    int minCount, maxCount;
    struct {
	int axis;
	double var;
    } max;
    struct {
	int count;
	double leftVar, rightVar;
    } min;
    int axis, count;
    int i;
    HnSRTreeAxisSortEntry *entries;

    /* initialize minCount and maxCount */
    if ( (minCount = numPoints * info.getSplitFactor() / 100) == 0 ) {
	minCount = 1;
    }
    maxCount = numPoints - minCount;

    /* initialize flags */
    if ( flags != NULL ) {
	delete[] flags;
    }
    flags = new SplitFlag[numPoints];

    for ( i=0; i<numPoints; i++ ) {
	flags[i] = SPLIT_NONE;
    }

    max.axis = -1;
    max.var = -1;

    /* calculate variance */
    for ( axis=0; axis<dimension; axis++ ) {
	double avg, var;
	double sum = 0;
	double sum2 = 0;

	for ( i=0; i<numPoints; i++ ) {
	    double coord = points[i].getCoordAt(axis);
	    sum += coord;
	    sum2 += coord * coord;
	}

	avg = sum / numPoints;
	var = sum2 / numPoints - avg * avg;

	if ( max.axis == -1 ) {
	    max.axis = axis;
	    max.var = var;
	}
	else {
	    if ( var > max.var ) {
		max.axis = axis;
		max.var = var;
	    }
	}
    }

    /* sort points along the max variance axis */
    entries = (HnSRTreeAxisSortEntry *)
	HnMalloc(sizeof(HnSRTreeAxisSortEntry) * numPoints);

    for ( i=0; i<numPoints; i++ ) {
	entries[i].index = i;
	entries[i].coord = points[i].getCoordAt(max.axis);
    }

    qsort(entries, numPoints, sizeof(HnSRTreeAxisSortEntry),
	  HnSRTreeCompareAxisSortEntries);

    /* choose split point */
    min.count = -1;
    min.leftVar = 0;
    min.rightVar = 0;

    for ( count=minCount; count<=maxCount; count++ ) {
	double leftVar, rightVar;

	/* calculate the sum of variances on the left side */
	leftVar = 0;

	for ( axis=0; axis<dimension; axis++ ) {
	    double sum, sum2, avg, var;

	    sum = 0;
	    sum2 = 0;

	    for ( i=0; i<count; i++ ) {
		double coord = points[entries[i].index].getCoordAt(axis);
		sum += coord;
		sum2 += coord * coord;
	    }

	    avg = sum / count;
	    var = sum2 / count - avg * avg;

	    leftVar += var;
	}

	/* calculate the sum of variances on the right side */
	rightVar = 0;

	for ( axis=0; axis<dimension; axis++ ) {
	    double sum, sum2, avg, var;

	    sum = 0;
	    sum2 = 0;

	    for ( i=count; i<numPoints; i++ ) {
		double coord = points[entries[i].index].getCoordAt(axis);
		sum += coord;
		sum2 += coord * coord;
	    }
	    avg = sum / (numPoints - count);
	    var = sum2 / (numPoints - count) - avg * avg;

	    rightVar += var;
	}

	if ( min.count < 0 ) {
	    min.count = count;
	    min.leftVar = leftVar;
	    min.rightVar = rightVar;
	}
	else {
	    if ( leftVar + rightVar < min.leftVar + min.rightVar ) {
		min.count = count;
		min.leftVar = leftVar;
		min.rightVar = rightVar;
	    }
	}
    }

    /* make split flags */
    i=0;
    while ( i<min.count ) {
	flags[entries[i].index] = LEFT;
	i++;
    }
    while ( i<numPoints ) {
	flags[entries[i].index] = RIGHT;
	i++;
    }

    if ( debug ) {
	fprintf(stderr, "HnSRTreeFileObj::splitPoints\n");
	fprintf(stderr, "    LEFT\n");
	for ( i=0; i<numPoints; i++ ) {
	    if ( flags[i] == LEFT )
		fprintf(stderr,
			"    points[%d].getCoordAt(%d) = %g\n",
			i, max.axis, points[i].getCoordAt(max.axis));
	}
	fprintf(stderr, "    RIGHT\n");
	for ( i=0; i<numPoints; i++ ) {
	    if ( flags[i] == RIGHT )
		fprintf(stderr,
			"    points[%d].getCoordAt(%d) = %g\n",
			i, max.axis, points[i].getCoordAt(max.axis));
	}
    }

    *flags_return = flags;

    HnFree(entries, sizeof(HnSRTreeAxisSortEntry) * numPoints);
}

/*
 * Split (node)
 */

void
HnSRTreeFileObj::splitClusters(const HnSRTreeClusterArray &clusters,
			       SplitFlag **flags_return)
{
    static SplitFlag *flags = NULL;
    int numClusters = clusters.length;
    int dimension = info.getDimension();
    int minCount, maxCount;
    struct {
	int axis;
	double var;
    } max;
    struct {
	int count;
	double leftVar, rightVar;
    } min;
    int axis, count;
    int i;
    HnSRTreeAxisSortEntry *entries;

    /* initialize minCount and maxCount */
    if ( (minCount = numClusters * info.getSplitFactor() / 100) == 0 ) {
	minCount = 1;
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一级在线观看| 亚洲二区视频在线| 欧美国产乱子伦 | 亚洲欧洲制服丝袜| 一区二区三区资源| 亚洲福利电影网| 激情久久久久久久久久久久久久久久| 亚洲亚洲人成综合网络| 亚洲成人一二三| 国模无码大尺度一区二区三区| 极品少妇xxxx精品少妇偷拍| 粉嫩高潮美女一区二区三区| 99热精品一区二区| 久久综合色天天久久综合图片| 欧美国产综合一区二区| 亚洲国产视频一区| 粉嫩一区二区三区在线看| 色综合视频一区二区三区高清| 欧美精品亚洲一区二区在线播放| 欧美成人高清电影在线| 亚洲国产综合在线| 大胆亚洲人体视频| 精品久久免费看| 男女性色大片免费观看一区二区 | 亚洲精品视频免费观看| 亚洲日本在线看| 成人免费高清视频在线观看| 日韩欧美中文一区二区| 五月天一区二区| 欧美一三区三区四区免费在线看 | 9191精品国产综合久久久久久 | 亚洲777理论| 久久福利资源站| 日韩欧美在线123| 免费精品视频最新在线| 91精品国产免费| 免费看欧美美女黄的网站| 欧美精品视频www在线观看| 午夜伊人狠狠久久| 日韩精品影音先锋| 成人爱爱电影网址| 亚洲在线免费播放| 欧美一区午夜视频在线观看 | 欧美视频一区二| 美国十次了思思久久精品导航| 精品少妇一区二区三区在线播放| 美日韩黄色大片| 国产精品福利一区二区| 国产成人综合网| 日日摸夜夜添夜夜添国产精品 | 欧美日韩亚洲丝袜制服| 亚洲丶国产丶欧美一区二区三区| 紧缚捆绑精品一区二区| 亚洲视频一二三区| 精品国一区二区三区| 爽好多水快深点欧美视频| 久久久久久**毛片大全| 亚洲人被黑人高潮完整版| 国产精品主播直播| 99久久精品费精品国产一区二区| 精品福利视频一区二区三区| 亚洲男女毛片无遮挡| 日韩片之四级片| 欧美一区二区三区视频在线观看| 成人午夜免费电影| 国产大陆a不卡| 国产精品1区二区.| 黄色成人免费在线| 久久精品av麻豆的观看方式| 亚洲最色的网站| 亚洲乱码国产乱码精品精可以看 | 国产精品88888| 国产麻豆一精品一av一免费| 日日噜噜夜夜狠狠视频欧美人| 亚洲精品中文在线观看| 亚洲天堂久久久久久久| 欧美高清在线精品一区| 欧美高清一级片在线观看| 国产午夜精品一区二区三区嫩草| 精品国产伦一区二区三区观看体验| 欧美二区乱c少妇| 26uuu亚洲综合色欧美| 国产日韩欧美在线一区| 国产精品欧美久久久久一区二区| 国产精品久久久久久久第一福利| 日韩美女视频一区二区| 天堂成人免费av电影一区| 美女视频第一区二区三区免费观看网站| 麻豆国产欧美日韩综合精品二区| 另类的小说在线视频另类成人小视频在线 | 欧美手机在线视频| 精品区一区二区| 亚洲三级在线免费| 免费精品视频在线| 欧美色电影在线| 国产女同互慰高潮91漫画| 日韩国产一二三区| 91性感美女视频| 国产日本欧美一区二区| 五月天久久比比资源色| 成人伦理片在线| 久久午夜老司机| 九九视频精品免费| 欧美电影免费观看高清完整版在线| 中文字幕精品一区二区精品绿巨人 | 欧美最猛黑人xxxxx猛交| 国产精品日日摸夜夜摸av| 韩国一区二区三区| 日韩女优视频免费观看| 青青草国产精品97视觉盛宴| 欧美亚洲综合一区| 午夜伦理一区二区| 日韩黄色免费电影| 激情五月婷婷综合| 国产喷白浆一区二区三区| 国产一区在线看| 国产精品久久毛片av大全日韩| 国产精一区二区三区| 久久综合九色欧美综合狠狠| 国产伦理精品不卡| 欧美国产精品一区二区| 97国产精品videossex| 亚洲啪啪综合av一区二区三区| 99精品视频中文字幕| 性久久久久久久久久久久| 91精品国产欧美一区二区成人| 青青草国产成人av片免费| 国产色综合一区| 欧美日韩一区二区三区不卡| 久久99精品久久久久婷婷| 成人欧美一区二区三区1314| 欧美日韩一区二区三区免费看 | 久久久亚洲精品石原莉奈| 成人夜色视频网站在线观看| 亚洲欧美偷拍三级| 久久精品人人做人人爽人人| 欧美视频一区二| 99这里都是精品| 国产精品一二三四区| 麻豆91在线播放| 蜜桃精品视频在线观看| 蜜臀91精品一区二区三区| 日韩一区中文字幕| 日本黄色一区二区| 欧美激情一区二区三区蜜桃视频| 狠狠色综合播放一区二区| 91精品国产综合久久精品app | 91精品福利视频| 亚洲美女视频在线| 日韩一区二区影院| 91精品婷婷国产综合久久竹菊| 日本乱人伦一区| 欧美久久一区二区| 欧美一级艳片视频免费观看| 成人av网站免费| 99久久国产综合精品色伊| 91美女精品福利| 精品一区二区日韩| 无码av中文一区二区三区桃花岛| 337p亚洲精品色噜噜狠狠| 成人精品国产福利| 国产精品一区二区免费不卡| gogogo免费视频观看亚洲一| 成人免费视频免费观看| 欧美日韩一区二区三区视频| 2020国产精品自拍| 亚洲欧美在线aaa| 欧美aaa在线| av在线免费不卡| 日韩久久久久久| 亚洲成人免费av| 国产·精品毛片| 日韩精品一区二区三区视频| 一区二区三区日韩欧美精品| 亚洲午夜久久久久久久久久久| 国产精品三级av| 日本亚洲电影天堂| 国产高清精品网站| 一道本成人在线| 国产亚洲综合av| 欧美aaaaa成人免费观看视频| 波多野结衣在线aⅴ中文字幕不卡| 99久久精品免费精品国产| 精品久久人人做人人爰| 久久亚洲一级片| 美女视频免费一区| 欧美丰满嫩嫩电影| 亚洲午夜精品17c| www.色综合.com| 国产亚洲1区2区3区| 亚洲va中文字幕| 欧洲一区二区三区免费视频| 韩国精品一区二区| 色婷婷激情一区二区三区| 精品国产1区二区| 国产激情一区二区三区四区 | 福利视频网站一区二区三区| 91在线国产福利| 亚洲一区二区三区在线播放| 91啪在线观看|