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

Формула программиста
основатель — Волосатов Евгений Витольдович
Вступай в Телеграм чат проекта | Обход блокировки
Игровой комплекс Сокобан - Введи код скидки

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

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




Хочу купить!

Купить в рассрочку за мегахеши

Цена: 800 p.


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

# Название видеоурока Решило Рейтинг Доступ
1 ArrayList 00:12:16 41 чел. ★ 5 Done
  На этом уроке мы обсудим план занятий,
вспомни былые времена голых массивов,
и выясним, зачем же нужны коллекции.
Начнём знакомство с самой простой
коллекции ArrayList и немного
поэкспериментируем с ней.

Отчёт отправил: 9263. Андрей Н. Выполнено за 15 мин. [Показать отчёт]
Научился: Узнал о существовании ArrayList, BitArray и прочих реализациях коллекций.  
Сложности: --- 
Комментарии: Поэкспериментировал с методом RemoveAt(int) - он позволяет удалить из коллекции элемент с заданным индексом. В этом как раз огромное отличие от обычного массива - в обычном массиве, чтобы удалить элемент из середины пришлось бы перемещать часть элементов вручную 
2 List 00:12:57 41 чел. ★ 5 Done
  На этом уроке мы поработаем с типизированной коллекцией List.
Обсудим её преимущества, по сравнению с ArrayList,
добавим несколько элементов, отсортируем их и даже найдём их сумму.
Перебор элементов мы организуем двумя разными способами -
через итератор и обычным foreach().
Отчёт отправил: 9263. Андрей Н. Выполнено за 15 мин. [Показать отчёт]
Научился: Усвоил простейшие приемы работы с типизированной коллекцией List<>. 
Сложности: --- 
Комментарии: Изучил метод Insert() - он позволяет вставить в коллекцию элемент в выбранную позицию. Опять же, при использовании массива нам пришлось бы вручную переместить часть элементов, коллекция же все делает сама в автоматическом режиме. 
3 Array vs List 00:11:04 40 чел. ★ 5 Done
  На этом уроке мы сравним эффективность использования
ArrayList, List<> и простого массива.
Победителем окажется типизированная коллекция List<>.
Очень интеренсо сравнивать эффективность,
нам в этом поможет флагманский класс Stopwatch.
Отчёт отправил: 9263. Андрей Н. Выполнено за 15 мин. [Показать отчёт]
Научился: Научился использовать класс Stopwatch для проведения замеров времени. 
Сложности: --- 
Комментарии: Провел эксперимент с указанием количества элементов массива и коллекции при создании, так вот типизированный List работает в этом случае примерно с такой же скоростью, что и обычный массив 
4 ListDictionary 00:15:19 40 чел. ★ 5 Done
  На этом уроке мы начнём рассматривать три класса,
которые похожи по функциональности, но очень сильно отличаются
по реализации, это: ListDictionary, Hashtable, HybridDictionary.
Эти коллекции хранят пару значений: ключ - значение.
Они нетипизированные и работают с объектами.
Отчёт отправил: 9263. Андрей Н. Выполнено за 20 мин. [Показать отчёт]
Научился: Познакомился с коллекцией "словарного" типа - ListDictionary, такие коллекции позволяют хранить совместно с элементами коллекции ключи, для доступа и поиска этих элементов, причем ключи эти тоже являются любыми наследниками object. 
Сложности: --- 
Комментарии: Отдельно познакомился с методом Remove(), в отличие от коллекций-дженериков здесь идет поиск члена коллекции по его ключу, а не номеру. 
5 Hashtable 00:11:56 39 чел. ★ 4.9 Done
  На этом уроке мы поработаем с Hashtable - каким именно
образом в неё складываются значения и почему она будет
работать, даже если хеш-функция вернёт одинаковые значения.
Также мы увидим, что порядок элементов путается,
а сами значения хранятся в очень хитром виде.
В конце урока мы сделаем всё то же самое с гибридным классом.
Самостоятельное задание: сравнить скорость работы этих коллекций.
1 этап: создать МНОГО коллекций по 8 и по 9 элементов (ОТДЕЛЬНО).
2 этап: создать ОДНУ коллекцию из ОГРОМНОГО количества элементов.
Подвести итоги и в отчёте написать вывод.
Отчёт отправил: 9263. Андрей Н. Выполнено за 25 мин. [Показать отчёт]
Научился: "Попробовал" Hashtable и HybridDictionary. 
Сложности: --- 
Комментарии: Результаты тестов на скриншоте! 
6 BitArray 00:14:00 39 чел. ★ 4.9 Done
  На этом уроке мы поработаем с интересной коллекцией BitArray,
которая позволяет компактно хранить большие массивы двоичных данных.

Отчёт отправил: 9263. Андрей Н. Выполнено за 20 мин. [Показать отчёт]
Научился: Познакомился с коллекцией BitArray. Независимо от размера коллекции, она использует 110 байт в служебных целях, поэтому если у нас до 110+4=114 элементов ее использование экономии памяти не дает, хотя тут другой вопрос - сколько накладных расходов при использовании обычного массива? 
Сложности: --- 
Комментарии: Составил таблицу истинности ф-й And, Or, Xor. 
7 Граф 00:13:48 39 чел. ★ 4.9 Done
  На этом уроке я дам определение графа своими словами,
всё, что запомнил с момента учёбы в университете.
В конце урока мы зададимся вопросом -
как хранить граф в памяти компьютера.
Отчёт отправил: 9263. Андрей Н. Выполнено за 15 мин. [Показать отчёт]
Научился: Освежил в памяти начальные сведения из теории графов.  
Сложности: --- 
Комментарии: Как вариант: List> g = new List>(); ну или даже массив массивов, например: int[][] g; F вообще, конечно, в каждой конкретной задаче нужно использовать реализацию которая подойдет конкретно к этой задаче: Например, если нам нужно хранить еще и цвет, то создаем структуру (ну или класс) "Вершина" с полями "Цвет" и "Список смежных вершин", затем создаем коллекцию этих "Вершин" 
8 Вершины 00:14:15 39 чел. ★ 4.9 Done
  На этом уроке мы начнём создавать класс Граф
для хранения графа и работы с ним.
На уроке мы создадим всё, что касается вершин.
Отчёт отправил: 9263. Андрей Н. Выполнено за 20 мин. [Показать отчёт]
Научился: Пока в общем-то ничего нового, ждем добавки :) 
Сложности: --- 
Комментарии: В текущей реализации пока не очень понятно как мы будем хранить ребра... Единственное что приходит в голову - это создать коллекцию ребер, которая будет по тому же индексу, что используется в коллекции "вершины" хранить в себе массив/коллекцию индексов вершин связанных с этой. %) 
9 Рёбра 00:12:47 38 чел. ★ 4.9 Done
  На этом уроке мы содадим колекцию для хранения рёбер.
Опишем методы добавления рёбер и перебора смежных вершин.
Отчёт отправил: 9263. Андрей Н. Выполнено за 20 мин. [Показать отчёт]
Научился: Научился создавать вложенные коллекции, их инициализировать и добавлять элементы на все уровни вложенности. Научился пользоваться созданным классом графа, добавлять в него вершины и ребра. 
Сложности: Не утонуть в обилии скобочек. 
Комментарии: Считаю, что инициализировать список ребер нужно сразу при создании вершины. С моей точки зрения это более логично, я, собственно, так и сделал. 
10 Инициация 00:11:15 38 чел. ★ 5 Done
  На этом уроке мы создадим экземпляр нашего графа
и добавим в него все его элементы по образцу.
Самостоятельное задание - вывести граф на экран.
Отчёт отправил: 9263. Андрей Н. Выполнено за 25 мин. [Показать отчёт]
Научился: Научился создавать элементы формы в процессе выполнения программы. 
Сложности: --- 
Комментарии: Ну пока сильно не заморачивался с выводом - вывел все лейблы на окружности. Будем смотреть как реализовано в уроках. 
11 Отображение 00:16:18 38 чел. ★ 5 Done
  На этом уроке мы выведем граф на экран: и вершины и рёбра.
Отчёт отправил: 9263. Андрей Н. Выполнено за 25 мин. [Показать отчёт]
Научился: Научился перебору членов коллекции, которые являются членами коллекции. 
Сложности: --- 
Комментарии: Добавил обработчик события для перерисовки ребер при необходимости. 
12 Шахматная доска 00:19:58 38 чел. ★ 5 Done
  На этом уроке мы создадим граф в виде Шахматной доски.
И организуем её вывод на экран.
Отчёт отправил: 9263. Андрей Н. Выполнено за 40 мин. [Показать отчёт]
Научился: Научился разбираться в нагромождениях кода и приводить его в хоть сколько-то читаемый вид. 
Сложности: --- 
Комментарии: Добавление ребер "шахматного" графа сделал по своему, в уроке код избыточный и неочевидный, имхо. Сделал двумя вложенными циклами, сначала проходим и добавляем горизонтальные связи, потом проходим и добавляем вертикальные связи. Обошелся вообще без условного оператора. Вообще, строго говоря, в шахматах нет ни одной фигуры, которая ходит по этому графу, например, если бы мы писали граф возможных ходов для ладьи, то, например, при положении фигуры в вершине 10 есть возможные ходы не только в 2, 9, 10 и 18, но и 26, 34, 42, 50 и т.д. 
13 Широкий поиск 00:14:59 38 чел. ★ 5 Done
  На этом уроке мы познакомимся с алгоритмом поиска вширь.
Мы проработаем весь алгоритм на конкретном примере.
Самостоятельное задание - выбрать граф и также с ним поработать.
Отчёт отправил: 9263. Андрей Н. Выполнено за 25 мин. [Показать отчёт]
Научился: Научился обходить граф вручную. 
Сложности: --- 
Комментарии: --- 
14 Широкий алгоритм 00:14:12 36 чел. ★ 5 Done
  На этом уроке мы напишем алгоритм поиска вширь.
Однако, запустить его не удастся. Почему?
Это вам самостоятельное задание, разобраться
в причине, и найти способ, как это исправить.
Отчёт отправил: 9263. Андрей Н. Выполнено за 40 мин. [Показать отчёт]
Научился: Научился реализации алгоритма поиска вширь в коде. 
Сложности: Разобраться с изменением коллекции при ее переборе. 
Комментарии: На сколько я понял, изменение коллекции при переборе не рекомендуется, в этом случае рекомендуют формировать новую коллекцию. Я примерно так и сделал, заодно и реализовал интерфейс ICloneable в нашем классе графа. Немного кривенько пока вышло, но, посмотрим, что предлагает нам следующий видеоурок. 
15 Широкий пошаговый ход 00:11:46 35 чел. ★ 5 Done
  На этом уроке мы исправишм ошибку из прошлого урока
и пройдёмся пошагово по всему алгоритму.
Отчёт отправил: 9263. Андрей Н. Выполнено за 15 мин. [Показать отчёт]
Научился: --- 
Сложности: --- 
Комментарии: Задание под звездочкой пока выполнять не стал, есть идея сделать это, используя делегаты/события, но эту тему еще не изучал, поэтому самому не просто реализовать. Посмотрю реализацию в следующем уроке. 
16 Визуализация процесса 00:14:07 30 чел. ★ 5 Done
  На этом уроке мы создадим делегат "Покраска"
и через него реализуем отображение процесса.

Отчёт отправил: 9263. Андрей Н. Выполнено за 20 мин. [Показать отчёт]
Научился: Научился использовать делегаты для выполнения определенных действий в вызывающем классе/объекте по сигналу из вызываемого класса/объекта. 
Сложности: --- 
Комментарии: --- 
17 Глубокий поиск 00:09:58 30 чел. ★ 5 Done
  На этом уроке мы познакомимся с алгоритмом поиска вглубь.
Мы проработаем весь алгоритм на конкретном примере.
Самостоятельное задание - выбрать граф и также с ним поработать.
Отчёт отправил: 9263. Андрей Н. Выполнено за 15 мин. [Показать отчёт]
Научился: Обходу графа по алгоритму поиска вглубь. 
Сложности: --- 
Комментарии: --- 
18 Глубокий алгоритм 00:15:07 30 чел. ★ 5 Done
  На этом уроке мы напишем алгоритм поиска вглубь.
Вернее сказать - скопипастим. И пофилософствуем.
На этом же уроке посмотрим, как он работает.
Отчёт отправил: 9263. Андрей Н. Выполнено за 20 мин. [Показать отчёт]
Научился: Научился реализации алгоритма поиска вглубь в коде, а также познакомился с очередной коллекцией - стеком (Stack). 
Сложности: --- 
Комментарии: При закрашивании лейбла, достаточно рефрешить только его, а не целиком панель или форму, тогда не будет мерцания и отпадет необходимость в перерисовке ребер, да и работать будет всё немножко быстрее. Как показывал в своем отчете у меня свой алгоритм добавления ребер на шахматной доске, поэтому алгоритм перебирает чуть в другой последовательности. 
19 ФИНАЛЬНЫЙ УРОК 30 чел. ★ 5 Done
  Поздравляю с окончанием курса!
Оставь отзыв об этом курсе.

Какой курс ты будешь проходить следующим?
Отчёт отправил: 9263. Андрей Н. Выполнено за 5 мин. [Показать отчёт]
Научился: Курс в целом очень полезный. В первую очередь из-за знакомства со списками/коллекциями, на самом деле это такая нужная "обыденная" вещь, без которой ни один более-менее средний (про большие уж не говорю) не обходится, поэтому знать и уметь пользоваться нужно обязательно. Ну и как бонус курса - знакомство с графами и алгоритмами их обхода вширь и вглубь. 
Сложности: --- 
Комментарии: Курс очень понравился, здесь не было чего-то особо запутанного и сложного для понимания. Единственное замечание - это автор немного "перемудрил" с алгоритмом добавления ребер на графе шахматной доски, но я реализовал свой алгоритм, поэтому для меня это не минус. 
  Итого:   19 видеоуроков общей продолжительностью 4 час. 06 мин. 30 чел. ★ 4.98  
  Финалисты:   Максим,   Alcatraz,   Дмитрий,   Tekashnik,   Denis,   Иван,   Дмитрий 199,   Николай,   Михаил,   Дмитрий,   Ender,   Платон,   Владимир,   Андрей Н.,   Владимир Борисенко,   Максим Лапшинов,   Permitin Alexey,   Новопашин Владимир,   Максим Саратов,   Алексей В.,   Den Andreevich,   Елена,   Станислав,   Сергей Соколов,   Yefim,   Алексей Малышев,   Александр,   Сергей,   Денис,   chokayes .

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




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

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

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

Ты в любой момент сможешь отписаться от рассылки.


Хочется поблагодарить за вебинар, то есть два. Крайне полезные классы были рассмотрены. Материала было вбухано хорошо)) И Евгений Витольдович всегда пойдёт навстречу, будем дальше посещать такие мероприятия, всем рекомендую)


Научился: Познакомился со многими понятиями про которые и не слышал. Все было для меня ново. Конечно Я не программист и доп задания выполнял по возможности. Но прошел этот курс с большим интересом.
Трудности: Поиск ошибок уроками был не легким. Некоторое так и не вышло. разобратся так и не удалось, даже через дебаг.
Конечно Я не программист и доп задания выполнял по возможности. Но прошел этот курс с большим интересом.