您只需要迭代{-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实现。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)