- 主题:请教一个算法。
放在二叉树里,或者map里。
不行的话,用map建索引。
【 在 speedboy2998 的大作中提到: 】
: struct Range
: {
: int32_t lower_bound;
: ...................
--
FROM 221.221.53.*
可以。
按照一个边界做索引,map是可以使用不等式比较的。
【 在 tortelee 的大作中提到: 】
: 目标值在某个range中间,能查到?
: 有点没看懂
--
FROM 221.221.53.*
【 在 tortelee 的大作中提到: 】
: 目标值在某个range中间,能查到?
: 有点没看懂
显摆一下13年前的程序。
在平衡二叉树里寻找>=KEY的节点。可以是楼主的节点,把low_bound作为KEY即可。
sp:树根。每个节点含有用户数据结构。
content_key,节点,内有KEY值。
len,数据结构的size。
Cmp_rec,比较函数。
节点和比较函数都由使用者自己提供。
T_Tree * BB_Tree_GTEQ(T_Tree *sp,void *content_key,int len,
int (*Cmp_rec)(void *s1,void *s2,int len))
{
T_Tree *t=NULL;
while(sp) {
int rc=Tree_Cmp(sp->Content,content_key,len,Cmp_rec);
if(!rc) return sp;
if(rc<0) sp=sp->Right;
else {
t=sp;
sp=sp->Left;
}
}
return t;
}
--
修改:ylh0315 FROM 221.221.53.*
FROM 221.221.53.*
【 在 ylh0315 的大作中提到: 】
: 可以。
: 按照一个边界做索引,map是可以使用不等式比较的。
一个具体用法,怎么比较都可以。log(N)的复杂度。
int DiagTrip::getTrip(stations_stu *key,int flag)
{
T_Tree *temp;
stations_stu *result;
int sch_date;
if(!key||!sta_tree) return -1;
key->diagram=NULL;
sch_date=SCH_DATE(key->arr_time);
switch(flag) {
case EQUAL:
temp=BB_Tree_Find(sta_tree,&key,sizeof(key),diag_comp);
break;
case GT:
temp=BB_Tree_GT(sta_tree,&key,sizeof(key),diag_comp);
break;
case GTEQ:
temp=BB_Tree_GTEQ(sta_tree,&key,sizeof(key),diag_comp);
break;
case LT:
temp=BB_Tree_LT(sta_tree,&key,sizeof(key),diag_comp);
break;
case LTEQ:
temp=BB_Tree_LTEQ(sta_tree,&key,sizeof(key),diag_comp);
break;
default:temp=NULL;
}
--
修改:ylh0315 FROM 221.221.53.*
FROM 221.221.53.*
用不等式。
【 在 stub 的大作中提到: 】
: 很简单的二分查找
--
FROM 221.221.53.*
对于静态数组,可以,没问题。
动态的,随时增减的,就得用map。(红黑二叉树)
【 在 e729 的大作中提到: 】
: 排序后二分法查找,一劳永逸,不占用额外空间
:
--
FROM 221.221.53.*