bucket sort sample sort 并行_算法题:岛问题/并行结构/并查集

bcb45c3340dd296b4aaae3c9ebd3933f.png

思路:

遍历矩阵上的每个点,如果这个点是1,我们就让这个点进入一个感染函数。

这个感染函数能够感染这个点周围四个方向的所有是1的点,让他的值变成2.

然后让岛的数量加1。

这个函数是递归的,如果这个点的值不是1,就不感染直接跳出。

#include <iostream>
using namespace std;
const int N = 10010;
void infect(int a[N][N], int i,int j,int row, int column) {
	if (i >= row || j >= column || i < 0 || j < 0 || a[i][j] != 1) return;
	a[i][j] = 2;
	infect(a, i - 1, j, row, column);
	infect(a, i + 1, j, row, column);
	infect(a, i , j - 1, row, column);
	infect(a, i , j +1, row, column);
}
int countislands(int a[N][N], int row, int column) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++) {
			if (a[i][j] == 1) {
				infect(a,i,j, row, column);
			}
		}
	}
}

这是单CPU,单内存的方式。

如果我们把这个矩阵分成两部分。

左边右边同时进行判断岛的数量,这样可以提高运行效率。

多CPU,并行的操作方式。

但是,这样做的话,面临合并两边需要减少岛的数量,因为有些在边界的元素可能会组成一个岛,但是在计算时两边都计算了。

因此,我们面临的问题是:

如何解决合并时边界的岛判断问题

这时候并查集结构就派上用场了。

分析这个问题的本质就是,当我们遇到左部分的有边界上有1,右边界的左部分有1,这时候就需要合并减少岛的数量。

不妨把每个岛的第一个感染的元素当成这个岛的代表点。

在同一个岛的元素,就可以当成一个集合了。这个集合有一个代表点。

当遇到需要减少岛数量的时候,先判断是否是一个集合,如果是,就说明这两个岛之前合并过,已经减过1了,不需要再减了不是一个集合,我们就减少,然后将这两边的两个岛合并,组成一个集合。

然后再遇到需要减少岛的时候继续减少,然后再合并。

这样就避免了多减的问题。

当分成小块,我们只需要把边界 改成四面八方的边界点,就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
{"method":"/algo/result","request":"{"user_input_params":{"cur_hour":"'1000'","limit_offset":"0","limit_size":"500","cur_day":"'20230605'"},"version":"main","tid":"generate_direct_purchase_task_v2","sid":"OMS"}","dsl":"cluster:bigdata GET store_product_auto_purchase_hourly/_search { "size" : 0, "query" : { "bool" : { "filter" : [ { "bool" : { "must" : [ { "term" : { "cur_day" : { "value" : "20230605", "boost" : 1.0 } } }, { "term" : { "cur_hour" : { "value" : "1000", "boost" : 1.0 } } } ], "adjust_pure_negative" : true, "boost" : 1.0 } } ], "adjust_pure_negative" : true, "boost" : 1.0 } }, "_source" : { "includes" : [ ], "excludes" : [ ] }, "aggregations" : { "result" : { "composite" : { "size" : 10000, "sources" : [ { "supplier_id" : { "terms" : { "field" : "supplier_id", "missing_bucket" : false, "order" : "asc" } } }, { "city_zip" : { "terms" : { "field" : "city_zip", "missing_bucket" : false, "order" : "asc" } } }, { "city_order_create_type" : { "terms" : { "field" : "city_order_create_type", "missing_bucket" : false, "order" : "asc" } } }, { "city_order_create" : { "terms" : { "field" : "city_order_create", "missing_bucket" : false, "order" : "asc" } } }, { "city_order_confirm_end" : { "terms" : { "field" : "city_order_confirm_end", "missing_bucket" : false, "order" : "asc" } } }, { "supply_model" : { "terms" : { "field" : "supply_model", "missing_bucket" : false, "order" : "asc" } } }, { "dc_store_delivery_start_time" : { "terms" : { "field" : "dc_store_delivery_start_time", "missing_bucket" : false, "order" : "asc" } } }, { "plan_sale_base_start" : { "terms" : { "field" : "plan_sale_base_start", "missing_bucket" : false, "order" : "asc" } } }, { "rule_detail_type" : { "terms" : { "field" : "rule_detail_type", "missing_bucket" : false, "order" : "asc" } } }, { "delivery_waves" : { "terms" : { "field" : "delivery_waves", "missing_bucket" : false, "order" : "asc" } } } ] }, "aggregations" : { "r_bucket_sort" : { "bucket_sort" : { "sort" : [ ], "from" : 0, "size" : 500, "gap_policy" : "SKIP" } } } } }}","total":0,"result":"[]"} 将上面的json转化为python字典
06-06

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值