我正在使用C#并且有一个包含不同数字的int数字列表,例如{34,36,40,35,37,38,39,4,5,3}。现在我需要一个脚本来查找列表中的不同范围并将其写入文件。对于这个例子,它将是:(34-40)和(3-5)。快速的方法是什么?
感谢您的帮助;
答案 0 :(得分:2)
最简单的方法是对数组进行排序,然后执行单个顺序传递以捕获范围。为了您的目的,这很可能足够快。
答案 1 :(得分:2)
我想到了两种技术:直方图和排序。直方图对于密集数集(你有大多数数字在最小值和最大值之间)都是好的,如果你有稀疏数字集,那么排序会很好(实际使用的最小值和最大值之间的数字很少)。
对于直方图,只需遍历数组并在相应的位置直方图中将布尔标志设置为True,然后遍历直方图以查找True的运行(默认值应为false)。
对于排序,只需使用最佳的排序技术对数组进行排序,然后遍历排序的数组以查找连续的运行。
编辑:一些例子。
假设您有一个包含前1,000,000个正整数的数组,但所有偶数为191的数组都被移除(您不会提前知道)。直方图将是一种更好的方法。
假设您有一个包含2(2,4,8,16,...)和3(3,9,27,81,...)的幂的数组。对于大型列表,列表将相当稀疏,并且应该预期排序会做得更好。
答案 2 :(得分:1)
正如迈克所说,首先对列表进行排序。现在,从第一个元素开始,记住该元素,然后将其与下一个元素进行比较。如果下一个元素比当前元素大1,则表示您有一个连续的系列。继续此操作,直到下一个数字不连续。当您到达该点时,您将拥有从第一个记住的值到当前值的范围。记住/输出该范围,然后再次使用下一个值作为新系列的第一个元素。这将在大约2N时间内执行(线性)。
答案 3 :(得分:0)
我会对它们进行排序,然后检查连续的数字。如果差异> 1你有一个新的范围。