Показаны сообщения с ярлыком sakod. Показать все сообщения
Показаны сообщения с ярлыком sakod. Показать все сообщения
14 января 2010
Летняя школа Microsoft про структурам данных и алгоритмам
Не могу не попиарить полезное мероприятие. Пять курсов, один интересней другого, предлагает вам послушать в середине августа в Санкт-Петербурге компания Microsoft. Не пропускайте, срок предварительной регистрации истекает через месяц, а срок подачи заявки через два.
23 июня 2009
Скромный локальный Summer of Code
Сие послание, в основном, адресовано недавно отмучавшимся с САКОДом второкурсникам.
Если кто-нибудь не знает, чем заняться летом, и не против что-нибудь такое полезное попрограммировать, то у меня есть для вас пара идей, добротная реализация которых может принести вам, как минимум, всемирную славу (это почти не шутка :). Обе связаны с программой GanttProject, с которой я вожусь на досуге.
Если кто-нибудь не знает, чем заняться летом, и не против что-нибудь такое полезное попрограммировать, то у меня есть для вас пара идей, добротная реализация которых может принести вам, как минимум, всемирную славу (это почти не шутка :). Обе связаны с программой GanttProject, с которой я вожусь на досуге.
- Хочется сделать интеграцию с Google'овским календарём и контактами. Так чтоб в GanttProject'овский проект можно было засосать коллег из контактов в качестве "ресурсов", проассоцировать проект с календарём, а задачи проекта и занятые в них "ресурсы" -- с событиями календаря и их участниками.
- Рассказываю историю:
Иван Петрович -- менеджер проекта, он управляет задачами и десятком исполнителей. То задачку создаст, то назначит кого-нибудь её выполнять. Исполнтели, допустим, такие же офисные крысы, сидят за компьютерами и шарятся вконтакте работают. Скажем, делают архитектурный и технический проект торгового центра. Ивану Петровичу хочется чтоб как только он сделает в проекте задачу "нарисовать изометрическую проекцию" и назначит на выполнение 3D-мастера Колю Синицына, то у Коли в его GanttProject'е эта задача бы появилась и Коля увидел бы что у него прибавилось работы.
В принципе, и Коля был бы доволен, если бы по окончании работы нажал на кнопку "задача выполнена" и эта информация мгновенно переслалась бы Ивану Петровичу
А ещё им хочется чтоб это всё "просто работало", без танцев с бубном вокруг какого-нибудь Exchange сервера, системы контроля версий, базы данных или ещё чего-нибудь в этом духе. Они в принципе используют электронную почту и пересылают друг другу файлы, но уже даже Колю подзадолбало отыскивать наиболее актуальную версию файла, что уж говорить про Ивана Петровича, у которого этих Коль десять штук.
Соответственно, идея: хочется чтоб в GanttProject был встроен маленький jabber клиент, который умел бы сериализовывать весь проект или его часть (одну задачу например) в читаемый текстовый вид и посылать через GMail или через QIP или через Яндекс или через локальный jabber сервер другому GanttProject'у. А тот бы полученное сообщение парсил, превращал в свои структуры и вставлял бы в проект. В совсем сказочном мире Иван Петрович просто написал бы Коле в GTalk: "Коля, сделай изометрическую проекцию, срок три часа", а Коля через три часа ответил бы "Сделано". И всё это отобразилось бы в GanttProject. Но мы увы не в сказке и подобный диалог придётся вести между машинами, а людям давать интерфейс с кнопками.
Язык разработки -- Java. Обе идеи предполагают использование сторонних библиотек и чтение документации и стороннего кода. Сроки ничем в общем-то не ограничены, но делать такие задачи дольше чем несколько недель, наверное, не стоит. Система контроля версий -- SVN. Дисциплина строгая :) Реализация должна быть качественной во всех смыслах, поэтому надо, во-первых, быть готовым писать хороший код, во-вторых, следовать стилистическим соглашениям, в-третьих, уметь выдавать код небольшими порциями, а в четвёртых, после code review каждой порции не сидеть букой ((С) не мой) а исправлять указанные недостатки. Всё как у взрослых, короче.
Добротная реализация этх вещей, повторюсь, принесёт как минимум всемирную благодарность (ибо GanttProject -- програмулина довольно таки популярная), а в материальном плане, возможно, принесёт немного денег. Золотые горы не обещаю. Но на несколько хороших книг хватит (может, книги и объявить призом?).
Кому интересно -- пишите. Общие вопросы лучше наверное задавать прям тут (чтоб всем были видны), более приватные -- по почте.
18 мая 2009
15 мая 2009
Обновление graph.zip
Очередная версия graph.zip с исправленным тестом testCycleDFS, реализацией интерфейса Paper и примитивными тестами для SearchEngine.
14 мая 2009
Разминка 14 мая
Вот вам простенький вопросик:
какое максимальное число Фибоначчи можно вычислить этим кодом?
какое максимальное число Фибоначчи можно вычислить этим кодом?
class Fibonacci { public static int f(int n) { if (n==0) { return 0; } if (n==1) { return 1; } return f(n-1) + f(n-2); }
}
- Что-то близкое к Integer.MAX_INT
- Что-то близкое к F8000
- Зависит от параметров запуска java машины
Тесты для топологической сортировки и интерфейсы для поисковика,
Обновлённый graph.zip содержит (простенькие) тесты топологической сортировки и интерфейсы для SearchEngine.
22 апреля 2009
Немного тестов BFS
Добавилось наконец-таки несколько тестов для BFS. На прежнем месте: http://barashev.net/src/graph.zip
16 апреля 2009
Занятие 16 апреля: разминка
Вопрос 1
В каком порядке будут напечатаны строки после выполнения этого кода?
1. В некотором порядке, одинаковом для любого экземпляра hs
2. В порядке, зависящем от конкретного экземпляра hs
3. В порядке добавления
4. В лексикографическом порядке
В каком порядке будут напечатаны строки после выполнения этого кода?
// HashSet -- это множество, реализованное хеш-таблицей
void test(HashSet hs) {hs.clear();for (int i=0; i<=100; i++) {
// Строковое представление числа
hs.add(String.valueOf(i));
}
// Проходим по множествуfor (Iterator i = hs.iterator(); i.hasNext();) {System.out.println(i.next());}}
1. В некотором порядке, одинаковом для любого экземпляра hs
2. В порядке, зависящем от конкретного экземпляра hs
3. В порядке добавления
4. В лексикографическом порядке
07 апреля 2009
Графы: алгоритмы
Итак, обещанные алгоритмы на графе. Минимальный джентльменский набор -- обход в ширину, обход в глубину, топологическая сортировка. Но они завёрнуты в более-менее взрослые интерфейсы: итераторы и (псевдо-)визиторы.
Итератор (Iterator), если кто не знает, это такой интерфейс, который позволяет в каком-то порядке перебрать некоторое множество элементов. Обычно у него есть методы, позволяющие получить текущий элемент и узнать, есть ли ещё непройденные элементы. Что это за множество и что это за порядок -- зависит от реализации итератора. В нашем случае множеством будет множество всех вершин графа, а порядок будет разным. В одном случае это будет порядок обходав ширину, а в другом -- порядок топологической сортировки.
Визитор (Visitor) в классическом виде -- это сложныйи практически неприменимый шаблон проектирования. У нас будет профанация визитора, представляющая собой в общем-то тот же итератор, но с вывернутой наизнанку последовательностью управления. Если при переборе итератором команды "стой! шаг вперёд! руки за голову" отдаются клиентом, а итератор их послушно исполняет, то в случае визитора всё наоборот: клиент инициирует итерирование и передаёт алгоритму объект-визитор. Итерирование идет само, без участия клиента, а при переходе к очередному элементу алгоритм вызывает методы визитора: "эй, ты, у меня тут следующий клиент -- хочешь с ним что-нибудь сделать?". Такой "визитор" называют иногда callback'ом, что на русский переводится корявой фразой "функция обратного вызова".
Архив с интерфейсами графа и алгоритмов на прежнем месте: http://barashev.net/src/graph.zip
Итератор (Iterator), если кто не знает, это такой интерфейс, который позволяет в каком-то порядке перебрать некоторое множество элементов. Обычно у него есть методы, позволяющие получить текущий элемент и узнать, есть ли ещё непройденные элементы. Что это за множество и что это за порядок -- зависит от реализации итератора. В нашем случае множеством будет множество всех вершин графа, а порядок будет разным. В одном случае это будет порядок обходав ширину, а в другом -- порядок топологической сортировки.
Визитор (Visitor) в классическом виде -- это сложный
Архив с интерфейсами графа и алгоритмов на прежнем месте: http://barashev.net/src/graph.zip
02 апреля 2009
Занятие 2 апреля: разминка
Вопрос 1.
Что делает метод hasCycle(), при условии что длина списка равна N?
Какая структура данных больше подходит для реализации обхода в ширину?
Что делает метод hasCycle(), при условии что длина списка равна N?
01: class Node {
02: Node next;
03: Object value;
04: }
05:
06: class List {
07: Node first;
08:
09: boolean hasCycle() {
10: if (first == null) return false;
11:
12: int stepCount = 1;
13: Node t1 = first;
14: Node t2 = first;
15:
16: while (true) {
17: t1 = t2;
18: stepCount *= 2;
19: for (int i = 0; i < stepCount; i++) {
20: t2 = t2.next;
21: if (t2 == null) return false;
22: if (t2 == t1) return true;
23: }
24: }
25: }
26: }
- Проверяет наличие цикла за время O(log(N))
- Проверяет наличие цикла за время O(N)
- Проверяет наличие цикла за время O(N*log(N))
- Проверяет наличие цикла за время O(N^2)
- Иногда тупо зависает в бесконечном цикле
Какая структура данных больше подходит для реализации обхода в ширину?
- FIFO
- LIFO
- GIGO
01 апреля 2009
Написание программ на родном языке является реальностью.
Вы когда-нибудь мечтали написания программ на вашем родном языке, без обучения Java, C + + и все другие вещи? Теперь вы можете. Просто введите программы на русском, китайском или любом другом человеческом языке, а также опубликовать его в Интернете. Вам даже не придется беспокоиться о правильности написания. Поиск кода Google будет автоматически переводить ваш код Английский для тех, кто не говорят Ваш родной язык.
Проверьте перевод на примерах http://google.com/codesearch и FUNNAH!
Проверьте перевод на примерах http://google.com/codesearch и FUNNAH!
28 марта 2009
24 марта 2009
Занятие 19 марта: графы
19 марта мы начали работать над графами и алгоритмами на графах. Алгоритмы будут позже, а пока что нарисовались два простеньких интерфейса для графа и вершин, которые надо реализовать.
Наш граф (интерфейс Graph) состоит из осязаемых объектов-вершин (интерфейс Vertex) и неосязаемых дуг. Граф умеет создавать вершины и отдавать список созданных. Вершина умеет создавать и удалять дуги в другие вершины и хранить произвольные свойства.
Подразумевается направленный граф, и каждая вершина умеет отдавать список вершин, в которые из нее есть исходящие дуги, но она не в курсе про входящие. Такой интерфейс легче всего реализуется списками смежности.
Интерфейсы можно скачать здесь: http://barashev.net/src/graph.zip
Тестов пока нет, будут позже. На следующем занятии работаем над простешими алгоритмами.
Наш граф (интерфейс Graph) состоит из осязаемых объектов-вершин (интерфейс Vertex) и неосязаемых дуг. Граф умеет создавать вершины и отдавать список созданных. Вершина умеет создавать и удалять дуги в другие вершины и хранить произвольные свойства.
Подразумевается направленный граф, и каждая вершина умеет отдавать список вершин, в которые из нее есть исходящие дуги, но она не в курсе про входящие. Такой интерфейс легче всего реализуется списками смежности.
Интерфейсы можно скачать здесь: http://barashev.net/src/graph.zip
Тестов пока нет, будут позже. На следующем занятии работаем над простешими алгоритмами.
19 марта 2009
Занятие 19 марта: разминка
Постройте бинарное дерево поиска из этого массива: [10, 15, 5, 12, 20, 25] и напишите результат обходов в глубину и в ширину.
На всякий случай, числа добавляются в дерево именно в таком порядке, в каком идут в массиве.
На всякий случай, числа добавляются в дерево именно в таком порядке, в каком идут в массиве.
05 марта 2009
Занятие 5 марта: разминка
Два вопроса на знание некоторых тонкостей
Вопрос 1.
Что будет напечатано в консоли после выполнения такого кода:
Вопрос 2
Что вернёт метод size() ?
Вопрос 1.
Что будет напечатано в консоли после выполнения такого кода:
class Test { String[] keys = new String[] {"key1", "key2"}; boolean find(String key) { for (int i=0; i<keys.length; i++) { if (keys[i] == key) return true; } return false; } } Test t = new Test(); if (t.find("key1")) System.out.println("key1"); if (t.find(new String("key2"))) System.out.println("key2");
Вопрос 2
Что вернёт метод size() ?
class Key { int x; int y; Key(int x, int y) { this.x = x; this.y = y; } int hashCode() { return x+y; } } HashTable t = getHashTable(); t.put(new Key(0,0), "value1"); t.put(new Key(0,0), "value2"); System.out.println(t.size());
24 февраля 2009
Первое занятие: хеш-таблицы
На первом занятии 19 февраля начали реализовывать хеш-таблицу. В нескольких словах, задача такая: "с нуля", не пользуясь никакими стандартными классами коллекций из JDK реализовать хеш-таблицу с заданным интерфейсом. Код должен проходить тесты и быть качественным.
Исходный код интерфейса и тестов скачивать тут: http://barashev.net/src/hashtable.zip
Исходный код интерфейса и тестов скачивать тут: http://barashev.net/src/hashtable.zip
19 февраля 2009
САКОД 2009. Поехали.
Где и когда.
Практика по предмету Структуры и Алгоритмы Компьютерной Обработки Данных в группе 243 проходит по четвергам на второй паре в аудиториях 2406 и 2528.
Кому.
Практика будет полезна тем, кто хочет стать хорошим программистом и кому интересно ради этого пообщаться с тем, кто им уже стал и попробовать перенять опыт и практики взрослой разработки программного обеспечения.
Что.
Будем реализовывать (писать код, ага) хм... структуры и алгоритмы :). Начнём с хеш-таблицы, а что будет дальше -- зависит от уровня подготовки и от успехов с хеш-таблицей.
Доколе.
Зачёт получает тот, кто успешно реализовывает структуры и алгоритмы. "Успешно реализовывает" означает что реализации проходят тесты и мой собственный контроль качества. Контроль серьёзный, халявы не будет, но террора тоже не будет. Будет большая польза для будущих хороших программистов.
Практика по предмету Структуры и Алгоритмы Компьютерной Обработки Данных в группе 243 проходит по четвергам на второй паре в аудиториях 2406 и 2528.
Кому.
Практика будет полезна тем, кто хочет стать хорошим программистом и кому интересно ради этого пообщаться с тем, кто им уже стал и попробовать перенять опыт и практики взрослой разработки программного обеспечения.
Что.
Будем реализовывать (писать код, ага) хм... структуры и алгоритмы :). Начнём с хеш-таблицы, а что будет дальше -- зависит от уровня подготовки и от успехов с хеш-таблицей.
Доколе.
Зачёт получает тот, кто успешно реализовывает структуры и алгоритмы. "Успешно реализовывает" означает что реализации проходят тесты и мой собственный контроль качества. Контроль серьёзный, халявы не будет, но террора тоже не будет. Будет большая польза для будущих хороших программистов.
Подписаться на:
Сообщения (Atom)