`
shukuiyan
  • 浏览: 415512 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

划分等价类实现过程

阅读更多

百度的一个笔试题目:

百度全体员工玩分组游戏,前面五分钟大家分头找队友,并将每个人找到的队友信息汇报给主持人,如果AB是队友,BC是队友,那么AC也是队友;接着主持人不断地随机抽取两个人,希望判断二者是否为队友。请设计一个计算机程序辅助主持人判断两个人是否为队友,说明程序的关键算法,不需要代码实现。

例如:

<小明,小王><小军,小王><小丽,小李>是队友,那么小军和小明是队友,小军和小丽不是队友。

这道题目可以用图的连通性来解决,但是稍微复杂了些哈,下面提供划分等价类的方法,

划分等价类的过程,确定等价类的算法如下:
   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++数据结构等价类实现

    在编程实现过程中,注意C++的面向对象特性,如封装、继承和多态,可以帮助我们更好地设计和组织代码。通过封装,我们可以隐藏内部实现细节;通过继承,我们可以扩展已有类的功能,以适应不同类型的等价类;多态则...

    等价类划分法、边界值分析法、错误推断法

    在软件测试过程中,等价类划分是一种常用且有效的测试用例设计方法,它能够帮助测试工程师以较小的成本实现较为全面的测试覆盖。 **1.1 有效等价类** 有效等价类指的是符合程序规格说明中定义的功能和性能要求的...

    黑盒测试:等价类划分法、边界值分析.zip

    首先,等价类划分法是根据输入条件将所有可能的输入数据划分为若干个等价类,每个等价类内的数据对于测试目的来说是等效的。这种方法旨在最小化测试用例的数量,同时确保覆盖到所有可能的情况。例如,假设一个系统...

    软件测试基础 等价类划分法.docx

    这种方法的核心思想是将输入域分成若干个等价类,每个等价类中的数据在测试过程中具有等效性,即测试其中一个代表值就相当于测试了该类中的所有其他值。 1. **等价类划分法的概念**: - 等价类是指一组具有相同...

    软件测试的等价类划分法概述.pptx

    等价类划分法是软件测试中的一个重要概念,它是一种有效地减少测试用例数量的方法,旨在通过将所有可能的输入数据划分成若干个等价类别,然后仅选择每个类别中的一个代表性的数据作为测试用例,以确保软件功能的全面...

    等价闭包,等价类,哈斯图实现

    在等价关系下,集合中的元素被划分为若干个互不相交的子集,这些子集称为等价类。每个等价类内的元素都满足等价关系,而不同等价类之间的元素则不满足。等价类的概念在很多领域都有应用,如在编程语言中,可以用于...

    基于决策表的核属性计算、属性约简、等价类计算

    本项目着重于粗糙集中的核心概念——决策表的处理,包括等价类计算、核属性计算以及属性约简算法的实现。 首先,我们要理解决策表在粗糙集中的角色。决策表是粗糙集模型的基础,它是一种结构化的数据表示方式,用于...

    测试用例设计方法,简单易懂

    ### 划分等价类的标准 为了确保等价类划分的有效性和实用性,遵循以下标准至关重要: 1. **完备测试、避免冗余**:确保每个输入域都得到了充分的覆盖,同时避免重复测试同一类别的数据。 2. **集合的划分**:等价...

    四次软件测试实验报告

    这种方法的重点在于验证软件的外部行为,而非内部实现。 接下来是白盒测试,又称结构测试或代码覆盖率测试。与黑盒测试相反,白盒测试关注的是软件的内部逻辑和结构。测试人员会根据源代码的路径、分支和数据流来...

    软件测试用例设计方法

    以保险费率计算为例,我们可以根据年龄、性别、婚姻状况和扶养人数等输入条件划分等价类,如20-39岁、40-59岁和60岁以上分别对应不同的点数,性别、婚姻状态和扶养人数也会影响费率。通过等价类划分,我们可以设计出...

    软件工程师设计方法 - 副本.docx

    有效等价类是指符合程序规格说明的合理、有意义的输入数据集合,它们用于验证程序是否正确实现了预期功能。无效等价类则是不符合规格说明或无意义的输入数据集合,它们用于检测程序在处理异常或边界条件时的行为。 ...

    测试用例八大设计方法和实例.pdf

    2. **划分等价类的方法**: - 当输入条件有取值范围或数量限制时,通常可以确定一个有效等价类和两个无效等价类。 - 如果输入条件是固定的集合或有特定要求,可以确定一个有效等价类和一个无效等价类。 - 对于...

    黑盒用例设计方法

    3. **划分等价类的标准** - 完备性:确保所有的输入数据都被考虑到了。 - 无冗余性:确保不会出现重复的测试用例。 - 子集互斥:不同等价类之间没有重叠的数据。 **划分等价类的方法** 1. **基于范围的划分**:...

    测试用例设计方法

    #### 六、划分等价类的标准 1. **完备性**:确保测试覆盖所有可能的输入情况。 2. **非重叠性**:每个等价类之间不能有交叉或重叠。 3. **代表性**:从每个等价类中选取具有代表性的测试数据。 4. **有效性**:确保...

    测试用例八大设计方法和实例.doc

    2. **划分等价类的方法** - 依据输入条件的范围、集合、布尔值、特定数值等,可以确定有效的和无效的等价类。 - 当知道等价类内部的数据处理方式不同时,还需要进一步细化等价类。 3. **设计测试用例的原则** - ...

    2020-期末补充1

    划分过程中,需要选择每个等价类的一个代表值作为测试用例,以覆盖相应的执行路径。 实施等价类划分的方法有多种情况,例如: 1. 当输入值有明确范围时,可以划分有效等价类(范围内)和两个无效等价类(范围外)。...

    史上最全的测试用例设计方法总结

    3. **划分等价类的标准**: - 完备测试:确保覆盖所有可能的情况,避免遗漏。 - 避免冗余:确保每个测试用例都能独立地测试一个特定的等价类,减少重复测试。 - 划分的子集互不相交,且并集等于整个输入域,保证...

    粗糙集约简算法的实现(代码)

    例如,如果数据集包含个人的年龄、性别和收入,那么可以依据年龄划分等价类。 3. **边界和决策属性计算**:接着,我们计算每个属性的边界值,这是区分不同等价类的关键。同时,确定哪些属性对决策结果有直接影响,...

Global site tag (gtag.js) - Google Analytics