C数据结构-并查集升级版

本文基于LeetCode582题,探讨并查集在解决杀死进程问题上的应用。当指定杀死一个进程(kill)时,其所有子进程也将被杀死。文章重点介绍了并查集优化策略,包括在查找团队老大时如何避免查找kill节点,并讨论了并查集可扩展至大规模数据。同时,解释了关键代码逻辑,如getLeader函数和处理进程关系的方法。
摘要由CSDN通过智能技术生成

leetcode582,杀死进程。之前的帖子C数据结构-并查集介绍过并查集的用途,这道题是升级版本,每个进程有个父进程,指定杀死节点kill,那么他下面的子子孙孙也会被一并杀死。需要给出啥子某个指定节点后,具体哪些节点会被杀死。

1、在查找团队大哥的函数上需要优化。**如果发现某个小弟大哥是kill了,就不要继续向上找了,到此为止。**这样保证记录的数组中,一旦大佬是kill的,都标识成了kill。
2、完全没有get到并查集可以这么玩,可以定义到130000这么大
3、要了解什么时候tmp[pid[i]] = y;的心理,因为pid[i]必然低于ppid[i]一个位置,除非pid当前的老板不是kill,那么就可以进行这样处理了。

x = getleader(pid[i]);
y = getleader(ppid[i]);
if (x != y && x != g_kill) {
	tmp[pid[i]] = y;
}
if (pid[i] == g_kill) {
	tmp[pid[i]] = g_kill;
}

如下是getleader函数

int getleader(int curr) {
	int son = curr;
	while (tmp[curr] != -1) {
		if (curr == g_kill) {
			tmp[curr] = curr;
			break;
		}
		curr = tmp[curr];
	}
	int tmpinfo;
	while (tmp[son] != -1) {
		if (son == g_kill) {
			break;
		}
		tmpinfo = tmp[son];
		tmp[son] = curr;
		son = tmpinfo;
	}
	return curr;
}

如下是题目要求的函数

int* killProcess(int* pid, int pidSize, int* ppid, int ppidSize, int kill, int* returnSize) {

	int i, count, x, y;
	g_kill = kill;
	for (i = 0; i < MAXLEN; i++) {
		tmp[i] = -1;
	}
	for (i = 0; i < ppidSize; i++) {
		x = getleader(pid[i]);
		y = getleader(ppid[i]);
		if (x != y && x != g_kill) {
			tmp[pid[i]] = y;
		}
		if (pid[i] == g_kill) {
			tmp[pid[i]] = g_kill;
		}

	}
	for (i = 0; i < ppidSize; i++) {
		getleader(pid[i]);

	}
	count = 0;
	for (i = 0; i < ppidSize; i++) {
		if (tmp[pid[i]] == g_kill) {
			count++;
		}
	}
	*returnSize = count;
	int* ret = (int*)malloc(sizeof(int) * count);
	count = 0;
	for (i = 0; i < ppidSize; i++) {
		if (tmp[pid[i]] == g_kill) {
			ret[count++] = pid[i];
		}
	}
	return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值