Автор Тема: Задачка для собеседования  (Прочитано 25987 раз)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #75 : Ноябрь 13, 2012, 12:32:43 am »
Совпадает с моим.
Хотя нет, поспешил. Строго говоря, мой вариант был такой: "все отличия распечатаны".
Речь идет об интервалах [0,i) и [0,j)

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #76 : Ноябрь 13, 2012, 10:04:37 am »
Так и нормальный инвариант же. Почему он не устраивает?

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #77 : Ноябрь 13, 2012, 10:16:47 am »
Вот не нравится чем-то.
Непонятно, по какому закону расширять интервалы.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #78 : Ноябрь 13, 2012, 11:23:45 am »
Если обозначить j(i) как j при котором b[ j ]=a[ i ], то
для  i=0   j<=j(0)
для i>0   j(i-1)<j<=j(i)
Собственно это же сойдёт и за инвариант.

Можно играть и с таким инвариантом  a[ i ]=b[ j ] , даже тот цикл от Trurl, если интерпретировать его как "два в одном", рассматривая итерацию по i как "главную"  :)
Вообщем как-то так, особо не гоняясь за строгостью (лень) :)

PS. борьба с курсивом
« Последнее редактирование: Ноябрь 13, 2012, 11:25:40 am от albobin »

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #79 : Ноябрь 13, 2012, 01:35:54 pm »
Так и нормальный инвариант же. Почему он не устраивает?
А какая от него польза?

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #80 : Ноябрь 13, 2012, 06:15:29 pm »
Вот не нравится чем-то.
Непонятно, по какому закону расширять интервалы.
То есть, непонятно, как двигаться вперёд? У нас есть два непересекающихся множества элементов. Элементы одного множества - это поддиапазоны чисел, одинаковых в обоих массивах, а элементы другого множества - это поддиапазоны чисел из второго массива, не встречающиеся в первом. Поддиапазоны непрерывны и максимальны.
Можно считать, что у нас последовательность (или массив) чередующихся элементов из обоих множеств. И инвариант говорит нам, что все элементы слева от курсора обработаны. Только обработка зависит от типа элемента, тогда как в обычном массиве обработка однородна.
Обработка элемента из первого множества заключается в его пропуске (и это делается в первой части цикла), а обработка элемента второго множества - вывод его на печать.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #81 : Ноябрь 13, 2012, 07:11:48 pm »
А какая от него польза?
Не очень понимаю. Польза от инвариантов? Применительно к чему?

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #82 : Ноябрь 13, 2012, 07:22:11 pm »
Так и нормальный инвариант же. Почему он не устраивает?
А какая от него польза?
Как говорил Info21: "Всегда вспоминаю Зинаиду Гиппиус."

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #83 : Ноябрь 14, 2012, 07:42:05 am »
А какая от него польза?
Не очень понимаю. Польза от инвариантов? Применительно к чему?
Инвариант цикла должен помогать правильному построению цикла, иначе, следуя принципу бритвы Оккама, этот инвариант нинужен!
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

DIzer

  • Гость
Re: Задачка для собеседования
« Ответ #84 : Ноябрь 14, 2012, 09:33:29 am »
А какая от него польза?
Не очень понимаю. Польза от инвариантов? Применительно к чему?
Инвариант цикла должен помогать правильному построению цикла, иначе, следуя принципу бритвы Оккама, этот инвариант нинужен!
Geniepro, проблема не в этом... а в том,  что в силу недонозначности инварианта помноженной неоднозначность алгоритма, которая, в свою очередь помножается  на различия в восприятии и некоторую субьективность  понятия "нужен"  (в данном контексте)   -  то что полезно для Петра может быть бесполезно для Вас (и наоборот).

DIzer

  • Гость
Re: Задачка для собеседования
« Ответ #85 : Ноябрь 14, 2012, 09:44:41 am »
Например , ;D Петр  утверждает что априори полезен... и поэтому на каждый чих .. ПЫТАЕТСЯ его отыскать - как результат  он больше времени анализирует задачу (как следствие лучше ее понимает) и его навыки в этом анализе совершенствуются (с определенной степенью эффективности).. и как следствие -  частота сделанных им ошибок  меньше.. То есть что мы имеем.. - несомненную пользу.. даже в том случае если метода полное г. (эффект плацебо).

DIzer

  • Гость
Re: Задачка для собеседования
« Ответ #86 : Ноябрь 14, 2012, 10:09:41 am »
А вот, Geniepro, пример случая когда эта метода БЕЗУСЛОВНО ПО ФАКТУ  ВРЕДНА - у меня таких 50% на группу -  когда текущая степень понимания человеком решаемой задачи не позволяет ему выделить последовательность действий (алгоритм). В этом случае - эта метода просто отвлекает его от того , что РЕАЛЬНО нужно делать. Как следствие - задача вовремя не решается , а самое паскудное то, что в него входит ощущение неуверенности в своих силах...

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #87 : Ноябрь 14, 2012, 11:18:46 am »
Вот не нравится чем-то.
Непонятно, по какому закону расширять интервалы.
Не нравится тем, что никак не отражает существенную несимметричность ролей массивов (а задача подло провоцирует на симметричность).
Более правильный вариант выглядит так. Обозначим массивы как a и b, индексы - i и j.
Массив b  в некотором роде главный. Массив a – играет роль генератора эталонных символов. Полный инвариант выглядит так: "для обработанной области массива b напечатаны все отличия, и из генератора "выбраны" все символы, встретившиеся (в нужном порядке) в b".
Отсюда логично следует тело цикла.
Берем очередной необработанный символ из массива b. Если он не совпадает с текущим символом генератора, то печатаем его. Иначе "забираем" символ из генератора (продвигаем вперед i). Конец если. Расширяем обработанную область (продвигаем вперед j).

Я трактовал последний 0 в массиве "a" как конец работы генератора. Другие авторы, не нарушая условий задачи, трактовали его как обычный символ, который никогда не встретится внутри массива b.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #88 : Ноябрь 14, 2012, 11:19:27 am »
Как говорил Info21: "Всегда вспоминаю Зинаиду Гиппиус."
Новые посетители могут не понять междусобойчика. "Если надо объяснять, то не надо объяснять".
З. Гиппиус.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка для собеседования
« Ответ #89 : Ноябрь 14, 2012, 12:04:21 pm »
По поводу инварианта a[ i ]=b[ j ] в двух словах.

Имеем в основе два  прохода по всем элементам массивов a[] и b[]
i:=0 ; while a[ i ] # 0 do i:=i+1 end
и
j:=0 ; while b[ j ] # 0 do j:=j+1 end

Все варианты решений - это организация тем или иным макаром  "переключений" с одного цикла на другой и обратно.
На каждый шаг по массиву a[] организуем не менее 1 шага по массиву b[] для восстановления инварианта (совпадение значений)
а вот в "процессе" восстановления инварианта как раз и происходит "полезная работа" в этой задаче