跨多个单元格最有效地搜索二维数字数组
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 的网格,其中每个单元格最开始是白色, 请你用 红绿蓝 三种颜色为每个单元格涂色。所有单元格都需要被涂色, 涂色方案需要满足: