Курсы по программированию

Формула программиста
основатель — Волосатов Евгений Витольдович
Большой Новогодний подарок от Игромистра
Безденежный доступ к видеокурсам за Мегахеши
Вебинар «Предновогодние обещания» начнётся через 16 час. 32 мин.

Коллекция графа

Мы рассмотрим основные коллекции в языке C#.
Поэкспериментируем с ними, сравним их быстродействие.
Далее, познакомимся с теорией графов. Создадим класс
для представления графа в памяти компьютера.
Сделаем визуальное отображения графа и
составим алгоритмы поиска вширь и глубь,
с использованием коллекций Стек и Очередь.




Хочу купить!

800 p.


Для подписки на пакет необходимо авторизоваться.

Список уроков | фото | видео

# Название видеоурока Решило Рейтинг Доступ
1 ArrayList 00:12:16 38 чел. ★ 4.9 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 15 мин. [Показать отчёт]
Научился: Узнал о существовании ArrayList, BitArray и прочих реализациях коллекций.  
Сложности: --- 
Комментарии: Поэкспериментировал с методом RemoveAt(int) - он позволяет удалить из коллекции элемент с заданным индексом. В этом как раз огромное отличие от обычного массива - в обычном массиве, чтобы удалить элемент из середины пришлось бы перемещать часть элементов вручную 
2 List 00:12:57 38 чел. ★ 4.9 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 15 мин. [Показать отчёт]
Научился: Усвоил простейшие приемы работы с типизированной коллекцией List<>. 
Сложности: --- 
Комментарии: Изучил метод Insert() - он позволяет вставить в коллекцию элемент в выбранную позицию. Опять же, при использовании массива нам пришлось бы вручную переместить часть элементов, коллекция же все делает сама в автоматическом режиме. 
3 Array vs List 00:11:04 37 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 15 мин. [Показать отчёт]
Научился: Научился использовать класс Stopwatch для проведения замеров времени. 
Сложности: --- 
Комментарии: Провел эксперимент с указанием количества элементов массива и коллекции при создании, так вот типизированный List работает в этом случае примерно с такой же скоростью, что и обычный массив 
4 ListDictionary 00:15:19 37 чел. ★ 4.9 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 20 мин. [Показать отчёт]
Научился: Познакомился с коллекцией "словарного" типа - ListDictionary, такие коллекции позволяют хранить совместно с элементами коллекции ключи, для доступа и поиска этих элементов, причем ключи эти тоже являются любыми наследниками object. 
Сложности: --- 
Комментарии: Отдельно познакомился с методом Remove(), в отличие от коллекций-дженериков здесь идет поиск члена коллекции по его ключу, а не номеру. 
5 Hashtable 00:11:56 36 чел. ★ 4.9 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 25 мин. [Показать отчёт]
Научился: "Попробовал" Hashtable и HybridDictionary. 
Сложности: --- 
Комментарии: Результаты тестов на скриншоте! 
6 BitArray 00:14:00 36 чел. ★ 4.9 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 20 мин. [Показать отчёт]
Научился: Познакомился с коллекцией BitArray. Независимо от размера коллекции, она использует 110 байт в служебных целях, поэтому если у нас до 110+4=114 элементов ее использование экономии памяти не дает, хотя тут другой вопрос - сколько накладных расходов при использовании обычного массива? 
Сложности: --- 
Комментарии: Составил таблицу истинности ф-й And, Or, Xor. 
7 Граф 00:13:48 36 чел. ★ 4.9 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 15 мин. [Показать отчёт]
Научился: Освежил в памяти начальные сведения из теории графов.  
Сложности: --- 
Комментарии: Как вариант: List> g = new List>(); ну или даже массив массивов, например: int[][] g; F вообще, конечно, в каждой конкретной задаче нужно использовать реализацию которая подойдет конкретно к этой задаче: Например, если нам нужно хранить еще и цвет, то создаем структуру (ну или класс) "Вершина" с полями "Цвет" и "Список смежных вершин", затем создаем коллекцию этих "Вершин" 
8 Вершины 00:14:15 36 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 20 мин. [Показать отчёт]
Научился: Пока в общем-то ничего нового, ждем добавки :) 
Сложности: --- 
Комментарии: В текущей реализации пока не очень понятно как мы будем хранить ребра... Единственное что приходит в голову - это создать коллекцию ребер, которая будет по тому же индексу, что используется в коллекции "вершины" хранить в себе массив/коллекцию индексов вершин связанных с этой. %) 
9 Рёбра 00:12:47 35 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 20 мин. [Показать отчёт]
Научился: Научился создавать вложенные коллекции, их инициализировать и добавлять элементы на все уровни вложенности. Научился пользоваться созданным классом графа, добавлять в него вершины и ребра. 
Сложности: Не утонуть в обилии скобочек. 
Комментарии: Считаю, что инициализировать список ребер нужно сразу при создании вершины. С моей точки зрения это более логично, я, собственно, так и сделал. 
10 Инициация 00:11:15 35 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 25 мин. [Показать отчёт]
Научился: Научился создавать элементы формы в процессе выполнения программы. 
Сложности: --- 
Комментарии: Ну пока сильно не заморачивался с выводом - вывел все лейблы на окружности. Будем смотреть как реализовано в уроках. 
11 Отображение 00:16:18 35 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 25 мин. [Показать отчёт]
Научился: Научился перебору членов коллекции, которые являются членами коллекции. 
Сложности: --- 
Комментарии: Добавил обработчик события для перерисовки ребер при необходимости. 
12 Шахматная доска 00:19:58 35 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 40 мин. [Показать отчёт]
Научился: Научился разбираться в нагромождениях кода и приводить его в хоть сколько-то читаемый вид. 
Сложности: --- 
Комментарии: Добавление ребер "шахматного" графа сделал по своему, в уроке код избыточный и неочевидный, имхо. Сделал двумя вложенными циклами, сначала проходим и добавляем горизонтальные связи, потом проходим и добавляем вертикальные связи. Обошелся вообще без условного оператора. Вообще, строго говоря, в шахматах нет ни одной фигуры, которая ходит по этому графу, например, если бы мы писали граф возможных ходов для ладьи, то, например, при положении фигуры в вершине 10 есть возможные ходы не только в 2, 9, 10 и 18, но и 26, 34, 42, 50 и т.д. 
13 Широкий поиск 00:14:59 35 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 25 мин. [Показать отчёт]
Научился: Научился обходить граф вручную. 
Сложности: --- 
Комментарии: --- 
14 Широкий алгоритм 00:14:12 34 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 40 мин. [Показать отчёт]
Научился: Научился реализации алгоритма поиска вширь в коде. 
Сложности: Разобраться с изменением коллекции при ее переборе. 
Комментарии: На сколько я понял, изменение коллекции при переборе не рекомендуется, в этом случае рекомендуют формировать новую коллекцию. Я примерно так и сделал, заодно и реализовал интерфейс ICloneable в нашем классе графа. Немного кривенько пока вышло, но, посмотрим, что предлагает нам следующий видеоурок. 
15 Широкий пошаговый ход 00:11:46 33 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 15 мин. [Показать отчёт]
Научился: --- 
Сложности: --- 
Комментарии: Задание под звездочкой пока выполнять не стал, есть идея сделать это, используя делегаты/события, но эту тему еще не изучал, поэтому самому не просто реализовать. Посмотрю реализацию в следующем уроке. 
16 Визуализация процесса 00:14:07 28 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 20 мин. [Показать отчёт]
Научился: Научился использовать делегаты для выполнения определенных действий в вызывающем классе/объекте по сигналу из вызываемого класса/объекта. 
Сложности: --- 
Комментарии: --- 
17 Глубокий поиск 00:09:58 28 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 15 мин. [Показать отчёт]
Научился: Обходу графа по алгоритму поиска вглубь. 
Сложности: --- 
Комментарии: --- 
18 Глубокий алгоритм 00:15:07 28 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 20 мин. [Показать отчёт]
Научился: Научился реализации алгоритма поиска вглубь в коде, а также познакомился с очередной коллекцией - стеком (Stack). 
Сложности: --- 
Комментарии: При закрашивании лейбла, достаточно рефрешить только его, а не целиком панель или форму, тогда не будет мерцания и отпадет необходимость в перерисовке ребер, да и работать будет всё немножко быстрее. Как показывал в своем отчете у меня свой алгоритм добавления ребер на шахматной доске, поэтому алгоритм перебирает чуть в другой последовательности. 
19 ФИНАЛЬНЫЙ УРОК 28 чел. ★ 5 Done
  Отчёт отправил: 9263. Андрей Н. Решено за 5 мин. [Показать отчёт]
Научился: Курс в целом очень полезный. В первую очередь из-за знакомства со списками/коллекциями, на самом деле это такая нужная "обыденная" вещь, без которой ни один более-менее средний (про большие уж не говорю) не обходится, поэтому знать и уметь пользоваться нужно обязательно. Ну и как бонус курса - знакомство с графами и алгоритмами их обхода вширь и вглубь. 
Сложности: --- 
Комментарии: Курс очень понравился, здесь не было чего-то особо запутанного и сложного для понимания. Единственное замечание - это автор немного "перемудрил" с алгоритмом добавления ребер на графе шахматной доски, но я реализовал свой алгоритм, поэтому для меня это не минус. 
  Итого:   19 видеоуроков общей продолжительностью 4 час. 06 мин. 28 чел. ★ 4.97  
  Финалисты:   Максим,   Alcatraz,   Дмитрий,   Tekashnik,   Denis,   Иван,   Дмитрий 199,   Николай,   Михаил,   Дмитрий,   Ender,   Платон,   Владимир,   Андрей Н.,   Владимир Борисенко,   Максим Лапшинов,   Permitin Alexey,   Новопашин Владимир,   Максим Саратов,   Алексей В.,   Den Andreevich,   Елена,   Станислав,   Сергей Соколов,   Yefim,   Алексей Малышев,   Александр,   Сергей .

Начинаем практику по языку C#




Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.
Научился: всё хорошо, что хорошо заканчивается (:
Курс очень понравился, заставил поскрипеть извилинами, впрочем как и курс Комбинаторики. Открул для себя что такое граф, как с ним работать и 2 эффективных алгоритма обхода графа, вширь и вглубь Спасибо за курс. Дальше по пути курс Бурные потоки
Научился: Узнал, что есть еще коллекции, кроме листа. Научился писать алгоритмы поиска по графу вширь и вглубь
Трудности: Ничего сложного, всё просто и понятно
Очень понравился курс, всё доходчиво и интересно