【问题标题】:C# - Searching for sequences in arraysC# - 在数组中搜索序列
【发布时间】:2013-05-28 20:29:11
【问题描述】:

我有一些用 1 和 0 填充的数组。有没有简单的方法可以找到,例如,10 个彼此相邻且值为 1 的字段?

类似:if (array[i ... i+10] = 1) -> 做一些事情?

我知道我可以使用 for 来做到这一点,但我有一个巨大的多重数组,这将非常有帮助。

【问题讨论】:

  • 如果您想在不循环的情况下快速查找,也许从一开始就将信息编码到您的数组中。不要使用10 存储数组,而是将其存储为一组Sequence 对象,这些对象具有Value(将存储10)和Length(将指示该值中有多少在一行中重复)。然后跳过你的数组会快得多,一次一个完整的序列。甚至可以将这些序列放入排序的查找表中(可能是Length)。

标签: c# arrays search


【解决方案1】:

你可以很容易地用 for 循环做到这一点:

int c = 0;
for (int i = 0; i < myArray.Length; i++)
{
    c = (myArray[i] == 1) ? c + 1 : 0;
    if (c >= 10)
    {
        // do stuff
    }
}

这是使用 Linq 的另一种方式:

var indexes =
    from i in Enumerable.Range(0, myArray.Length - 10)
    where myArray.Skip(i).Take(10).All(x => x == 1)
    select i;
foreach(var i in indexes)
{
    // do stuff
}

这将返回 myArray 的所有索引,其中该索引处的元素和接下来 9 个索引的元素都等于 1。但是,这种方法比简单的 for 循环效率稍低,因为它可能会检查每个项目不止一次。

如果你喜欢流畅的语法:

var indexes = Enumerable.Range(0, myArray.Length - 10)
                        .Where(i => myArray.Skip(i).Take(10).All(x => x == 1));
foreach(var i in indexes)
{
    // do stuff
}

【讨论】:

  • 嗨。这是一个很好的解释。但是,我有疑问你能澄清一下吗?我假设,数组有 12 个项目,然后范围取 2(12-10)个项目。在你把变量'i'放在skip中的地方,所以我猜'i'的值是1和2。它如何到达第10位?对不起,如果它非常基本。
  • @RameshMuthiah 它不会。在Linq 解决方案中,我只考虑[0, length-10] 中的i。但它随后会测试 i 和接下来的 9 个元素,因此每个元素都会被检查(至少一次)。
  • int[] value = new int[] {10,20,31,40,51,60,1,0,1,1,122,100,12,10,11}; var result = from i in Enumerable.Range(0, value.Length - 10) where value.Skip(i).Take(10).All(X => X == X) select value[i];
  • 我还是不清楚。在上面的示例中,它仅返回 5 个值。为什么不应该在 15 个输入中返回 10 个结果?
  • 最后,我明白了“i”是 0 到 4。然后第一次迭代它跳过 0,然后是下一个 1,直到 4。然后,最后它是 5 个值,这是一个结果集。谢谢
【解决方案2】:

如果我理解你的问题,你想做一些叫做模式匹配的事情。

那里有很多算法。第一个起点是this page here

从算法来看,Turbo-Boyer-Moore 是表现最好的算法。

但您也可以使用数据结构(例如后缀树)来处理该问题: see this article on suffix trees (or simply called Trie)

这是 Boyer-Moore 算法的一个实现Codeproject article on Boyer-Moore

【讨论】:

    猜你喜欢
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2016-01-29
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多