Имеются 3 двумерных массива и 1 одномерный массив данных. Двумерные состоят из примерно 1 млн строк. Одномерный - пуст, но в него добавляются данные автоматически из двумерных. Суть в другом.
Алгоритм такой.
Прогон по всем строкам основного двумерного массива. Если значение этого массива, в текущей итерации, найдено в двух других массивах, - добавить это значение в одномерный массив.
Код оптимизировал для показа. Время выполнения - страшно представить. Какое можно найти решение в этой ситуации? Чтобы производительность оптимизировать.
Коллекции и словари смотрел, но так и непонял как заполнить их многомерно. Да и не факт, что будут работать быстрее массивов.
Вобщем, прошу помощи коллеги, в поиске изящного решения. Может быть кто-то уже сталкивался с подобным.
[vba]
Код
Function findIn2DimArr(data, arrName, arrField, arrUBound) Dim i As Long
'If base wasn't added earlier - add to If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True And findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
'Add to one-dimensional array
End If
Next i
End Sub
[/vba]
Всем доброго дня. Ищу решение проблемы.
Имеются 3 двумерных массива и 1 одномерный массив данных. Двумерные состоят из примерно 1 млн строк. Одномерный - пуст, но в него добавляются данные автоматически из двумерных. Суть в другом.
Алгоритм такой.
Прогон по всем строкам основного двумерного массива. Если значение этого массива, в текущей итерации, найдено в двух других массивах, - добавить это значение в одномерный массив.
Код оптимизировал для показа. Время выполнения - страшно представить. Какое можно найти решение в этой ситуации? Чтобы производительность оптимизировать.
Коллекции и словари смотрел, но так и непонял как заполнить их многомерно. Да и не факт, что будут работать быстрее массивов.
Вобщем, прошу помощи коллеги, в поиске изящного решения. Может быть кто-то уже сталкивался с подобным.
[vba]
Код
Function findIn2DimArr(data, arrName, arrField, arrUBound) Dim i As Long
'If base wasn't added earlier - add to If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True And findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True And findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
'Add to one-dimensional array
End If
на [vba]
Код
If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True THEN IF findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
'Add to one-dimensional array
End If End If
[/vba] Это даст ускорение ~ в два раза. А на порядки можно ускорить после сортировки массивов с дальнейшим бинарным поиском.
Cere6ellum, само напрашивается разнесение проверки по AND
If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True And findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
'Add to one-dimensional array
End If
на [vba]
Код
If findIn2DimArr(myArr(i, 2), firstSomeArr, 2, firstSomeUBound) = True THEN IF findIn2DimArr(vbomArr(i, 2), secondSomeArr, 2, secondSomeUBound) = True Then
'Add to one-dimensional array
End If End If
[/vba] Это даст ускорение ~ в два раза. А на порядки можно ускорить после сортировки массивов с дальнейшим бинарным поиском.Апострофф
Сообщение отредактировал Апострофф - Понедельник, 11.11.2019, 12:50
Я бы всю обработку в SQL перенес. Заполнить таблицы и все вытянуть одним запросом. Или для ускорения создать временную таблицу совпадения 2- х массивов и остальное обработать запросом.
Я бы всю обработку в SQL перенес. Заполнить таблицы и все вытянуть одним запросом. Или для ускорения создать временную таблицу совпадения 2- х массивов и остальное обработать запросом.doober
Всем спасибо. Переосмыслил реализацию. Заменил масивы словарями, т.к. в словарях поиск осуществляется быстрее, благодаря Exists. Теперь всё работает значительно быстрее. И время выполнения<= 1 минуте.
Всем спасибо. Переосмыслил реализацию. Заменил масивы словарями, т.к. в словарях поиск осуществляется быстрее, благодаря Exists. Теперь всё работает значительно быстрее. И время выполнения<= 1 минуте.Cere6ellum