百度的一个笔试题目:
百度全体员工玩分组游戏,前面五分钟大家分头找队友,并将每个人找到的队友信息汇报给主持人,如果A和B是队友,B和C是队友,那么A和C也是队友;接着主持人不断地随机抽取两个人,希望判断二者是否为队友。请设计一个计算机程序辅助主持人判断两个人是否为队友,说明程序的关键算法,不需要代码实现。
例如:
<小明,小王>,<小军,小王>,<小丽,小李>是队友,那么小军和小明是队友,小军和小丽不是队友。
这道题目可以用图的连通性来解决,但是稍微复杂了些哈,下面提供划分等价类的方法,
划分等价类的过程,确定等价类的算法如下:
1 令S中每个元素各自形成一个只含有单个成员的子集,记作S1、S2.。。。
2 重复读入m个偶对,对每个偶对(x,y),判断x和y所属的子集,如果属于同一子集,则不做任何操作,否则,将两个子集合并。
我们可以用树形结构来表示集合,每个节点含有指向双亲的指针,并约定根结点的成员兼做子集的名称,则实现并操作时,只需要将一颗子集树指向另一棵子集树的根即可;同时,完成某个元素所在集合的查找,只要从该成员节点出发,顺链向上直至找到树的根结点为止。
以下例子使用整型数组表示集合,数组中的值表示结点的父节点或者表示该集合中的元素数目的相反数(当该节点为根结点时)。
public class UnionSearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int numberset[] =new int[10];
for(int i=0;i<numberset.length;i++){//初始时所有值均为1,表示每个元素为一个集合
numberset[i]=-1;
}
merge_set(numberset,1,2);
merge_set(numberset,3,4);
merge_set(numberset,6,5);
merge_set(numberset,7,8);
merge_set(numberset,1,3);
merge_set(numberset,5,7);
//mergeunion(union,1,5);
for(int i=1;i<9;i++){
for(int j=i+1;j<9;j++){
System.out.println(i+" 和"+j+"在一个集合吗?"+isInOneGroup(numberset,i,j));
}
}
}
/*
* 将i与j合并,如果i与j分别属于不同的集合中,则将两个集合合并,
* 合并的过程是,将i所属集合的父节点指向j所属集合的父节点的序号,
* 或者j所属集合的父节点执行i所属结合的父节点的序号
* 每个集合的父节点存储的值为该集合中所含元素的个数的相反数,其余节点存储的值为父节点
*/
public static void merge_set(int []union,int i,int j ){
if(i<1||i>union.length||j<1||j>union.length){
System.out.println("i or j 's scole is error");
return;
}
int ip=getparent(union,i);
int jp=getparent(union,j);
if(ip!=jp && ip!=0 && jp!=0){
if(ip>jp){
union[ip]+=union[jp];
union[jp]=ip;
}else{
union[jp]+=union[ip];
union[ip]=jp;
}
}
}
/*
* 查找第i个元素所属的集合,返回该集合的父节点序号
*/
public static int getparent(int []union,int i){
int j=0;
for(j=i;union[j]>0;j=union[j]);
return j;
}
/*
* 判断i和j是在同一个集合吗
*
*/
public static boolean isInOneGroup(int union[],int i,int j){
if(getparent(union,i)==getparent(union,j)){
return true;
}
return false;
}
}
将题目中的名字使用序号来表示就可以了,当然这个过程也可以再优化。
分享到:
相关推荐
在编程实现过程中,注意C++的面向对象特性,如封装、继承和多态,可以帮助我们更好地设计和组织代码。通过封装,我们可以隐藏内部实现细节;通过继承,我们可以扩展已有类的功能,以适应不同类型的等价类;多态则...
在软件测试过程中,等价类划分是一种常用且有效的测试用例设计方法,它能够帮助测试工程师以较小的成本实现较为全面的测试覆盖。 **1.1 有效等价类** 有效等价类指的是符合程序规格说明中定义的功能和性能要求的...
首先,等价类划分法是根据输入条件将所有可能的输入数据划分为若干个等价类,每个等价类内的数据对于测试目的来说是等效的。这种方法旨在最小化测试用例的数量,同时确保覆盖到所有可能的情况。例如,假设一个系统...
这种方法的核心思想是将输入域分成若干个等价类,每个等价类中的数据在测试过程中具有等效性,即测试其中一个代表值就相当于测试了该类中的所有其他值。 1. **等价类划分法的概念**: - 等价类是指一组具有相同...
等价类划分法是软件测试中的一个重要概念,它是一种有效地减少测试用例数量的方法,旨在通过将所有可能的输入数据划分成若干个等价类别,然后仅选择每个类别中的一个代表性的数据作为测试用例,以确保软件功能的全面...
在等价关系下,集合中的元素被划分为若干个互不相交的子集,这些子集称为等价类。每个等价类内的元素都满足等价关系,而不同等价类之间的元素则不满足。等价类的概念在很多领域都有应用,如在编程语言中,可以用于...
本项目着重于粗糙集中的核心概念——决策表的处理,包括等价类计算、核属性计算以及属性约简算法的实现。 首先,我们要理解决策表在粗糙集中的角色。决策表是粗糙集模型的基础,它是一种结构化的数据表示方式,用于...
### 划分等价类的标准 为了确保等价类划分的有效性和实用性,遵循以下标准至关重要: 1. **完备测试、避免冗余**:确保每个输入域都得到了充分的覆盖,同时避免重复测试同一类别的数据。 2. **集合的划分**:等价...
这种方法的重点在于验证软件的外部行为,而非内部实现。 接下来是白盒测试,又称结构测试或代码覆盖率测试。与黑盒测试相反,白盒测试关注的是软件的内部逻辑和结构。测试人员会根据源代码的路径、分支和数据流来...
以保险费率计算为例,我们可以根据年龄、性别、婚姻状况和扶养人数等输入条件划分等价类,如20-39岁、40-59岁和60岁以上分别对应不同的点数,性别、婚姻状态和扶养人数也会影响费率。通过等价类划分,我们可以设计出...
有效等价类是指符合程序规格说明的合理、有意义的输入数据集合,它们用于验证程序是否正确实现了预期功能。无效等价类则是不符合规格说明或无意义的输入数据集合,它们用于检测程序在处理异常或边界条件时的行为。 ...
2. **划分等价类的方法**: - 当输入条件有取值范围或数量限制时,通常可以确定一个有效等价类和两个无效等价类。 - 如果输入条件是固定的集合或有特定要求,可以确定一个有效等价类和一个无效等价类。 - 对于...
3. **划分等价类的标准** - 完备性:确保所有的输入数据都被考虑到了。 - 无冗余性:确保不会出现重复的测试用例。 - 子集互斥:不同等价类之间没有重叠的数据。 **划分等价类的方法** 1. **基于范围的划分**:...
#### 六、划分等价类的标准 1. **完备性**:确保测试覆盖所有可能的输入情况。 2. **非重叠性**:每个等价类之间不能有交叉或重叠。 3. **代表性**:从每个等价类中选取具有代表性的测试数据。 4. **有效性**:确保...
2. **划分等价类的方法** - 依据输入条件的范围、集合、布尔值、特定数值等,可以确定有效的和无效的等价类。 - 当知道等价类内部的数据处理方式不同时,还需要进一步细化等价类。 3. **设计测试用例的原则** - ...
划分过程中,需要选择每个等价类的一个代表值作为测试用例,以覆盖相应的执行路径。 实施等价类划分的方法有多种情况,例如: 1. 当输入值有明确范围时,可以划分有效等价类(范围内)和两个无效等价类(范围外)。...
3. **划分等价类的标准**: - 完备测试:确保覆盖所有可能的情况,避免遗漏。 - 避免冗余:确保每个测试用例都能独立地测试一个特定的等价类,减少重复测试。 - 划分的子集互不相交,且并集等于整个输入域,保证...
例如,如果数据集包含个人的年龄、性别和收入,那么可以依据年龄划分等价类。 3. **边界和决策属性计算**:接着,我们计算每个属性的边界值,这是区分不同等价类的关键。同时,确定哪些属性对决策结果有直接影响,...