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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? losertree.h

?? 本程序?qū)崿F(xiàn)了敗者樹等外排序方式
?? H
字號(hào):
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>

#define MAX_BUFFER 512	//buffer最大容量
#define NO_MEANING 99999999	//當(dāng)某順串已經(jīng)全部處理完時(shí),給敗方樹外部節(jié)點(diǎn)填充這個(gè)超大值
#define MAX 10	//最大選手?jǐn)?shù)目


/********************* 緩沖區(qū)類,用環(huán)狀數(shù)組實(shí)現(xiàn)的隊(duì)列來實(shí)現(xiàn)之 ********************/
//設(shè)置頭指針front,尾指針rear
//插入在rear處,刪除在front處
template <class Elem> class Buffer{
	
	private:
		Elem * buf;	//存放元素的數(shù)組
		int front, rear;
		int n; //buffer中當(dāng)前元素的數(shù)目
	
	public:
		
		//constructor
		Buffer(){
			buf = new Elem [MAX_BUFFER];
			front = 0;
			rear = 0;
			n = 0;
			
		}

		//destructor
		~Buffer(){
		delete buf;
		}

		//判斷buffer是否為空
		bool isEmpty(){
			return (n==0);
		}

		//判斷buffer是否滿
		bool isFull(){
			return (n==MAX_BUFFER);
		}
		
		//列出buffer中所有的元素
		//假設(shè)元素類型為內(nèi)建類型
		void list(){
			if (isEmpty()){
				cout<<"no data!"<<endl<<endl;
				return;
			}

			int temp = front;
			for(int i = 0; i < n; i++){
				cout<<buf[temp % MAX_BUFFER]<<"  ";
				temp++;
			}
			cout<<endl<<endl;
		}
		
		//往buffer中插入元素x
		bool insert(Elem x){
			if(isFull()==false){//非滿
			buf[rear] = x;
			rear = (rear+1)%MAX_BUFFER;
			n++;
			return true;
			}
			else{
				cout<<"BUFFER FULL!"<<endl;
				return false;
			}
		}

		//從buffer中讀取元素x,并在buffer中刪除它
		bool read(Elem & x){
			if(isEmpty()==false){//非空
				x = buf[front];
				front = (front+1)%MAX_BUFFER;
				n--;
				return true;
			}
			else{
				cout<<"BUFFER EMPTY!"<<endl;
				return false;
			}
		}

		void flush(FILE  * outputFile){
			
			//寫入輸出文件
			int temp = front;
			for(int i = 0; i < n; i++){
				fprintf(outputFile,"%d ", buf[temp % MAX_BUFFER]);
				//cout<<buf[temp % MAX_BUFFER]<<"  ";
				temp++;
			}

			//清零
			n = 0;
			front = 0;
			rear = 0;
		}

};


/******** 全局Winner函數(shù),確認(rèn)A[b]和A[c]的勝者,返回其下標(biāo),為b和c之一 ********/
//這里取值小的為勝者
template<class T>
int Winner(T A[], int b, int c){
	//注意:這里我假定T是內(nèi)建類型,這樣才能直接比較大小
	if(A[b] < A[c])
		return b;
	else return c;
}


/********* 全局Loser函數(shù),確認(rèn)A[b]和A[c]的敗者,返回其下標(biāo),為b和c之一 **********/
//這里取值大的為敗者
template<class T>
int Loser(T A[], int b, int c){
	//注意:這里我假定T是內(nèi)建類型,這樣才能直接比較大小
	if(A[b] >= A[c])
		return b;
	else return c;
}


/**************** 敗方樹的實(shí)現(xiàn) ***************/
template<class T>
class LoserTree{
	private:
		int MaxSize;	//最大選手?jǐn)?shù)
		int n;	//當(dāng)前選手?jǐn)?shù)
		int LowExt;	//最底層外部節(jié)點(diǎn)數(shù)
		int offset;	//最底層外部節(jié)點(diǎn)之上的節(jié)點(diǎn)總數(shù)
		int * B;	//贏者樹數(shù)組,實(shí)際存放的是下標(biāo)
		T * L;	//元素?cái)?shù)組
		void Play(int p, int lc, int rc, int(* winner)(T A[], int b, int c), int(* loser)(T A[], int b, int c));

	public:
		LoserTree(int Treesize = MAX);
		~LoserTree(){delete [] B;}
		//初始化敗方樹
		void Initialize(T A[], int size,int (*winner)(T A[], int b, int c), int(*loser)(T A[], int b, int c));
		//返回最終勝者索引
		int Winner();
		//位置i的選手改變后重構(gòu)敗方樹
		void RePlay(int i, int(*winner)(T A[], int b, int c), int (*loser)(T A[], int b, int c));
};


template<class T>
LoserTree<T>::LoserTree(int TreeSize){
	MaxSize = TreeSize;
	B = new int[MaxSize];
	n = 0;
}


//成員函數(shù)Winner,返回最終勝者的索引
template<class T>
int LoserTree<T>::Winner(){
	return (n)?B[0]:0;
}


//成員函數(shù)Initilalize負(fù)責(zé)初始化敗者樹
template<class T>
void LoserTree<T>::Initialize(T A[], int size, int(*winner)(T A[], int b, int c), int(*loser)(T A[], int b, int c)) {

	//能否處理size個(gè)選手的數(shù)組a[]
	if(size > MaxSize || size < 2){
		cout<<"Bad Input!"<<endl<<endl;
		return;
	}

	//初始化成員變量
	n = size;
	L = A;

	//計(jì)算s=2^log(n-1)
	int i,s;
	for(s = 1; 2*s <= n-1; s+=s);

	LowExt = 2*(n-s);
	offset = 2*s-1;

	//最底層外部節(jié)點(diǎn)的比賽
	for(i = 2; i <= LowExt; i+=2)
		Play((offset+i)/2, i-1, i, winner, loser);
	//處理其余外部節(jié)點(diǎn)
	if(n%2){//n為奇數(shù),內(nèi)部節(jié)點(diǎn)和外部節(jié)點(diǎn)比賽
		//這里用L[LowExt+1]和它的父節(jié)點(diǎn)比賽
		//因?yàn)榇藭r(shí)它的父節(jié)點(diǎn)中存放的是其兄弟節(jié)點(diǎn)處的比賽勝者索引
		Play(n/2, B[(n-1)/2], LowExt+1, winner, loser);
		i = LowExt+3;
	}
	else i = LowExt+2;

	//剩余外部節(jié)點(diǎn)的比賽
	for(; i<=n; i+=2)
		Play((i-LowExt+n-1)/2, i-1, i, winner, loser);

	/*
	///////////////映射成敗者樹/////////////////
	//如果采用贏者樹的Play成員函數(shù),則初始化敗方樹時(shí)需要以下的部分
	  
	int * temp;
	temp = new int [MaxSize];

	temp[0] = B[1];  //全局勝者
	
	int j;
	//和最底層外部節(jié)點(diǎn)相關(guān)的內(nèi)部節(jié)點(diǎn)
	for(j = 2; j <= LowExt; j+=2)
		temp[(offset+j)/2] = loser(L, j-1, j);
	//其余的第一個(gè)外部節(jié)點(diǎn)
	if(n%2){
		temp[n/2] = loser(L, B[n-1], LowExt+1);
		j = LowExt+3;
	}
	else j = LowExt+2;
	//剩余外部節(jié)點(diǎn)
	for(; j<=n; j+=2)
		temp[(j-LowExt+n-1)/2] = loser(L, j-1, j);

	//孩子都是內(nèi)部節(jié)點(diǎn)的內(nèi)部節(jié)點(diǎn)
	if(n%2){
		for(int k=n-1-(n+1)/2; k >= 1; k--)
			temp[k] = loser(L, B[2*k], B[2*k+1]);
	}
	else{
		for(int kk = n-1-n/2; kk >= 1; kk--)
			temp[kk] = loser(L, B[2*kk], B[2*kk+1]);
	}

	//把temp賦值給B
	delete [] B;
	B = temp;
	*/
}



//成員函數(shù)Play負(fù)責(zé)在內(nèi)部節(jié)點(diǎn)B[p]處開始比賽
template<class T>
void LoserTree<T>::Play(int p, int lc, int rc, int(* winner)(T A[], int b, int c), int(* loser)(T A[], int b, int c)){
	
		B[p] = loser(L, lc, rc);//敗者索引放在B[p]中
			
		int temp1, temp2;
		temp1 = winner(L, lc, rc);//p處的勝者索引

		while(p>1 && p%2){//右孩子,需要沿路徑繼續(xù)向上比賽
							  //和B[p]的父結(jié)點(diǎn)所標(biāo)識(shí)的外部結(jié)點(diǎn)相比較
			temp2 = winner(L, temp1, B[p/2]);//p的勝者和p的父結(jié)點(diǎn)比較,贏者暫存在temp2中
			B[p/2] = loser(L, temp1, B[p/2]);//敗者索引放入B[p/2]
			temp1 = temp2;
			p/=2;
		}//while

		//結(jié)束循環(huán)(B[p]是左孩子,或者B[1])之后,在B[p]的父結(jié)點(diǎn)寫入勝者索引
		B[p/2] = temp1; 


	/*
	//如果用贏者樹映射成敗方樹的方法,這段和贏者樹完全一樣
	//這部分和贏者樹的Play成員函數(shù)完全一樣
	//在B[p]處開始比賽
	//lc和rc分別是B[p]的左右孩子
	B[p] = winner(L, lc, rc);

	//如果B[p]位于右孩子處且沒有到樹根,則需要繼續(xù)向上比賽
	while(p > 1 && p % 2){//右孩子
		B[p/2] = winner(L, B[p-1], B[p]);
		p/=2;
	}
	*/
}



//成員函數(shù)RePlay負(fù)責(zé)選手i的值改變后重新開始比賽
template<class T>
void LoserTree<T>::RePlay(int i, int (*winner)(T A[], int b, int c), int (*loser)(T A[], int b, int c)){
	if(i <= 0 || i > n){
		cout<<"Out of Bounds!"<<endl<<endl;
		return;
	}

	int p;
	//確定父節(jié)點(diǎn)的位置
	if(i <= LowExt)
		p = (i+offset)/2;
	else
		p = (i-LowExt+n-1)/2;

	//這里有修改
	//B[0]中始終保存勝者的索引
	B[0] = winner(L, i, B[p]);
	//B[p]中保存敗者的索引
	B[p] = loser(L, i, B[p]);

	//這里有修改
	//沿路徑向上比賽
	for(; (p/2)>=1; p/=2){
		int temp;//臨時(shí)存放贏者的索引
		temp = winner(L,B[p/2], B[0]);
		B[p/2] = loser(L,B[p/2], B[0]);	
		B[0] = temp;
	}
}


/*************** 從文件讀入一批數(shù)據(jù)進(jìn)入緩沖區(qū) *****************/
//輸入?yún)?shù)分別是:
//f - 輸入文件句柄, b - 輸入緩沖區(qū)

template <class T>
void fillBuffer(FILE * f, Buffer<T> & b){
	int m = 0;
	T read;  //讀出的數(shù)據(jù)置放在里面
	while((!feof(f))&&(m < MAX_BUFFER)){
		fscanf(f, "%d ", &read);
		b.insert(read);
		m++;
	}//while
}


/******************** 多路歸并算法 ********************/
//輸入?yún)?shù)分別是:
//lt-敗方樹,racer-最初的競(jìng)賽者,bufferPool-緩沖池,f-輸入/輸出文件句柄數(shù)組
//這里輸出文件句柄是f[0],輸入文件句柄是f[1]到f[MAX],MAX為輸入文件的數(shù)目
//NO_MEANING宏代表一個(gè)極大值

template <class T>
void multiMerge(LoserTree<T> & lt, T * racer, Buffer<T> * bufferPool, FILE * * f){
	
	int winner;	//最終勝者索引

	//初始化敗方樹
	lt.Initialize(racer, MAX, Winner, Loser);

	////以下處理f[1]到f[MAX]所代表的MAX個(gè)輸入順串,并把結(jié)果輸出到f[0]所代表的輸出順串中
	
	//取得最終勝者索引
	winner = lt.Winner();
	
	while(racer[winner] != NO_MEANING){//循環(huán)退出時(shí)勝者為NO_MEANING,所有的輸入順串都已經(jīng)處理完畢
		

		//把勝者插入到輸出緩沖區(qū)中
		if(bufferPool[0].isFull())//輸出緩沖區(qū)滿,flush到磁盤文件去
			bufferPool[0].flush(f[0]);
		bufferPool[0].insert(racer[winner]);
	
		//從輸入緩沖區(qū)讀入一個(gè)新的競(jìng)賽者
		if(bufferPool[winner].isEmpty()==false)//輸入緩沖區(qū)不為空
			bufferPool[winner].read(racer[winner]);//從緩沖區(qū)讀入值放進(jìn)racer[winner]
		else{//輸入緩沖區(qū)為空
				
				if(!feof(f[winner])){//如果對(duì)應(yīng)的輸入文件還有數(shù)據(jù)
					
					//從輸入文件讀入一批數(shù)據(jù)到輸入緩沖區(qū)
					fillBuffer(f[winner], bufferPool[winner]);

					//從緩沖區(qū)讀數(shù)據(jù)放進(jìn)racer[winner]
					bufferPool[winner].read(racer[winner]);
				}
				else{//對(duì)應(yīng)的輸入文件沒有數(shù)據(jù)
					//在racer[winner]位置放NO_MEANING
					racer[winner] = NO_MEANING;
				}//else		
		}//else

		//重新進(jìn)行比賽,取得勝者索引
		lt.RePlay(winner, Winner<int>, Loser<int>);
		winner = lt.Winner();

	}//while
	 
	//把輸出緩沖區(qū)中剩余的數(shù)據(jù)寫進(jìn)磁盤文件
	bufferPool[0].flush(f[0]);

}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品热久久久久夜色精品三区 | 国产成人精品午夜视频免费| 日韩你懂的在线播放| 青青草原综合久久大伊人精品优势| 欧美日韩一区三区四区| 五月激情丁香一区二区三区| 欧美精品在线观看一区二区| 男人操女人的视频在线观看欧美| 日韩情涩欧美日韩视频| 国产成人精品亚洲777人妖| 国产女人18毛片水真多成人如厕| 成人激情图片网| 一区2区3区在线看| 这里是久久伊人| 久久99精品国产.久久久久久| 久久久久久久久久久久电影 | 欧美激情一区二区三区四区| 看电视剧不卡顿的网站| 91在线视频官网| 精品欧美久久久| 日韩午夜中文字幕| 国产一区二区三区在线观看免费视频 | 日韩va欧美va亚洲va久久| 制服丝袜国产精品| 日本欧美一区二区三区| 亚洲精品一区在线观看| 成人激情免费视频| 亚洲二区在线观看| 精品国内二区三区| 在线观看区一区二| 国产美女av一区二区三区| 亚洲日本在线天堂| 欧美成人性战久久| 色婷婷综合久久久久中文一区二区| 日韩中文字幕av电影| 中文字幕乱码久久午夜不卡| 欧美精品久久久久久久久老牛影院| 国产精品一区二区三区四区| 亚洲一级二级在线| 久久精品欧美日韩| 欧美日韩1234| 北条麻妃国产九九精品视频| 久久精品国产秦先生| 亚洲精品伦理在线| 精品99999| 欧美日韩一区二区三区免费看| 国产成人自拍高清视频在线免费播放| 亚洲综合视频在线观看| 精品国产乱码久久久久久免费 | 亚洲综合色在线| 中文字幕高清一区| 欧美精品一区二区三区一线天视频| 91电影在线观看| 成人一区二区三区视频在线观看| 免费成人在线播放| 一级特黄大欧美久久久| 国产精品乱人伦中文| 久久久亚洲精品一区二区三区| 91精品国产品国语在线不卡| 色狠狠一区二区三区香蕉| 国产成人精品三级| 国产一区二区毛片| 久久99精品一区二区三区| 手机精品视频在线观看| 一个色在线综合| 亚洲精品视频在线看| 国产精品女主播av| 国产欧美日韩综合| 久久久精品国产免费观看同学| 日韩精品一区二区三区swag| 欧美一区二区三区日韩视频| 欧美色成人综合| 欧美日韩中文另类| 欧美性xxxxx极品少妇| 91色视频在线| 99久久精品99国产精品| 成人性生交大片| 国产乱理伦片在线观看夜一区| 久久成人精品无人区| 美国av一区二区| 久久99热这里只有精品| 精品一区二区三区在线观看国产 | 精品国产一区二区亚洲人成毛片| 欧美精品日韩综合在线| 欧美日韩精品欧美日韩精品| 欧美日韩亚洲另类| 欧美午夜片在线观看| 欧美系列亚洲系列| 欧美久久久影院| 日韩一区二区免费高清| 亚洲精品一区二区三区四区高清| 精品久久久久久久人人人人传媒| 欧美精品一区二区三区在线播放| 国产日韩欧美综合在线| 综合精品久久久| 亚洲国产精品欧美一二99| 蜜臀久久99精品久久久久久9| 久久av老司机精品网站导航| 国产成人综合在线观看| 色综合久久88色综合天天免费| 色999日韩国产欧美一区二区| 欧美日韩亚洲综合一区二区三区| 日韩一二三四区| 国产精品久久久久久久蜜臀 | 亚洲高清免费视频| 麻豆视频一区二区| 成人免费高清在线观看| 欧美性猛交一区二区三区精品| 欧美一区二区三区在| 国产视频亚洲色图| 亚洲国产裸拍裸体视频在线观看乱了 | 久久久久九九视频| 亚洲欧美一区二区三区国产精品 | 亚洲国产日韩在线一区模特| 麻豆国产精品一区二区三区| 成人黄色电影在线| 欧美色国产精品| 欧美激情一区二区三区全黄 | 另类成人小视频在线| 丁香六月综合激情| 欧美男人的天堂一二区| 久久久久综合网| 亚洲国产欧美一区二区三区丁香婷| 九九九久久久精品| 91毛片在线观看| 精品少妇一区二区三区日产乱码| 亚洲视频在线一区| 九色综合国产一区二区三区| 91免费在线视频观看| 欧美mv和日韩mv国产网站| 一区二区三区美女| 国产在线播放一区三区四| 欧美午夜在线观看| 国产精品国产三级国产aⅴ无密码| 偷拍亚洲欧洲综合| 在线欧美一区二区| 亚洲一线二线三线久久久| 韩日欧美一区二区三区| 欧美三级电影一区| 亚洲视频一区二区免费在线观看| 麻豆精品一区二区三区| 日本高清不卡视频| 中文字幕精品综合| 久久www免费人成看片高清| 欧美性感一类影片在线播放| 国产精品久久久久久久久动漫 | 欧美影片第一页| 欧美国产成人在线| 国产一区二区三区蝌蚪| 91麻豆精品国产91久久久使用方法| 亚洲欧美另类久久久精品2019| 国产酒店精品激情| 亚洲精品一区二区三区福利| 日本亚洲免费观看| 在线观看亚洲a| 亚洲色图制服诱惑| 成人av网在线| 日本一区二区视频在线| 国产精品99久久不卡二区| 欧美一区二区人人喊爽| 亚洲不卡在线观看| 色婷婷综合在线| 亚洲视频每日更新| 成人av免费在线| 国产午夜一区二区三区| 精品伊人久久久久7777人| 91精品国产91久久久久久一区二区 | 9l国产精品久久久久麻豆| 国产午夜一区二区三区| 国产xxx精品视频大全| 国产欧美日韩视频在线观看| 国产激情一区二区三区桃花岛亚洲| 久久精品亚洲精品国产欧美| 国产成人综合网| 一区在线播放视频| 99精品偷自拍| 一区二区三区四区在线免费观看 | 一区二区三区在线观看国产| 色悠悠亚洲一区二区| 亚洲小少妇裸体bbw| 777欧美精品| 国产专区综合网| 国产人成一区二区三区影院| 成人午夜电影久久影院| 国产精品日韩成人| 日本高清不卡aⅴ免费网站| 亚洲电影第三页| 日韩免费电影一区| 国产精品影视网| 亚洲日本va午夜在线影院| 欧美男人的天堂一二区| 麻豆国产精品777777在线| 久久亚洲一级片| 99re热这里只有精品视频| 亚洲最新视频在线播放| 91精品国产欧美一区二区18| 精品一区二区三区影院在线午夜 | 一区二区三区成人| 91精品婷婷国产综合久久竹菊| 精彩视频一区二区|