Group of 1s in a Matrix

本文介绍了一种使用深度优先搜索(DFS)算法来计算矩阵中由相邻1组成的团的数量的方法。通过遍历矩阵并标记已访问的单元格,确保不重复计算同一团内的1。实例代码演示了如何实现这一过程。

Given a matrix with 1s and 0s, please find the number of groups of 1s. A group is defined by horizontally or vertically adjacent 1s. For example, there are four groups of 1s in figure below.


Analysis: Use DFS.

public class NumberOfGroups {
	
	public static void main(String[] args) {
		int[][] input = {{1, 1, 0, 1, 1}, {1, 0 ,0 , 1, 0}, {1, 1, 1, 1, 0}, {0, 0, 1, 0, 0}};
		System.out.println(new NumberOfGroups().getNumberofGroups(input));
	}
	
	public int getNumberofGroups(int[][] input) {
		boolean[][] visited = new boolean[input.length][input[0].length];
		int count = 0;
		for (int i = 0; i < input.length; i++) {
			for (int j = 0; j < input[0].length; j++) {
				if (input[i][j] == 1 && visited[i][j] == false) {
					count++;
					traverse(input, visited, i, j);
				}
			}
		}
		return count;
	}
	
	public void traverse(int[][] input, boolean[][] visited, int i, int j) {
		if (i < 0 || i >= input.length || j < 0 || j >= input[0].length 
				|| visited[i][j] == true || input[i][j] == 0) return;
		visited[i][j] = true;
		traverse(input, visited, i - 1, j);
		traverse(input, visited, i + 1, j);
		traverse(input, visited, i, j - 1);
		traverse(input, visited, i, j + 1);
	}
}
blog.youkuaiyun.com/beiyetengqing



<think>好的,用户遇到了一个R语言错误,错误信息是:“Error in combn(group_levels, 2, function(pair) { : n < m”。我需要先理解这个错误的原因,然后给出解决方案。 首先,用户在使用sapply函数,调用了cliff_delta方法,分组变量是group$grazing。错误出现在combn函数中,提示n < m。combn函数的作用是生成所有可能的组合,当尝试生成C(n, m)的组合时,如果n < m就会报这个错。比如,如果n是分组的数量,而这里m是2,因为combn默认生成两两组合,所以问题可能在于分组数量少于2。 接下来,我需要确认用户的分组变量group$grazing的情况。如果这个变量只有一个水平(即所有样本都属于同一组),那么在尝试生成两两组合时,combn(1, 2)就会失败,因为无法从1个元素中选2个。这时候需要检查分组变量的结构,使用table(group$grazing)或者unique(group$grazing)来确认分组数量。 另外,可能用户的分组变量中存在NA值或者未正确转换为因子,导致分组数量计算错误。需要建议用户检查数据是否存在这些问题,并确保分组变量是正确的因子类型,且至少有两个不同的组别。 最后,解决方案包括:检查分组变量的水平数量,确保至少有两个组;处理NA值;转换变量为因子;以及示例代码来帮助用户验证问题所在。同时,需要提醒用户cliff_delta可能需要的分组结构,确保统计分析的前提条件满足。</think>你遇到的这个错误是因为在计算Cliff's Delta效应量时,分组变量(group$grazing)的水平数不足导致的。以下是逐步解析和解决方案: **错误原因分析:** 1. `combn()`函数尝试生成分组的两两组合 2. 但你的分组变量`group$grazing`中的独特水平数(n)小于2(即所有样本都在同一组) 3. 检查分组变量结构:`table(group$grazing)`可能显示只有1个分组 **验证步骤:** ```r # 查看分组情况 print(unique(group$grazing)) print(table(group$grazing)) # 检查是否为因子类型 class(group$grazing) ``` **常见解决方案:** 1. 确保分组变量包含至少2个不同水平: ```r # 转换为因子并检查水平 group$grazing <- as.factor(group$grazing) levels(group$grazing) ``` 2. 处理缺失值: ```r # 移除含NA的观测 complete_cases <- complete.cases(group$grazing, spe) group <- group[complete_cases, ] spe <- spe[complete_cases, ] ``` 3. 检查数据维度匹配: ```r stopifnot(nrow(group) == nrow(spe)) ``` **示例调试代码:** ```r # 模拟正确分组数据测试 test_group <- data.frame(grazing = factor(rep(c("A","B"), each=10))) test_spe <- matrix(rnorm(20), ncol=1) # 应能正常运行 sapply(test_spe, cliff_delta, group = test_group$grazing) ``` **注意事项:** - Cliff's Delta适用于两个独立组的比较 - 如果确实只有一个分组,需要重新考虑分析方法 - 分组变量建议存储为factor类型 - 确保没有全为NA的分组 请先运行`table(group$grazing)`确认分组情况,如果结果显示多个分组但仍报错,可能需要检查是否有隐藏的特殊字符或空格导致分组识别错误。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值