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技巧保证树的平衡程度。

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

 

 

大家好!现在我们将要开始一个穿越“数据结构算法和程序”这个抽象世界的特殊旅程, 以解决现实生活中的许多难题。在程序开发过程中通常需要做到如下两点:一是高效地描述数 据;二是设计一个好的算法,该算法最终可用程序来实现。要想高效地描述数据,必须具备数 据结构领域的专门知识;而要想设计一个好的算法,则需要算法设计领域的专门知识。 在着手研究数据结构算法设计方法之前,需要你能够熟练地运用C + +编程并分析程序, 这些基本的技能通常是从C + +课程以及其他分散的课程中学到的。本书的前两章旨在帮助你回 顾一下这些技能,其中的许多内容你可能已经很熟悉了。 本章我们将回顾C++ 的一些特性。因为不是针对C++ 新手,因此没有介绍诸如赋值语句、 if 语句和循环语句(如for 和w h i l e)等基本结构,而是主要介绍一些可能已经被你忽略的C + + 特性: • 参数传递方式(如传值、引用和常量引用)。 • 函数返回方式(如返值、引用和常量引用)。 • 模板函数。 • 递归函数。 • 常量函数。 • 内存分配和释放函数:n e w与d e l e t e。 • 异常处理结构:t r y, c a t c h和t h r o w。 • 类与模板类。 • 类的共享成员、保护成员和私有成员。 • 友元。 • 操作符重载。 本章中没有涉及的其他C + +特性将在后续章节中在需要的时候加以介绍。本章还给出了如 下应用程序的代码: • 一维和二维数组的动态分配与释放。 • 求解二次方程。 • 生成n 个元素的所有排列方式。 • 寻找n个元素中的最大值。 此外,本章还给出了如何测试和调试程序的一些技巧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值