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技巧保证树的平衡程度。
于是只要在数组中存放集合树的高度的相反数。