跨多个单元格最有效地搜索二维数字数组

Posted

技术标签:

【中文标题】跨多个单元格最有效地搜索二维数字数组【英文标题】:Most Efficient Search for 2D Array of Numbers Across Multiple Cells 【发布时间】:2020-05-09 09:15:59 【问题描述】:

我有一系列 8x8 2D 阵列。数组中的每个单元格可以包含一个从 0 到 9 的值作为 int。单元格的值也可以是 -1,但这是为了指示空单元格或无效单元格。然后给我一段时间的序列。我将如何搜索二维数组以找到序列?一个二维数组可以包含多个序列,但并非所有序列都可以在一个二维数组中找到。序列不能改变方向,但可以向左或向右、向上或向下移动,直到碰到数组边缘或无效单元格。

Example:
[4,6,8,1,4,5,7,-1]
[6,3,1,9,0,3,3,1]
[1,6,7,9,3,-1,7,1]
[1,6,7,-1,4,3,1,2]
[1,4,5,6,-1,8,3,1]
[8,0,1,3,5,6,2,0]
[0,6,9,8,2,6,8,2]
[2,6,9,0,4,3,5,1]

需要查找序列:1121021、524、15340962、16793、13309136

代码在 C# 中。

我应该寻找路径查找算法还是搜索算法?

【问题讨论】:

您必须使用深度优先搜索来查找特定序列。 您正在寻找一种搜索算法,因为您已经有了路径,即序列,以及如何找到它们的规则。该算法可能可以通过对数据进行预处理来优化,但具体如何取决于网格或序列的变化频率、序列是否多于网格以及是否可以同时查找所有序列。 【参考方案1】:

序列不能改变方向,所以你不需要寻路。

改为考虑使用string searching algorithms。

这里需要寻找多种模式,所以

Aho–Corasick string matching algorithm (extension of Knuth-Morris-Pratt)
Commentz-Walter algorithm (extension of Boyer-Moore)
Set-BOM (extension of Backward Oracle Matching)
Rabin–Karp string search algorithm

是合适的。

对于像 13309136 这样的反向方向,您可以创建反向模式。

【讨论】:

以上是关于跨多个单元格最有效地搜索二维数字数组的主要内容,如果未能解决你的问题,请参考以下文章

2023-02-11:给你两个整数 m 和 n 。构造一个 m x n 的网格,其中每个单元格最开始是白色, 请你用 红绿蓝 三种颜色为每个单元格涂色。所有单元格都需要被涂色, 涂色方案需要满足:

Excel 2010:如何在不修改其输入值的情况下跨多个单元格更改公式?

2022&2023华为OD机试 - 找单词(Python)

如何有效地从大型 Excel 文档中检索所有字符串

矩阵中严格递增的单元格数

显示错误/混合单元格结果的搜索栏