C++算法设计技巧

本文探讨了C++中如何利用二元比较函数解决优先级排序问题,例如在绅士排名问题中,通过定义struct结构体并设计比较函数进行排序。同时,文章也分享了并查集数据结构设计的三个技巧,包括使用数字代替元素特征、使用数组存储父节点和通过路径压缩与union by height优化查找和合并操作。

1、当问题涉及存在优先级关系的多重比较时,可以设计一个二元的比较函数,进而利用STL库中的一些排序函数进行排序。

如:在“绅士排名”问题中设计的二元比较函数如下:

 

定义struct结构体,记录比较对象的信息:

 

typedef struct{      //绅士的信息

 string last;
 string first;
 int height;
 int weight;
 
}Suitor;

 

 

 

bool compare(Suitor a,Suitor b){    //binary predicate,注意比较函数中的参数一定要是Suitor类型的,不能是Suitor*类型


 if( a.height < b.height ) return true;
 if( a.height > b.height ) return false;

 if( a.weight < b.weight ) return true;
 if( a.weight > b.weight ) return false;

 if( a.last!= b.last )
  return (a.last < b.last)? true: false;
 if( a.first!=b.first)
  return (a.first < b.first)? true: false;
}

 

这里使用的参数类型为复杂对象Suitor,因为排序的数组元素类型也是Suitor的。

 

2、并查集数据结构中设计技巧

 

(1)并查集数据结构的目的在于判断两种元素是否存在等价的关系,以及对具有等价关系的元素进行合并操作。

而在数据结构的设计过程中:

技巧1: 忽略实际的元素特征的描述,直接用0~N-1的数字来表示N个元素。

技巧2:底层实现的数据结构直接使用普通数组,而不是使用树结构,这样就简化了实现。而且数组中直接存放元素的父节点信息,因为只关心当前节点的父节点是谁,而且合并后只要更改父节点就可以实现合并功能了。

技巧3: 在find操作中使用路径压缩技巧来提高后继对相同节点的访问速度。在union操作中使用union by height技巧保证树的平衡程度。

             于是只要在数组中存放集合树的高度的相反数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值