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

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

?? x_tree.h

?? X-tree的C++源碼
?? H
?? 第 1 頁 / 共 5 頁
字號:
	mbr[i] = entries[0].bounces[i];    n = get_num();    for (j = 1; j < n; j++)    {	for (i = 0; i < 2*dimension; i += 2)	{	    mbr[i]   = min(mbr[i],   entries[j].bounces[i]);	    mbr[i+1] = max(mbr[i+1], entries[j].bounces[i+1]);        }    }    return mbr;}template <class DATA>float* XTDirNode<DATA>::calc_mbr(DirEntry<DATA> *de, int num_entries)// Calculates the Minimal Bounding Rectangle for a set of Directory Entries {    int i, j;    float *mbr;        mbr = new float[2*dimension];    for (i = 0; i < 2*dimension; i++)        mbr[i] = de[0].bounces[i];        for (j = 0; j < num_entries; j++)    {        for (i = 0; i < 2*dimension; i += 2)	{	    mbr[i]   = min(mbr[i],   de[j].bounces[i]);	    mbr[i+1] = max(mbr[i+1], de[j].bounces[i+1]);	}    }        return mbr;}template <class DATA> void XTDirNode<DATA>::enter(DirEntry<DATA> *de){    // ist ein Einfuegen ueberhaupt moeglich?    if (get_num() > (capacity-1))        error("XTDirNode::enter: called, but node is full", TRUE);      // Eintrag an erste freie Stelle kopieren    entries[num_entries] = *de;    // jetzt gibts einen mehr    num_entries++;    // Eintrag freigeben, aber keine Nachfolgeknoten loeschen !!!!    de->son_ptr = NULL;    delete de;}template <class DATA>void XTDirNode<DATA>::adapt_node(int mult)// adapt node to a multiple of EXT_SIZE{    int i, n;    int size, upper_border;    int* intern_help;    DirEntry<DATA> *new_entries;            n = get_num();    // insure adapting to a multiple of EXT_SIZE    if (nodesize == 1)    {	size = 0;	upper_border = 4;    }    else    {	size = nodesize;	upper_border = EXT_SIZE*mult;    }        // adapt intern_block    // allocate one more intern blocks than necessary to avoid memory conflicts in    // read_from_buffer and write_to_buffer    intern_help = new int[size+EXT_SIZE*mult+1];    for (i = 0; i < nodesize; i++)	intern_help[i] = intern_block[i];    delete [] intern_block;    intern_block = intern_help;    // append new blocks to file    for (i = 0; i < upper_border; i++)	intern_block[nodesize+i] = my_tree->file->append_block(my_tree->block_buffer);    nodesize = size + EXT_SIZE * mult;    capacity = nodesize * block_capacity;        new_entries = new DirEntry<DATA>[capacity];    memcpy(new_entries, entries, n*sizeof(DirEntry<DATA>));    // delete old entries    for (i = 0; i < n; i++)    {	entries[i].bounces = NULL;	entries[i].son_ptr = NULL;    }    delete [] entries;    entries = new_entries;}template <class DATA> bool XTDirNode<DATA>::split(XTDirNode<DATA> **sn, int *dimen)// splittet den aktuellen Knoten so auf, dass m mbrs nach sn verschoben// werden und gibt TRUE zurueck, wenn der Split ausgefuehrt wird bzw. FALSE,// wenn ein Supernode erstellt wird.// In dimen wird die Split-Dimension an den aufrufenden Knoten zurueckgegeben, um dort// die Split-History zu aktualisieren.{    int i, *distribution, dist, dist2, n, dim;    float **mbr_array;    float *r1, *r2;    float a1, a2, o, overlap_relative;    int *split_hist;    DirEntry<DATA> *new_entries1, *new_entries2;    int size_of_new_node;#ifdef SHOWMBR	split_000++;#endif    // no split, if node is supernode    dim = 0;	    // wieviele sind denn nun belegt?    n = get_num();    // mbr_array allokieren und belegen    mbr_array = new floatptr[n];    split_hist = new int[n];    for (i = 0; i < n; i++)    {	mbr_array[i] = entries[i].bounces;	split_hist[i] = entries[i].history;    }        // Verteilung berechnen    dist = XTNode<DATA>::topological_split(mbr_array, &distribution, &dim);    // neues Datenarray erzeugen    // --> siehe Konstruktor    XTDirNode__dimension = dimension;    XTDirNode__my_tree = my_tree;    new_entries1 = new DirEntry<DATA>[capacity];    new_entries2 = new DirEntry<DATA>[capacity];        for (i = 0; i < dist; i++)    {	new_entries1[i] = entries[distribution[i]];    }    for (i = dist; i < n; i++)    {	new_entries2[i-dist] = entries[distribution[i]];    }        // Calculate the overlap size of the two mbrs    r1 = calc_mbr(new_entries1, dist);    r2 = calc_mbr(new_entries2, n-dist);    o = overlap(dimension, r1, r2);    a1 = area(dimension, r1);    a2 = area(dimension, r2);    overlap_relative = o / (a1+a2-o);        if (overlap_relative > MAX_OVERLAP)    {	// topological split fails -> try overlap minimal split        dist2 = XTNode<DATA>::overlap_free_split(mbr_array, split_hist, &distribution, &dim);		if (dist2 != 0)	{	    // split_axis found	    dist = dist2;	    	    // delete mbr_array and split history	    delete [] mbr_array;	    delete [] split_hist;	    	    // test for unbalanced nodes	    if (((dist < (block_capacity*MIN_FANOUT)) || ((n-dist) < (block_capacity*MIN_FANOUT))))	    {		// dirnode has to be adapted to the size of the next greater multiple of EXT_SIZE		adapt_node (((n/block_capacity+1) / EXT_SIZE) + 1);				for (i = 0; i < n; i++)		{		    new_entries1[i].bounces = NULL;		    new_entries1[i].son_ptr = NULL;                     		    new_entries2[i].bounces = NULL;		    new_entries2[i].son_ptr = NULL;                     		}		delete [] new_entries1;		delete [] new_entries2;                // Testausgabe		printf("DIRECTORY SPLIT : Creating Supernode.\n");		printf("Alter und neuer Knoten => Entries : %d, capacity : %d, nodesize : %d\n", num_entries, capacity, nodesize);				return FALSE;	    }	    else	    {		// nodes are balanced				for (i = 0; i < dist; i++)		{		    new_entries1[i] = entries[distribution[i]];		}		for (i = dist; i < n; i++)		{		    new_entries2[i-dist] = entries[distribution[i]];		}				for (i = 0; i < n; i++)		{		    entries[i].son_ptr = NULL;		}		delete [] entries;			        // decides, whether brother has to be a supernode or a regular directory node		size_of_new_node = ((((n-dist)/block_capacity+1) / EXT_SIZE) + 1)*EXT_SIZE;		if ((n-dist) < block_capacity)		{		    size_of_new_node = 1;		}		*sn = new XTDirNode<DATA>(size_of_new_node, my_tree);	    		(*sn)->son_is_data = son_is_data;		(*sn)->level = level;		// neue Datenarrays kopieren		entries = new_entries1;		(*sn)->entries = new_entries2;				// Anzahl der Eintraege berichtigen		num_entries = dist;		(*sn)->num_entries = n - dist;  // muss wegen Rundung so bleiben !!                // Testausgabe                printf("DIRECTORY SPLIT : Balanced overlap free split.\n");		printf("Alter Knoten => Entries : %d, capacity : %d, nodesize : %d\n", num_entries, capacity, nodesize);		printf("Neuer Knoten => Entries : %d, capacity : %d, nodesize : %d\n", (*sn)->num_entries, (*sn)->capacity, (*sn)->nodesize);                 		*dimen = dim;	    }                	}    }    else    {	// Datenarrays freigeben	// da die Nachfolgeknoten aber nicht geloescht werden sollen	// werden vor dem Aufruf von delete noch alle Pointer auf NULL gesetzt	for (i = 0; i < n; i++)	{	    entries[i].son_ptr = NULL;	}	delete [] entries;	// decides, whether brother has to be a supernode or a regular directory node	if ((n-dist) >= block_capacity)	{	    *sn = new XTDirNode<DATA>( (((((n-dist)/block_capacity+1) / EXT_SIZE) + 1)*EXT_SIZE), my_tree);	}	else	{	    *sn = new XTDirNode<DATA>( 1, my_tree);	}   	(*sn)->son_is_data = son_is_data;	(*sn)->level = level;			// neue Datenarrays kopieren	entries = new_entries1;	(*sn)->entries = new_entries2;		// Anzahl der Eintraege berichtigen	num_entries = dist;	(*sn)->num_entries = n - dist;  // muss wegen Rundung so bleiben !!        // Testausgabe	printf("DIRECTORY SPLIT : Topological Split.\n");	printf("Alter Knoten => Entries : %d, capacity : %d, nodesize : %d\n", num_entries, capacity, nodesize);	printf("Neuer Knoten => Entries : %d, capacity : %d, nodesize : %d\n", (*sn)->num_entries, (*sn)->capacity, (*sn)->nodesize);	*dimen = dim;    }    return TRUE;}template <class DATA> int XTDirNode<DATA>::choose_subtree(float *mbr){    int i, j, n, follow, minindex, *inside, inside_count, *over;    float *bmbr, old_o, o, omin, a, amin, f, fmin;    n = get_num();    // faellt d in einen bestehenden Eintrag ?    inside_count = 0;    inside = new int[n];    over = new int[n];    for (i = 0; i < n; i++)    {	switch (entries[i].section(mbr))	{	case INSIDE:	    inside[inside_count++] = i;	    break;	}    }    if (inside_count == 1)    // Fall 1: Rechteck faellt genau in einen Eintrag	follow = inside[0];    else if (inside_count > 1)    // Fall 2: Rechteck faellt in mehrere Eintrag --> nimm den    // mit der geringsten Flaeche (volumen!!!)    {	fmin = MAXFLOAT;	//printf("Punkt in %d von %d MBRs \n",inside_count,n);	for (i = 0; i < inside_count; i++)	{	    f = area(dimension, entries[inside[i]].bounces);	    if (f < fmin)	    {		minindex = i;      		fmin = f;       	    }       	}	follow = inside[minindex];    }    else    // Fall 3: Rechteck faellt in keinen Eintrag -->    // fuer Knoten, die auf interne Knoten zeigen:    // nimm den Eintrag, der am geringsten vergroessert wird;    // bei gleicher Vergroesserung:    // nimm den Eintrag, der die geringste Flaeche hat    //    // fuer Knoten, die auf Datenknoten zeigen:    // nimm den, der die geringste Ueberlappung verursacht    // bei gleicher Ueberlappung:    // nimm den Eintrag, der am geringsten vergroessert wird;    // bei gleicher Vergroesserung:    // nimm den Eintrag, der die geringste Flaeche hat    {       	if (son_is_data)	{            omin = MAXREAL;	    fmin = MAXREAL;	    amin = MAXREAL;	    for (i = 0; i < n; i++)	    {		// berechne die mbr, wenn mbr in entries[i] eingefuegt wird		enlarge(dimension, &bmbr, mbr, entries[i].bounces);		// calculate area and area enlargement		a = area(dimension, entries[i].bounces);		f = area(dimension, bmbr) - a;		// calculate overlap before enlarging entry_i		old_o = o = 0.0;		for (j = 0; j < n; j++)		{		    if (j != i)		    {			old_o += overlap(dimension,					 entries[i].bounces,					 entries[j].bounces);			o += overlap(dimension,				     bmbr,				     entries[j].bounces);		    }	        }	        o -= old_o;	        // is this entry better than the former optimum ?	        if ((o < omin) ||		    (o == omin && f < fmin) ||		    (o == omin && f == fmin && a < amin))	        {	       	    minindex = i;		    omin = o;		    fmin = f;		    amin = a;	        }	        delete [] bmbr;	    }        }        else        {	    fmin = MAXREAL;	    amin = MAXREAL;	    for (i = 0; i < n; i++)	    {	        // berechne die mbr, wenn mbr in entries[i] eingefuegt wird	        enlarge(dimension, &bmbr, mbr, entries[i].bounces);	        // calculate area and area enlargement	        a = area(dimension, entries[i].bounces);	        f = area(dimension, bmbr) - a;	        // is this entry better than the former optimum ?	        if ((f < fmin) ||		    (f == fmin && a < amin))	        {	       	    minindex = i;		    fmin = f;	            amin = a;	        }	        delete [] bmbr;	    }        }	// berechne die neue mbr und schreib sie in den Eintrag	enlarge(dimension, &bmbr, mbr, entries[minindex].bounces);	memcpy(entries[minindex].bounces, bmbr,	       dimension * 2 * sizeof(float));	follow = minindex;	delete [] bmbr;	// leider muss jetzt der Block auch geschrieben werden	dirty = TRUE;    }    delete [] inside;    delete [] over;    return follow;}template <class DATA> R_OVERFLOW XTDirNode<DATA>::insert(DATA *d, XTNode<DATA> **sn, int *dim)// dim references a variable in the father node, so the split history can be updated there{    int follow, dimen;    XTNode<DATA> *succ, *new_succ;    XTDirNode<DATA> *brother;    DirEntry<DATA> *de;    R_OVERFLOW ret;    float *mbr,*nmbr;        dimen = 0;        // Einfuegepfad waehlen    mbr = d->get_mbr();    follow = choose_subtree(mbr);    delete [] mbr;    // Sohn laden    succ = entries[follow].get_son();    // insert d into son    ret = succ->insert(d, &new_succ, &dimen);    *dim = dimen;    if (ret != NONE)    // if anything happend --> update bounces of entry "follow"    {        mbr = succ->get_mbr();        memcpy(entries[follow].bounces, mbr, sizeof(float) * 2*dimension);        delete [] mbr;    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久精品图片| 国产女同互慰高潮91漫画| 精品国产一区a| 中文字幕一区二区视频| 美女视频免费一区| 日本韩国精品一区二区在线观看| 精品国产乱码久久久久久图片 | 91猫先生在线| 亚洲精品在线观| 视频一区中文字幕国产| 91九色02白丝porn| 国产区在线观看成人精品| 日韩成人免费看| 一本色道综合亚洲| 日本一区二区在线不卡| 蜜臀av一区二区三区| 欧美三片在线视频观看| 亚洲欧美在线aaa| 国产激情一区二区三区四区| 欧美成人一区二区三区| 三级欧美在线一区| 欧美日韩免费一区二区三区 | 国产日韩精品一区| 久久精品国内一区二区三区| 精品视频在线视频| 亚洲一区二区三区四区在线观看 | 欧美日韩亚洲另类| 日韩毛片精品高清免费| 国产馆精品极品| 久久久不卡网国产精品二区 | 97精品电影院| 国产精品理论片在线观看| 国产精品一区二区在线观看不卡| 精品欧美一区二区久久| 久久99精品国产麻豆婷婷洗澡| 在线成人午夜影院| 青青青伊人色综合久久| 777久久久精品| 蜜臀久久99精品久久久久宅男| 欧美久久久一区| 日韩黄色在线观看| 欧美成人性福生活免费看| 精品在线一区二区| 国产午夜精品美女毛片视频| 国产a区久久久| 国产精品国产三级国产aⅴ中文 | 色婷婷av一区| 亚洲第一成人在线| 欧美一区二区三区在线观看| 蜜臀av一区二区| 久久精品在线免费观看| 91亚洲精华国产精华精华液| 亚洲va欧美va人人爽| 日韩一级免费观看| 国产乱一区二区| 亚洲丝袜另类动漫二区| 欧美三日本三级三级在线播放| 日本最新不卡在线| 国产欧美日韩中文久久| 色香蕉久久蜜桃| 麻豆精品视频在线观看免费| 国产精品网曝门| 在线免费观看不卡av| 精品一区二区在线播放| 中文字幕日韩精品一区| 欧美人xxxx| 成人午夜av在线| 亚洲午夜私人影院| 国产欧美日韩亚州综合| 欧美三级电影精品| 国产精品一区二区黑丝| 亚洲国产精品久久一线不卡| 久久综合久色欧美综合狠狠| 在线亚洲高清视频| 国产福利不卡视频| 日韩黄色一级片| 亚洲三级在线播放| 久久亚洲综合av| 欧美精品777| 91在线视频在线| 91蝌蚪porny九色| 极品瑜伽女神91| 亚洲国产一区在线观看| 国产人妖乱国产精品人妖| 91精品国产色综合久久不卡电影| av不卡免费电影| 精品一区二区久久| 婷婷成人激情在线网| 亚洲欧美日韩国产综合在线| 精品精品欲导航| 51精品秘密在线观看| 在线看一区二区| 成人18精品视频| 国产精品一区在线观看乱码| 美脚の诱脚舐め脚责91| 亚洲一区二区欧美| 亚洲视频 欧洲视频| 日本一区二区在线不卡| 久久久久9999亚洲精品| 日韩一区二区高清| 91精品国产高清一区二区三区 | 成人免费av资源| 精品夜夜嗨av一区二区三区| 婷婷夜色潮精品综合在线| 亚洲国产日产av| 一区二区在线看| 亚洲免费大片在线观看| 国产精品久久久一本精品| 欧美激情中文不卡| 国产女人18毛片水真多成人如厕| 欧美videos大乳护士334| 日韩一级欧美一级| 精品va天堂亚洲国产| xfplay精品久久| 精品成人一区二区三区四区| 精品国产sm最大网站| 久久综合久久鬼色| 国产视频在线观看一区二区三区| 日韩欧美的一区| 久久综合久色欧美综合狠狠| 久久久久久久久久久久电影 | 久久久五月婷婷| 久久免费国产精品| 国产清纯在线一区二区www| 中文一区在线播放| 亚洲天堂成人网| 亚洲午夜私人影院| 久久国产精品露脸对白| 国产精品一线二线三线精华| 成人精品视频网站| 在线免费观看日本一区| 制服丝袜日韩国产| 久久久久久久一区| 亚洲精品综合在线| 日韩精品三区四区| 激情都市一区二区| www.欧美色图| 欧美日本一区二区在线观看| 欧美大片一区二区三区| 国产精品丝袜在线| 亚洲午夜精品在线| 韩国一区二区视频| 91丨porny丨最新| 在线不卡一区二区| 久久久久久久久久久久久夜| 国产一区二区久久| 99久久99久久久精品齐齐| 欧美日韩亚洲另类| 国产情人综合久久777777| 一区二区三区小说| 激情亚洲综合在线| 91久久一区二区| 精品国产一区a| 亚洲一区二区综合| 国产成人免费在线观看不卡| 在线观看国产日韩| 日本一区二区久久| 日韩精品国产精品| 9久草视频在线视频精品| 欧美一区二区三区色| 亚洲欧美偷拍卡通变态| 久久国产麻豆精品| 欧美性一区二区| 日本一区二区三级电影在线观看| 亚洲1区2区3区4区| 91亚洲国产成人精品一区二三| 日韩精品一区二区三区四区 | 久久电影国产免费久久电影| 岛国精品在线观看| 欧美白人最猛性xxxxx69交| 亚洲美女偷拍久久| 国产一区二区三区黄视频 | 韩日欧美一区二区三区| 欧洲一区二区三区在线| 国产欧美va欧美不卡在线| 免费欧美在线视频| 在线国产亚洲欧美| 日韩理论片网站| 国产69精品久久久久777| 精品理论电影在线| 蜜乳av一区二区三区| 欧美福利电影网| 午夜视频久久久久久| 色一情一乱一乱一91av| 亚洲欧洲日产国码二区| 国产电影精品久久禁18| 精品国产sm最大网站免费看| 免费日本视频一区| 欧美高清激情brazzers| 午夜视黄欧洲亚洲| 欧美丝袜自拍制服另类| 亚洲一级片在线观看| 欧美性大战久久久| 亚洲综合另类小说| 欧美综合亚洲图片综合区| 亚洲男人电影天堂| 精品视频在线看| 亚洲第一会所有码转帖| 欧美精品免费视频| 亚洲国产视频在线|