Форум сайта python.su
0
Всем привет!
Решаю задачу по поиску наибольшего общего подмассива в 2-х массивах. Длина массивов одинаковая.
Написал алгоритм, у меня на машине отрабатывает за 4 секунды на массивах из 1000 элементов, что наверное очень долго. Но тесты не проходит, пишет, что превышено время выполнения.
Алгоритм вроде верный, но долгий.
Можно ли как-то ускорить код, или подсказать узкие места в коде?
Код:
def find_subarrays_leinght(nums1, nums2): if nums1 == nums2: return len(nums1) # если массивы равны, то возвращаем длину массива nums2=' ' +' '.join([str(i) for i in nums2]) + ' ' # склеиваем массив через разделитель == пробел (нужно для поичка подмассива) nums1=[str(i) for i in nums1] # переводим числа в строки в массиве nums1 for i in range(len(nums1)+1): # цикл от большей подстроки (сначала равна всему массиву, потом на 1 меньше и т.д.) к меньшей width = len(nums1) - i + 1 # длина подмассива window_start = 0 # начало окна window_end = window_start + width # конец окна while window_end < len(nums1)+1: # пока конец окна меньше длины массива nums1 key=' ' + ' '.join(nums1[window_start:window_end]) + ' ' # склеиваем строку размером [window_start:window_end] для поиска в массиве nums2 if key in nums2: # если присутствует, то return len(key.split()) # возвращаем её длину window_start+=1 # увеличиваем начало окна на 1 window_end = window_start + width # сдвигаем окно слева направо return 0 # если совпадений нет, то возвращаем 0 nums1=[1,2,3,2,1] nums2=[3,2,1,4,7] print(find_subarrays_leinght(nums1, nums2)) #для примера выше ответ будет 3. Т.е. 3 2 1
Офлайн
857
artemu88От строк надо избавиться.
Можно ли как-то ускорить код, или подсказать узкие места в коде?
artemu88Не надо ничего склеивать.
склеиваем массив через разделитель
Офлайн
0
py.user.nextпонял, пойду думать, как исправить. Просто решил склеивать массив в строки, чтобы было легче искать в другом массиве ( про помощи оператора in, чтобы получилось что-то типа оператора LIKE в других языках), для этого также добавил пробелы в начале и в конце массива.
От строк надо избавиться.
Офлайн
124
artemu88Это задача на тему динамического программирования, почитайте
Решаю задачу по поиску наибольшего общего подмассива
Офлайн
857
xam1816Не, там просто по индексам перебираешь первый массив и находишь входы во втором массиве. При нахождении входа идёшь по совпадающим элементам. Самый длинный массив запоминаешь по позиции и по длине.
Это задача на тему динамического программирования
Обратите внимание! Подпоследовательность отличается от подстроки. Например, если есть исходная последовательность “ABCDEF”, то “ACE” будет подпоследовательностью, но не подстрокой, а “ABC” будет как подпоследовательностью, так и подстрокой.
Отредактировано py.user.next (Авг. 1, 2024 01:03:41)
Офлайн
857
artemu88Это ошибка новичков всех. Они думают, что делают что-то такое умное прямо, до чего бы никто не догадался, но в итоге почти каждый из них делает вот это. Так что ты не первый, кто столкнулся с суровой реальностью.
Просто решил склеивать массив в строки, чтобы было легче искать в другом массиве ( про помощи оператора in, чтобы получилось что-то типа оператора LIKE в других языках)
Отредактировано py.user.next (Авг. 1, 2024 10:16:51)
Офлайн
0
Всем большое спасибо!
Пойду учить матчасть.
Офлайн