-
Notifications
You must be signed in to change notification settings - Fork 11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Codereview #4
base: master
Are you sure you want to change the base?
Codereview #4
Conversation
Components solution based on DFS created (fails with TS).
…ed and successfully submitted.
…created and successfully submitted.
…ith memory limit exceeded.
@@ -0,0 +1,53 @@ | |||
__author__ = 'Антон Брагин' | |||
|
|||
class Graph: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Для таких задач класс это overkill
|
||
def __init__(self, vertices, edges): | ||
""" | ||
Initialize graph object |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Коменты, дословно повторяющие код не нужны.
|
||
fn = get_permutation_number(permutation) | ||
|
||
with open('nextperm.out', 'w') as fout: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тут не нужна вложенность.
Вообще, можно и нужно делать так
with open('foo.txt') as f:
data = f.read()
print(data) # и вот тут data определенна всегда, несмотря на то, что она объявляется во вложенном блоке
Хорошо!
def is_prime(n):
some code
assert is_prime(997)
assert not is_prime(42)
assert not is_prime(1)
|
Алексей, большое спасибо за анализ и замечания! Код исправлю в соответствии с комментариями и перевыложу. Bottleneck в graphs/components.py постараюсь найти самостоятельно) Представление графа в виде массивов head, edge, next - это не совсем что-то непонятное=), эта реализация достаточно часто используется (описана, например, тут); на Java она ощутимо быстрее, чем вариант, когда для хранения списков смежности используются объекты. |
Это сомнительно. В статье head edge next сравнивалась с хранением списка смежности в виде двусвязного списка(узлы с указателями). Это не совсем честно, потому что списки тормозят сами по себе. Честнее было бы сравниваться не со списком, а с вектором(расширяющимся массивом). И в этом случае производительность была бы примерно одинаковая, при том что код был бы такой же, как и для связного списка. Так что, прежде чем говорить что что-то тормозит, надо озаботится выбором оптимального конкретного типа данных(ArrayList vs LinkedList). Другой вопрос в том, что в Java из коробки нет коллекций для примитивных типов, и ArrayList будет тормозить(возможно, но вроде мне это никогда не мешало) просто из-за boxingа. Третий вопрос заключается в выборе абстрактного типа данных для хранения "списков" =) На практике как правило хорошо использовать именно вектора, а не множества, потому что не всегда нужна операция "есть ли ребро между A и B", но у вектора константа меньше, чем у хэш сета |
И не совсем корректно тут говорить об объектах, ничто не мешает head/edge/next решение обернуть в объект с красивым интерфейсом |
На счет ощутимо быстрее действительно сомнительно. |
по памяти overhead действительно будет в любом случае, а по времени думаю что не в любом. В случае с head/edge/next расположение соседей вершины в памяти зависит от порядка, в котором добавлялись рёбра, и, вообще говоря, не будет cache-friendly. |
w = self.edge[e] | ||
|
||
if self.component[w] == -1: | ||
vertices_deque.append(w) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Хм, а не может ли тут получится, что одна вершинка добавляется в deque несколько раз?
Сделал глупый бенчмарк на Java: https://gist.github.com/matklad/3212a661cc3d6c7adca4 (2) и (3) примерно одинаковые по времени работы, (1) раза в два медленнее. |
No description provided.