user-0 提问: 黑箱子，穿越千年的超时

回复:
user: user-1
content: 由题意可知, 需要用一种有序的数据结构对所有的数进行存储. 那么, Add 操作是一个向有序表插入的操作, 而Get操作则是一个有序表的查询操作. 要想在两种操作之间取得平衡的时间复杂度, 那么可以选择采用平衡二叉树作为存储结构, 推荐使用红黑树, 这样的话, Add操作能在O(logN)内完成, 如果为树中的每个结点维护一个表示"子结点总数"的数据成员, 那么Get操作也能在O(logN)内完成. 综上所述, 对于输入数据中的N组操作, 总复杂度为O( N*logN ), 对于10^5的数据规模, 能在1秒内出结果. 欢迎吐槽.

user: user-1
content: 由题意可知, 需要用一种有序的数据结构对所有的数进行存储. 那么, Add 操作是一个向有序表插入的操作, 而Get操作则是一个有序表的查询操作. 要想在两种操作之间取得平衡的时间复杂度, 那么可以选择采用平衡二叉树作为存储结构, 推荐使用红黑树, 这样的话, Add操作能在O(logN)内完成, 如果为

user: user-0
content: [quote=引用 7 楼 xuzhouweihao 的回复:] B树可以吗？你可以试试吧，下面的代码可以参考下。  [code=c]#include <stdio.h> #include <stdlib.h> #include <unistd.h>  /* Balance flag */ #define RH 1 #define LH -1 #define BH 0 有建设性意见

user: user-0
content: 我的树啊！

user: user-2
content: B树可以吗？你可以试试吧，下面的代码可以参考下。  #include <stdio.h> #include <stdlib.h> #include <unistd.h>  /* Balance flag */ #define RH 1 #define LH -1 #define BH 0  static int lev_m=0;  typedef struct avlNode{ 	int data; 	int balance; 	int level; 	struct avlNode *right; 	struct avlNode *left; }*PavlNode;  void lltree(PavlNode *node) { 	PavlNode lnode;  	lnode = (*node)->left; 	(*node)->left = lnode->right; 	lnode->right = *node; 	*node=lnode; }  void lrtree(PavlNode *node) { 	PavlNode rnode,lnode;  	lnode = (*node)->left; 	rnode = lnode->right;	 	(*node)->left = rnode; 	lnode->right =  rnode->left; 	rnode -> left = lnode;  	lltree(node); }  void left_balance_tree(PavlNode *node) { 	PavlNode rnode,lnode; 	lnode = (*node)->left;  	switch(lnode->balance){ 		case LH: 			(*node)->balance = lnode->balance = BH; 			lltree(node); 			break; 		case RH: 			rnode = lnode->right; 			switch(rnode->balance){ 				case BH: 					(*node)->balance = BH; 					lnode->balance = BH; 					break; 				case LH: 					(*node)->balance = RH; 					lnode->balance = BH; 					break; 				case RH: 					(*node)->balance = BH; 					lnode->balance = LH; 					break; 			} 			rnode->balance = BH; 			lrtree(node); 			break; 		defult: 			// do nothing 			break; 	} }  void rrtree(PavlNode *node) { 	PavlNode rnode;  	rnode = (*node)->right; 	(*node)->right = rnode->left; 	rnode->left = *node; 	*node=rnode; }  void rltree(PavlNode *node) { 	PavlNode rnode,lnode;  	rnode = (*node)->right; 	lnode = rnode->left;	 	(*node)->right = rnode->left; 	rnode->left = lnode->right; 	lnode -> right = rnode;  	rrtree(node); }  void right_balance_tree(PavlNode *node) { 	PavlNode rnode,lnode; 	rnode = (*node)->right;  	switch(rnode->balance){ 		case LH: 			lnode = rnode->left; 			switch(lnode->balance){ 				case BH: 					(*node)->balance = BH; 					rnode->balance = BH; 					break; 				case LH: 					(*node)->balance = LH; 					rnode->balance = BH; 					break; 				case RH: 					(*node)->balance = BH; 					rnode->balance = RH; 					break; 				defult: 					break; 			} 			lnode->balance = BH; 			rltree(node); 			break; 		case RH: 			(*node)->balance = rnode->balance = BH; 			rrtree(node); 			break; 		default: 			break; 	} }  int create_tree(PavlNode *node, int data,  int* taller){  	if((*node) == NULL){ 		(*node) = malloc(sizeof(struct avlNode)); 		(*node)->data = data; 		(*node)->balance = BH; 		(*node)->level = 0; 		(*node)->right = NULL; 		(*node)->left = NULL; 		return 1; 	}   	if( data <= (*node)->data ){ 		if(!create_tree(&((*node)->left),data,taller)){ 			return 0; 		} 		if(*taller){ 			switch((*node)->balance){ 				case BH: 					(*node)->balance = LH; 					*taller = 1; 					break; 				case LH: 					left_balance_tree(node); 					*taller = 0; 					break; 				case RH: 					(*node)->balance = BH; 					 *taller = 0; 					break; 				default: 					// do nothing 					break; 			} 		} 	}else{ 		if(!create_tree(&((*node)->right),data,taller)){ 			return 0; 		} 		if(*taller){ 			switch((*node)->balance){ 				case BH: 					(*node)->balance = RH; 					*taller = 1; 					break; 				case LH: 					(*node)->balance = BH; 					*taller = 0; 					break; 				case RH: 					right_balance_tree(node); 					*taller = 0; 					break; 				default: 					// do nothing 					break; 			} 		} 	}  	return 1; } void delete_tree(PavlNode* node){ 	if((*node) == NULL){ 		return; 	}  	if((*node)->right != NULL ){ 		delete_tree(&((*node)->right)); 	}  	if((*node)->left !=NULL ){ 		delete_tree(&((*node)->left)); 	}  	if(((*node)->right == NULL) && ((*node)->right == NULL)){ 		free((*node)); 		(*node) == NULL; 	}  	return; }  int main(void) { 	int tmp; 	int i,j; 	int taller; 	int lev_tmp=0;  	PavlNode root=NULL;  	srand((unsigned)time(NULL));  	for(i=0; i<50; i++){ 		taller=1; 		tmp = rand()%100; 		create_tree(&root,tmp,&taller); 	}  	delete_tree(&root); 	return 0; }

user: user-3
content: 不知道B树，行不？

user: user-4
content: 那就试试Splay Tree

user: user-0
content: 引用 2 楼 u012061345 的回复:试试SBT。 难道就没有其它更简单的算法了。

user: user-4
content: 试试SBT。

user: user-0
content: 大师兄们指点下，谢谢