Форум сайта python.su
Всем привет!
Решаю задачу по поиску наибольшего общего подмассива в 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
Офлайн
artemu88От строк надо избавиться.
Можно ли как-то ускорить код, или подсказать узкие места в коде?
artemu88Не надо ничего склеивать.
склеиваем массив через разделитель
Офлайн
py.user.nextпонял, пойду думать, как исправить. Просто решил склеивать массив в строки, чтобы было легче искать в другом массиве ( про помощи оператора in, чтобы получилось что-то типа оператора LIKE в других языках), для этого также добавил пробелы в начале и в конце массива.
От строк надо избавиться.
Офлайн
artemu88Это задача на тему динамического программирования, почитайте
Решаю задачу по поиску наибольшего общего подмассива
Офлайн
xam1816Не, там просто по индексам перебираешь первый массив и находишь входы во втором массиве. При нахождении входа идёшь по совпадающим элементам. Самый длинный массив запоминаешь по позиции и по длине.
Это задача на тему динамического программирования
Обратите внимание! Подпоследовательность отличается от подстроки. Например, если есть исходная последовательность “ABCDEF”, то “ACE” будет подпоследовательностью, но не подстрокой, а “ABC” будет как подпоследовательностью, так и подстрокой.
Отредактировано py.user.next (Авг. 1, 2024 01:03:41)
Офлайн
artemu88Это ошибка новичков всех. Они думают, что делают что-то такое умное прямо, до чего бы никто не догадался, но в итоге почти каждый из них делает вот это. Так что ты не первый, кто столкнулся с суровой реальностью.
Просто решил склеивать массив в строки, чтобы было легче искать в другом массиве ( про помощи оператора in, чтобы получилось что-то типа оператора LIKE в других языках)
Отредактировано py.user.next (Авг. 1, 2024 10:16:51)
Офлайн
Всем большое спасибо!
Пойду учить матчасть.
Офлайн