Pull to refresh

Comments 9

Хорошая статья, пишите еще, например, решение задачи по сортировке пузырьком

Опять фейспалм...

Сказано про "решение далеко от идеального" и ни слова о сложности самой задачи коммивояжера! Так-то она NP-трудная. И за идеальное решение вы получите миллион долларов - решение задачи тысячилетия.

Нет ни обзора алгоритмов решения, ни указания того, что есть точные методы, приближенные и эвристические... Нет даже оценки точности решения задачи коммивояжера алгоритмом спрямления (тот самый Дейкстра), который гарантирует решение, отличающееся от оптимального не хуже, чем на 50%...

Не описано вообще ничего: ни что такое графы, ни как их можно представить...

Игнорируя, что в сети итак полно разборов этой задачи, допускаю, что начинающие C++ программисты вполне могут на Вашу статью натолкнуться и подчерпнуть, помимо, возможно, полезной (что, честно говоря, сомнительно) информации, ряд недочетов, связанных именно с языком программирования:
  • лишние включения в заголовочных файлах, которые нужны только в соответствующем *.cpp;
  • using namespace std; в заголовочном файле;
  • хардкод и магические числа (например, конструктор класса Graph);
  • возврат неконстатного указателя на данные в константном методе класса;
  • смешивание кода на языке C с кодом на C++. Если в вашем решении важно, что в одном классе используются именно массивы, а в другом подошел и std::vector, то это стоит пояснить, так как статья явно ориентирована на начинающих;
  • сложилось впечатление, что не было оценки возможного количества вершин: почему-то матрица у вас в динамической области, а путь (поле класса Path) в стеке. Если так задумано, то стоит пояснить;
  • возврат контейнеров по значению — слишком жирно и вряд ли нужно;
  • странная композиция классов, почему внутри Solution своя матрица для графа, а не поле типа Graph?
  • в конструкторе Solution присваивание просто указателя (то есть создание плоской копии). Это так задумано, что нигде деструкторов нет и поэтому работает или все-таки недоработка?
  • как это в методе Solution::Dijkstra вы создаете статический массив неизвестного размера? Раз материалы и код ориентирован на начинающих, хорошо бы, чтобы проект все же компилировался.

Даже после беглого просмотра кода (а кроме него в статье, в общем-то, ничего нет) получилось найти очевидные замечания (про стиль не стал писать, это уже более субъективно).
Еще раз хочется отметить, что наличие подобных материалов — это хорошо, потому что у тех, кто начинает изучать программирование (и в частности C++) больший выбор. Вместе с тем появляется дополнительная ответственность: не научить человека писать код неправильно.

У меня почему-то тоже названия методов типа Get_data вызывают отторжение. GetData норм. get_data тоже норм. Что не так с Get_data-ой - не понимаю.

Возможно, это отсылка к "Маленькому принцу", только тут змея съела не слона, а верблюда :)

Спасибо за комментарий! Это моя первая статья и я учту все замечания.

Это здорово, тем более, хабр предоставляет возможность редактирования (то есть их можно учесть прямо в этой статье).

... Path Solution::calc(vector<int> v, int start) ...

Какой нигодяй Вас учил передавать массив он же вектор копией?

Не прошло и 40 лет. Это же мой диплом 1983 года. Аж прослезился. Нужно сходить на https://pl1.su/ и переповторить.

Sign up to leave a comment.

Articles