我有以下代码来获取所有可能的切片开始/结束索引的列表,按切片长度的下降顺序排列。然后我遍历列表并使用它来切片数组,当我得到一个我正在寻找的切片时断开。我这样做是因为我正在寻找与其他参数相匹配的最大切片,而且我希望在找到其他切片之后快速切过其他可能的切片。
我更喜欢使用几个嵌套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();
答案 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}");
答案 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