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

Формула программиста
основатель — Волосатов Евгений Витольдович

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

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




3,000 руб.


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

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

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

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




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

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

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

Ты в любой момент сможешь отписаться от рассылки.
Научился: Ничему.
Трудности: Микрофон как всегда лагал.
Супер курс - очень интересный и помог в решении пары задач.
Смотреть видеозапись: https://youtu.be/7KVxnZrHA60
Научился: Стал лучше разбираться в коллекциях C#. Алгоритмы поиска на графах могу пройти вручную без компьютера ;)
Трудности: Не все получалось с первого раза, были ошибки и озарения.
Курс очень понравился своей проработанностью и вниманием к деталям, теперь я уверенно буду использовать коллекции наряду с массивами. Очень рекомендую этот курс всем кто хочет разбираться в сложных структурах данных. Очень понравилась визуализация! Спасибо за так великолепно поданный, не очень простой материал, узнал много нового, а алгоритмы поиска имеют очень много применений!