按长度顺序获取数组切片

本文关键字:数组 切片 获取 顺序 | 更新日期: 2023-09-27 18:03:25

我有以下代码来获取所有可能的片开始/结束索引的列表,按片长度降序排列。然后我遍历列表并使用它对数组进行切片,当我得到我正在寻找的切片时中断。我这样做是因为我正在寻找与其他参数匹配的最大切片,并且一旦我找到了一个,我就会寻找超越其他可能切片的捷径。

我更喜欢一对嵌套的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();

按长度顺序获取数组切片

如果我正确理解了这个问题,您正在寻找满足某些特定条件的数组的最大子数组(您称之为"切片"…可能是来自其他编程语言的术语?)。在你的问题中,你没有具体说明条件本身,所以我认为这部分不重要。

似乎你有困难的是安排你的代码,以便你必须先检查最长的子数组。

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

例如:

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
    }
}

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

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

我明白了。下面是我所需要的,以反向长度顺序遍历每个数组切片。

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 };

for (int length = data1.Count() - 1; length > 0; length--)
{
    int numberOfSlicesForLength = data1.Count() - length;
    for (int start = 0; start < numberOfSlicesForLength; start++)
    {
        byte[] sliceValues = data1.Skip(start).Take(length);
    }
}