Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Помогите отладить, никак не могу запустить  (Прочитано 549 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Код: (python) [Выделить]
__author__ = 'denis'


def find_max_subarray(a, low, high):
    if high == low:
        return low, high, a[low]
    else:
        mid = (low + high) / 2
        left_low, left_high, left_sum = find_max_subarray(a, low, mid)
        right_low, right_high, rigth_sum = find_max_subarray(a, mid + 1, high)
        cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
        if (left_sum >= rigth_sum) & (left_sum >= cross_sum):
            return left_sum, left_high, left_sum
        elif (rigth_sum >= left_sum) & (left_sum >= cross_sum):
            return right_low, right_high, rigth_sum
        else:
            return cross_low, cross_high, cross_sum


def find_crossing(a, low, mid, high):
    max_left = 0
    max_right = 0
    left_sum = -1e308
    sum = 0
    for i in range(mid, low, -1):
        sum = sum + a[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
            max_right = 0
    right_sum = -1e308
    sum = 0
    for j in range(mid + 1, high):
        sum = sum + a[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
    return max_left, max_right, left_sum + right_sum
a = [5, 4, 3, 55, 2, 6, 3, 7, 33, 6]
min, max, sum = find_max_subarray(a, 0, len(a) - 1)
print(min," ", max," ", sum)
Я знаю что есть более эффективные и простые реализации поиска подмассива с максимальной суммой, но нужна именно эта реализация, помогите пожалуйста, заранее спасибо.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Помогите отладить, никак не могу запустить
« Ответ #1 : 08 Декабря 2015, 16:47:12 »
Смог запустить, если кому интересно:
Код: (python) [Выделить]
__author__ = 'denis'


def find_max_subarray(a, low, high):
    if high == low:
        return low, high, a[low - 1]
    else:
        mid = int((low + high) / 2)
        left_low, left_high, left_sum = find_max_subarray(a, low, mid)
        right_low, right_high, rigth_sum = find_max_subarray(a, mid + 1, high)
        cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
        if (left_sum >= rigth_sum) & (left_sum >= cross_sum):
            return left_sum, left_high, left_sum
        elif (rigth_sum >= left_sum) & (left_sum >= cross_sum):
            return right_low, right_high, rigth_sum
        else:
            return cross_low, cross_high, cross_sum


def find_crossing(a, low, mid, high):
    max_left = 0
    max_right = 0
    left_sum = -1e308
    sum = 0
    for i in range(mid, low, -1):
        sum = sum + a[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
            max_right = 0
    right_sum = -1e308
    sum = 0
    for j in range(mid + 1, high):
        sum = sum + a[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
    return max_left, max_right, left_sum + right_sum
a = [-5, 5, 4, 3, -6, 55, 2,-1, 6, 3, 7, -5,-4, 33 -9, 6]
min, max, sum = find_max_subarray(a, 0, len(a))
print(min," ", max," ", sum)

Пользователь решил продолжить мысль [time]08 Декабрь 2015, 17:50:34[/time]:
Хотя все равно выдает не верный результат

Пользователь решил продолжить мысль 08 Декабря 2015, 22:48:09:
Кажется получилось заставить программу давать правильный ответ
Код: (python) [Выделить]
__author__ = 'denis'


def find_max_subarray(a, low, high):
    if high == low:
        return low, high, a[0]
    else:
        mid = int((low + high) / 2)
        left_low, left_high, left_sum = find_max_subarray(a, low, mid)
        right_low, right_high, rigth_sum = find_max_subarray(a, mid + 1, high)
        cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
        if (left_sum >= rigth_sum) & (left_sum >= cross_sum):
            return left_sum, left_high, left_sum
        elif (rigth_sum >= left_sum) & (left_sum >= cross_sum):
            return right_low, right_high, rigth_sum
        else:
            return cross_low, cross_high, cross_sum


def find_crossing(a, low, mid, high):
    max_left = 0
    max_right = 0
    left_sum = -1e308
    sum = 0
    for i in range(mid, low, -1):
        sum = sum + a[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
            max_right = 0
    right_sum = -1e308
    sum = 0
    for j in range(mid + 1, high):
        sum = sum + a[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
    return max_left, max_right, left_sum + right_sum
a = [13, -3, -25, 20, -3,- 16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
min, max, sum = find_max_subarray(a, 0, len(a))
print(min," ", max," ", sum)
« Последнее редактирование: 08 Декабря 2015, 22:48:09 от DenisVASI »

 

Страница сгенерирована за 0.019 секунд. Запросов: 22.