timeit

Програмиране с Python

Курс във Факултета по Математика и Информатика към СУ

Трета задача

  1. При достигане на лимита публикации коя се маха? Най-старата по час на създаване, или най-старата по ред на добавяне? Edit: всъщност е един и същ реда, игнорирайте въпроса.

    followers и following set ли връщат, или каквото и да е итеруемо? Какво представлява нивото от приятели? Ако някой е приятел на подадения потребител, то той ще е на първо ниво, защото по дефиниция подадения го следва. Ако някой не бива следван от подадения, то той ще е някъде по-надолу в дървото(ако въобще е в него) и няма как да му бъде приятел по дефиниция. Следователно има приятели само на първо ниво и няма никъде другаде.

  2. followers и following set ли връщат, или каквото и да е итеруемо?

    Каквото и да е итеруемо. Аз все пак бих използвал set при положение, че си говорим за множества.

    Какво представлява нивото от приятели? Ако някой е приятел на подадения потребител, то той ще е на първо ниво, защото по дефиниция подадения го следва. Ако някой не бива следван от подадения, то той ще е някъде по-надолу в дървото(ако въобще е в него) и няма как да му бъде приятел по дефиниция. Следователно има приятели само на първо ниво и няма никъде другаде.

    Така е. Този метод има смисъл само, ако всички потребители се следват взаимно.

    Нека го променим до:

    nth_layer_followings(self, user_uuid, n)

    Връща всички потребители следени от потребителя с подаденото user_uuid на разстояние n.

    Пример:

    >>> graph.follow(maria.uuid, ivan.uuid)
    >>> graph.follow(ivan.uuid, pesho.uuid)
    >>> list(graph.nth_layer_followings(maria.uuid, 2))
    <<< [pesho.uuid]
    

    Обновено е и условието на задачата с тази промяна.

  3. А какво правим ако един потребител се намира на повече от 1 ниво? Примерно ако имаме следните отношения:

    graph.follow(maria.uuid, ivan.uuid)

    graph.follow(maria.uuid, pesho.uuid)

    graph.follow(ivan.uuid, pesho.uuid)

    list(graph.nth_layer_followings(maria.uuid, 2))

    Трябва ли изходът тук да е [pesho.uuid]? Тъй като pesho е и 1-во и 2-ро ниво на следене от maria.

    • max_distance - Намира разстоянието до най-отдалечения потребител от потребителя с user_uuid в неговата свързана компонента. това са всички потребители и във following, и във followers, нали? А ако потребителят не следи и не е следен, 0 ли да върнем?

    • nth_layer_followings(self, user_uuid, n) Връща всички потребители следени от потребителя с подаденото user_uuid на разстояние n. ще имаме да търсим във following на всички, които има потребителя за following и тн. по веригата?

  4. Т.е. не ни интересува дали потребител е достигнат вече от по-долно ниво, а си гледаме само зададеното?

    Да.

    max_distance - Намира разстоянието до най-отдалечения потребител от потребителя с user_uuid в неговата свързана компонента. това са всички потребители и във following, и във followers, нали?

    Не. Все пак си говорим за ориентиран граф. Ако има Иванчо следва Марийка то разстоянието от Иванчо до Марийка е 1. Път от Марийка до Иванчо няма.

    А ако потребителят не следи и не е следен, 0 ли да върнем?

    Ами технически погледнато, в такъв случай разстоянието е безкрайност. В Python това ще рече math.inf.

  5. Здравейте, искам да попитам за max distance.Ако някой потребител се намира например на разстояние 2 и на разстояние 10 от user_uuid разстоянието 10 взима ли се под внимание и ако да, при наличието на цикъл максималното разстояние не е ли безкрайност?

  6. @Александрина за max_distance потребителите се проверяват само по веднъж при най-близкото си срещане, което като бонус ще елиминира възможността за цикли, а за nth_layer_followings е важно дали го има на конкретния, независимо от присъствието му по-нагоре.

  7. За max_distance, както Десислава пита, ако подаденият не следва никого, math.inf ли да връщаме, или 0(по-логично ми се струва), или някакво друго

    Връщайте math.inf.

    Възможно ли е потребител да следва себе си на разстояние >= 2? Т.е. , ако имаме цикъл трябва ли да изключваме началния потребител от резултата?

    Не. Потребител не следва себе си. Всъщност е добра идея да се хвърля изключение, ако бъде направен опит от типа graph.follow(foo.uuid, foo.uuid). Оставям на вас да изберете най-подходящото такова.

    edit: С цел да избегна объркване и да оставим впечатление за неотговорени въпроси напомням:

    Ако видите отговор със жълт фон на зададен въпрос от ваш колега (или от вас самите), това ще рече, че някой от екипа е прегледал този отговор и е потвърдил неговата коректност. С други думи, разглеждайте тези отговори като отговори дадени от нас (екипа зад курса).

  8. Потребител не може да следва себе си, но ако имаме A -> B -> A, не се ли следва на второ ниво? Т.е. да го махнем от резултата? + тук няма как да има изключение :d

    ПП. Ники, ето за проектите от миналата година какво е имало: http://2015.fmi.py-bg.net/tasks/4

    На руби курса предния семестър също ни бяха дали разни съвети, не знам до колко е релевантно, но: https://github.com/fmi/ruby-course-guides/blob/master/course_projects.md

  9. Още веднъж за слоевете (дано да е по-ясно и вярно): ако имаме входен потребител А и цикъл A -> B -> A спираме при първото срещане на А извън началното "състояние" и отговора зависи от това къде сме спрели, ако е на желания слой - връщаме контейнер от потребителите на него, но ако сме спрели по-рано контейнерът ще е празен. Ако, обаче, цикълът не включва А: А -> В -> С -> В, то тогава оставаме в него до достигане на слоя и тогава се връща контейнера.

    Тези случаи, обаче, са прости. Може ли някой от екипа да разясни какво ще случи тук: Mad pain skills

    При търсене на ниво по-дълбоко от 3 какво ще стане? Търсенето по клона, който се връща към А се прекратява, а останалите продължават? Тогава резултатите ще бъдат 1: [B, E]; 2: [C, F]; 3: [D, E]; останалите четни нива: [F]; останалите нечетни нива: [E]. А ако се подаде ниво 0 какво се очаква, както и при несъществуващо ниво?

  10. Какво се случва, ако на min_distance подадем едно и също uuid?

    Не трябва ли nth_layer_followings на n-ти слой да връща потребители, които са на растояние n от подадения? Например в примера на Тодор: 1: {B, E} 2: {C, F} 3: {D} >=4: {}. Също така какво трябва да стане ако на nth_layer_followings подадем 0?

    • Ако подадем едно и също uuid на min_distance, връщаме 0

    • Ако подадем 0 на nth_layer_followinds, то ще очакваме да върнете празна колекция

    • Николай е прав за примера нарисуван от Тодор, когато стигнем до вече посетен връх спираме обхождането

  11. Последно, ако има път от А до Б и В, както и от Б до В, трябва ли В да влиза във втория слой на А, въпреки че го има и на първия (както пише в един от жълтите постове) или връх Х е в слой n на У само ако минималното разстояние от Х до У е n?

Трябва да сте влезли в системата, за да може да отговаряте на теми.