YOgen
Знающий
- Сообщения
- 58
- Репутация
- 5
Добрый день.
В наличии имеется один или сразу несколько диапазонов чисел, т.е.:
1 вариант: от 1 до 10.000;
2 вариант: от 1 до 7.000, и от 15.000 до 20.000.
И есть массив используемых чисел.
Есть ли возможность быстрее чем в приведенном решении найти в диапазоне(ах) числа, которые отсутствуют в массиве используемых чисел?
В приведенном примере на моей машине (WinXP, 3.0 Ghz) поиск длится примерно 21 сек., хотя значений немного (есть диапазоны по 60.000 чисел и массивы используемых дел по 40.000).
В наличии имеется один или сразу несколько диапазонов чисел, т.е.:
1 вариант: от 1 до 10.000;
2 вариант: от 1 до 7.000, и от 15.000 до 20.000.
И есть массив используемых чисел.
Есть ли возможность быстрее чем в приведенном решении найти в диапазоне(ах) числа, которые отсутствуют в массиве используемых чисел?
В приведенном примере на моей машине (WinXP, 3.0 Ghz) поиск длится примерно 21 сек., хотя значений немного (есть диапазоны по 60.000 чисел и массивы используемых дел по 40.000).
Код:
#include <Array.au3>
Opt("TrayIconDebug", 1)
Global $aRanges[2][2] = [[1, 7000], [15001, 20000]] ; 2 диапазона чисел
Global $aNumbers[7000] ; массив используемых чисел
For $i = 0 To UBound($aNumbers) - 1
$aNumbers[$i] = Random(1, 30000, 1)
Next
$hTimer = TimerInit()
Local $iRows = 0, $iCounter = 0
Local $aRangeFull[1]
For $i = 0 To UBound($aRanges) - 1
$iRows += $aRanges[$i][1] - $aRanges[$i][0] + 1
ReDim $aRangeFull[$iRows]
For $k = $aRanges[$i][0] To $aRanges[$i][1]
$aRangeFull[$iCounter] = $k
$iCounter += 1
Next
Next
Local $sRangeFull = "|" & _ArrayToString($aRangeFull) & "|"
For $i = 0 To UBound($aNumbers) - 1
If StringInStr($sRangeFull, "|" & $aNumbers[$i] & "|") Then
ToolTip(Round(TimerDiff($hTimer) / 1000, 2))
$sRangeFull = StringReplace($sRangeFull, "|" & $aNumbers[$i] & "|", "|")
EndIf
Next
$sRangeFull = StringReplace(StringTrimRight(StringTrimLeft($sRangeFull, 1), 1), "|", @CRLF)
FileWriteLine("Result.txt", $sRangeFull) ; результат записывается в файл