如何在多维数组中查找邻居?

如何在多维数组中查找邻居?,第1张

如何在多维数组中查找邻居?

您只需要迭代{-1,0,1}到 N
的集合的笛卡尔幂以形成相对于当前索引的索引,请小心丢弃全零组合(该组合对应于当前元素)
: __

algorithm neighbors(N : positive integer,         index : N-tuple of integers)    neighbors_list := empty list    for relative_index in cartesian_power({-1, 0, 1}, N) do        if not (relative_index is all zeros then) new_index := [index[i] + relative_index[i] for i in 1..N] neighbors_list := append(neighbors_list, new_index)        end    loop    return neighbors_list

注意,在可能和必要时,可以懒惰地对此进行评估。笛卡尔幂也可以以非递归的方式实现:

algorithm cartesian_power(s : set, N : positive integer)    result := list(empty list)    repeat N times        result_step= empty list        for res in result do for elem in s do     new_res := append(res, s)     result_step := append(result_step, new_res) loop        loop       result := result_step    loop    return result

您也可以延迟评估该算法,尽管它有点复杂,因为您必须生成在最外层循环的最后一次迭代中创建的元素。

这些算法未考虑诸如索引范围或其他约束之类的内容,因此您可能需要根据情况添加其他逻辑,但是核心思想是相同的。

这是作为Python生成器的示例实现:

from itertools import productdef neighbors(index):    N = len(index)    for relative_index in product((-1, 0, 1), repeat=N):        if not all(i == 0 for i in relative_index): yield tuple(i + i_rel for i, i_rel in zip(index, relative_index))print(list(neighbors((1, 2)))>>> [(0, 1), (0, 2), (0, 3), (1, 1), (1, 3), (2, 1), (2, 2), (2, 3)]print(list(neighbors((1, 2, 3)))>>> [(0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 2), (0, 2, 3), (0, 2, 4), (0, 3, 2), (0, 3, 3), (0, 3, 4), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 2, 2), (1, 2, 4), (1, 3, 2), (1, 3, 3), (1, 3, 4), (2, 1, 2), (2, 1, 3), (2, 1, 4), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 2), (2, 3, 3), (2, 3, 4)]

显然我在这里作弊是因为我正在使用Python内置函数来计算笛卡尔乘方。但是,如果您转至其文档,

itertools.product
则会看到我上面编写的算法的Python实现。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4984214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存