Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задание при приеме на работу, только не подумайте что это просто :) 
:(
    Опции темы
Anikmar
Дата 18.1.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Если судить по примеру вывода после разбора - то все-таки там дерево, а не граф. Этот вопрос принципиальный с точки зрения вывода: показанный пример выводит дерево. А как выводить граф?
PM MAIL ICQ   Вверх
Void
Дата 18.1.2007, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Связный граф без циклов и есть дерево.
Если есть циклы — надо сообщить об этом без вывода зависимостей, я так понял.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Mayk
Дата 18.1.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Void @  18.1.2007,  21:14 Найти цитируемый пост)

Если есть циклы — надо сообщить об этом без вывода зависимостей, я так понял.

В примере nickless'а выше[A->{B C}->D на языке dot]  циклических зависимостей как раз и нет. Потому как D зависит от B и C, B зависит от A и C зависит от A. и других зависимостей нет.
нет цикла. граф здесь ориентированный, и это надо учитывать.
я безсовестно заменил в примере графа длинные названия ItemN... на A...

Добавлено @ 17:43 
Кстати, если под "выводом зависимостей на экран" подразуметь (подобно tsort(1)) 
Код

\forall K,L Если элемент K зависит от L, то элемент L будет выведен перед элементом K

и забить на красивые отступы, то эта самая топологическая сортировка как раз даст искомый результат, то у nickless'овского графа A->{B C}->D будет два валидных выхода:
Код

Α
Β
С
D

и
Код

A
C
B
D




Это сообщение отредактировал(а) Mayk - 18.1.2007, 17:46


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 18.1.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Честно говоря, мне не видится эта задача слишком сложной с точки зрения создания самой структуры зависимостей.

Но пост Maykа как раз о той проблеме, которую я вижу: как это правильно вывести, если один потомок зависит от двух предков сразу? Или данная ситуация считается ошибочной? Если немного расширить исходные данные:
A B C D
B E F
C E F

То как это должно быть выведено?
A
 B
  E <--- Т.е. по два раза вывести? Или это ошибочные данные
  F <---
 C
  E <---
  F <---
 D

 Или надо так вывести (полный бред по-моему)
A
 B C
  E F

Не совсем понятны условия.

Если это обычное дерево - то не намного сложнее дерева подкаталогов получится 
PM MAIL ICQ   Вверх
Дмитрий Т
Дата 22.1.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.3.2005
Где: Самара

Репутация: 4
Всего: 4



Цитата(codelord @ 18.1.2007,  00:28)
Критерии оценки программы (все критерии равнозначны):
3.    Понятность кода.
4.    Возможность повторного использования.

Чтоб выполнить эти пункты логику программы, думаю, надо основвывать на паттерне "Composite" (Компоновшик) (см. книгу четырёх "Design Patterns. Elements of Reusable Object-Oriented Software.", есть на русском). Это не только прояснит логику, но и к тому же сразу скажет проверющему о хорошей квалификации программиста. Было бы время, я бы с удовольствием наваял решение. Хорошая задачка smile
PM MAIL WWW ICQ Skype   Вверх
SerpentVV
Дата 22.1.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

Репутация: 1
Всего: 1



Цитата(nickless @  17.1.2007,  23:43 Найти цитируемый пост)
Наверно просто надо чтобы человек _сам_ парсер написал, а не использовал что-то вроде lex+bison  

Дело не в написании парсера... Файл читается вполне стандартными средствами - оператором >> в строковые переменные.
Дело именно в логике...
Но логика тож не сильно сложная...
Так как скорость в качестве критерия не фигурирует (видимо не случайно), то нужно использовать стандартный список list из STL
list<string> children - это список детей...
struct element
{ string родитель;
   list<string> children;
}
list<element> tree; // фактически список-списков...
После прочтения файла он просто выводится на экран в цикле...


Для отслеживания циклических связей досточно проверять каждого дитятю на совпадение с родителем...
Алгоритм скорости вроде O(n^2)

PM MAIL   Вверх
SaDFromSpb
Дата 22.1.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



codelord, 
Готовь тесты, чтобы убедиться в работоспособности =) Мож найдется время вечерком - напишу чего-нить.

Добавлено @ 19:28 
Так действительно интересно, сколько давалось на эту задачку времени?


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
SaDFromSpb
Дата 28.1.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Блин, времени вообще выделить не могу на это дело. Сейчас на работе полный аврал, плюс диплом доделывать надо. Единственное сложное и интересное место в этой задаче - это сортировка частично упорядоченного множества (упорядоченность заключается в правилах "кто чей родитель"). 
Ее алгоритм мы в универе давно еще проходили. Могу быстренько накидать, если нужно.


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Rockie
Дата 29.1.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



imho это замыкание множества атрибутов над множеством функциональных зависимостей, алгоритм из области реляционных баз данных.
Цитата

Алгоритм CLOSURE ищет в F функциональную зависимость левая сторона которой содержится во множестве Xi. Если существует такая функциональная зависимость, тогда к Xi присоединяются атрибуты из правой части функциональной зависимости. В противном случае X+ равно текущему множеству Xi.
Алгоритм CLOSURE строит замыкание множества атрибутов относительно множества функциональных зависимостей.

Цитата

CLOSURE (F, X, X+)
Input: F – мфз над схемой R; X – множество атрибутов X ≤ R;
Output: X+ - замыкание множества
Begin
    i:=0;  Xi := X;
    repeat
  i:=i+1;  Xi =Xi-1;
  For all V→W in F
    if V ≤ Xi then Xi := Xi U W;
    until Xi = Xi-1;
    return (X+ = Xi);
End.


к примеру имеем множество функциональных зависимостей:
A->D
AB->E
BF->E
CD->F
E->C

находим замыкание для множества атрибутов:
AE

Получаем:
{AE, AEDC, AEDCF}

Вроде так, если ничего не напутал.

codelord, где-то валяются исходники, но к сожалению на Delphi. если нужно - стучи в ПМ.

p.s.: imho странноватое тестовое задание. std::set + рутина, особые знания языка или ООП  такое задание не покажет, зато напрягает большое кол-во требований по интерфейсу(в какой строке ошибка и т.п., требование к возможности реутилизации кода). imho надо быть осторожней с этим работодателем. 




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
SerpentVV
Дата 30.1.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

Репутация: 1
Всего: 1



Если используется стандартные контейнеры, то STL уже имеет нужные сортировки... Нужно просто использовать...

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.