按长度顺序获取数组切片

时间:2016-08-22 21:31:18

标签: c# .net

我有以下代码来获取所有可能的切片开始/结束索引的列表,按切片长度的下降顺序排列。然后我遍历列表并使用它来切片数组,当我得到一个我正在寻找的切片时断开。我这样做是因为我正在寻找与其他参数相匹配的最大切片,而且我希望在找到其他切片之后快速切过其他可能的切片。

我更喜欢使用几个嵌套for循环来检查切片并继续前进,而不是必须获得所有可能的范围并首先对它们进行排序,因为数组可能高达十亿左右。我不能为我的生活弄清楚如何去做,甚至如何用短语来搜索它。任何帮助表示赞赏。

byte[] data1 = { 54, 87, 23, 87, 45, 67, 7, 85, 65, 65, 3, 4, 55, 76, 65, 64, 5, 6, 4, 54, 45, 6, 4 };

List<Tuple<int, int>> ranges = new List<Tuple<int, int>>();
for (int i1 = 0; i1 < data1.Count(); i1++)
{
    for (int i2 = i1 + 1; i2 < data1.Count(); i2++)
    {
        ranges.Add(new Tuple<int, int>(i1, i2));
    }
}


ranges = ranges.OrderByDescending(x => x.Item2 - x.Item1).ToList();

3 个答案:

答案 0 :(得分:1)

您可以通过几个嵌套循环直接枚举切片:

bool found = false;
for (int sliceLen = data1.Length; !found && sliceLen > 0; sliceLen--)
    for (int sliceStart = 0; !found && sliceStart + sliceLen <= data1.Length; sliceStart++)
        if (found = (
            data1[sliceStart] == data1[sliceStart + sliceLen - 1]   // check your condition here
        ))
            Console.WriteLine($"Found: {sliceStart}:{sliceLen}");

演示:https://ideone.com/lZRNJm

答案 1 :(得分:1)

如果我正确地理解了这个问题,那么你正在寻找一个数组的最大子数组(你称之为&#34; slice&#34; ...可能是来自其他编程语言的术语?),它满足某些特定条件。在您的问题中,您对条件本身并不具体,因此我认为该部分并不重要。

您遇到的困难似乎是安排您的代码,以便您必须首先检查最长的子阵列。

如果所有这些都是正确的,那么您只需要以不同的方式排列循环。目前,您正在选择一个起始索引,然后查找从该索引开始的所有子数组。相反,由于您希望首先检查最长的子阵列,因此您应该选择子阵列的 length ,从最长的可能长度开始,然后选择所有可能长的子阵列。

例如:

for (int i = data1.Length; i > 0; i--)
{
    for (int j = 0; j < data1.Length - i + 1; j++)
    {
        // inspect subarray starting at index j, having length i
    }
}

答案 2 :(得分:0)

我明白了。这就是我需要的,以相反的长度顺序迭代每个数组切片。

printf