Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 23.05.2013
Сообщений: 17

Как оптимизировать по памяти решение по сортировке дуг графа?

07.10.2013, 00:34. Показов 1540. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
короче все началось с того что я решал

задачу
Ориентированный взвешенный граф задан перечнем дуг (ориентированных рёбер). Отсортировать эти дуги по возрастанию длин, сохранив (в дополнительных полях) номера этих дуг во входных данных.

Входные данные

Первая строка содержит количество вершин N ( 2 ≤ N ≤ 30000 ) и количество дуг (ориентированных рёбер) M ( 1 ≤ M ≤ 123456 ). Каждая из последующих M строк содержит ровно три целых числа u , v и len — начало, конец и длину дуги. 1 ≤ u , v ≤ N , u ≠ v , 1 ≤ len ≤ 109 . Гарантированно, что дл и ны всех дуг различны.

Выходные данные

Результат должен содержать M строк по четыре целых числа u , v , len , idx в каждой — начало, конец, длину дуг и , и её номер во входных данных (нумерация с единицы). При этом д у ги должны быть отсортированы по возрастанию длин.

Примеры
Входные данные

3 4
3 2 4
3 1 8
1 2 14
1 3 2

Выходные данные

1 3 2 4
3 2 4 1
3 1 8 2
1 2 14 3



вот таким способом
Python
1
2
3
4
    n, m = list(map(int, input().split()))
    f = [input().split() + [i + 1] for i in range(m)]
    for i in sorted(f, key=lambda x: int(x[2])):
        print(i[0], i[1], i[2], i[3])
и получил ответ что на последнем тесте моя программа превышает максимально допустимый объем памяти (64 мб)
Вопрос: как можно оптимизировать мою программу или дайте верную идею для решения задачи (хотя бы ссилку на обсуждение подобной проблемы)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2013, 00:34
Ответы с готовыми решениями:

Построение графа по списку дуг
Здравствуйте! Задание: Ориентированный граф, множество вершин V={1,2,..7}, список дуг ...

Списки смежности дуг ориентированного графа
По заданию нужно представить орграф списками смежности дуг, вида {LIST}^{+}_{b},{LIST}^{-}_{b},{LIST}^{+}_{B},{LIST}^{-}_{B}, но, к...

Проверка на ацикличность ориентированного графа с весами дуг
Граф задан матрицей смежности. Т.е. матрица имеет значения только выше главной диагонали. Мы имеем: Саму матрицу смежности с весами...

11
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.10.2013, 01:54
попробуй так, только sorted() заменил, так как она создаёт второй список

Python
1
2
3
4
5
6
def f():
    n, m = map(int, input().split())
    lst = [input().split() + [i] for i in range(1, m + 1)]
    lst.sort(key=lambda i: int(i[2]))
    for i in lst:
        print(*i)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> def f():
...     n, m = map(int, input().split())
...     lst = [input().split() + [i] for i in range(1, m + 1)]
...     lst.sort(key=lambda i: int(i[2]))
...     for i in lst:
...         print(*i)
... 
>>> f()
3 4
3 2 4
3 1 8
1 2 14
1 3 2
1 3 2 4
3 2 4 1
3 1 8 2
1 2 14 3
>>>
1
0 / 0 / 0
Регистрация: 23.05.2013
Сообщений: 17
07.10.2013, 09:34  [ТС]
Ни помогло
Я тут подумал, я считываю входные данные у виде строк функцией input() нельзя ли сразу считывать данные как целые числа? Они и по памяти меньше будут занимать чем строки
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
07.10.2013, 12:43
Можно input, обернуть в eval, но не уверен, что поможет и такой ход очень не рекомендуется использовать из-за соображений безопасности. Потому что она принимает строку и воспроизводит ее как выражение Python.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.10.2013, 19:11
Цитата Сообщение от rm -rf Посмотреть сообщение
Они и по памяти меньше будут занимать чем строки
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> import operator
>>> 
>>> def f():
...     n, m = map(int, input().split())
...     lst = [tuple(map(int, input().split())) + (i,) for i in range(1, m + 1)]
...     lst.sort(key=operator.itemgetter(2))
...     for i in lst:
...         print(*i)
... 
>>> f()
3 4
3 2 4
3 1 8
1 2 14
1 3 2
1 3 2 4
3 2 4 1
3 1 8 2
1 2 14 3
>>>
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
08.10.2013, 13:37
Сразу считать файл в числа можно с помощью numpy, loadtxt или genfromtxt.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
08.10.2013, 13:58
rm -rf, кстати можно использовать генераторы, они память мало засоряют
0
 Аватар для Wolkodav
842 / 480 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
08.10.2013, 16:58
rm -rf, map выкиньте, попробуйте циклом обычным, может прокатит...
0
42 / 42 / 7
Регистрация: 15.07.2012
Сообщений: 98
08.10.2013, 17:57
rm -rf, плюсую tsar925, генераторы - хорошая идея, если влом руками писать - есть itertools.imap
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
08.10.2013, 20:44
Цитата Сообщение от s0rg Посмотреть сообщение
если влом руками писать - есть itertools.imap
у него и так третий питон, там нет itertools.imap, потому что он перенесён в ядро

Добавлено через 1 минуту
а то, что у него третий питон, следует из
Python
1
print(*i)
во втором питоне это не работает
Python
1
2
3
4
5
6
>>> print(*'abc')
  File "<stdin>", line 1
    print(*'abc')
          ^
SyntaxError: invalid syntax
>>>
Добавлено через 1 минуту
Цитата Сообщение от s0rg Посмотреть сообщение
генераторы - хорошая идея
ему нужен список, чтобы сортировать его, генератор ты не отсортируешь
0
0 / 0 / 0
Регистрация: 23.05.2013
Сообщений: 17
09.10.2013, 12:53  [ТС]
Вариант accept и вариант с генераторами действительно расходуют меньше памяти, но теперь не проходят по времени (лимит 1 секунда)
0
0 / 0 / 0
Регистрация: 23.05.2013
Сообщений: 17
12.10.2013, 01:46  [ТС]
Узнал тут такую информацию от преподавателя, что возможно результаты измерения памяти которую использует программа неверны
и виновата в этом тестовая программа которая это делает.
На такие мысли навела такая проверка
Python
1
2
3
4
5
6
7
import sys
import random
arr = [tuple(random.randrange(1000000000) for i in range(4)) for j in range(123456)]
size = 0
for i in arr:
    size += sys.getsizeof(i)
print(size)
Результат был 4938240 b = 4.70947265625 Mb, а это как видите не 64 Mb
P.S. цифры в в коде взяты из условия задачи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2013, 01:46
Помогаю со студенческими работами здесь

Есть ли возможность в C# рисования направленных дуг для графа?
Есть ли возможность в C# рисования направленных дуг для графа? Или все таки -нет и следует реализовать дугу как три линии?

Докажите, что число дуг графа, смежного к G, равно
Докажите, что число дуг графа, смежного к G, равно \sum {deg}^{2}({a}_{i})-2q

Реализация ввода весов(значений) рёбер(дуг) у графа
Проект, который строит графы и находит от одной вершины кратчайшие пути до других. Возникла необходимость сделать ввод весов рёбер (то...

Найти пути графа с наименьшим числом дуг и кратчайшей длины.
Помогите пож по дискретной математике: найти пути с наименьшим числом дуг и кратчайшей длины ...

Как оптимизировать потребление памяти?
Что можно отключить? Как вообще оптимизировать нагрузки?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru