лайф-хак на будущее, если есть какой-то сайт интересной тематики, то стоит погуглить запрос «alternatives to X» и на сайте альтернатив можно найти много полезного.
Разумеется из-за погрешностей. Метод Эйлера (тем более явный) — решение «в лоб». Для более точного решения стоит использовать хотя бы leap-frog (вычисляем попеременно то координату, то скорость). Будет и энергия сохраняться, и орбита.
А «большие дяди» используют хотя бы метод Рунге-Кутты 4 порядка. Пишется в 4 строчки, а погрешность — O(h^2).
Я тоже вспоминаю свои школьные годы, различные творческие конкурсы, малую академию наук и т.д.
Задача детского научно-технического творчества — это не создать внезапно конкурентноспособную технологию (т.к. конкурировать школьнику с сотнями исследовательских групп с бездонным финансированием невозможно).
Детская научная деятельность — это процесс, который важнее результата. Это то, что должно приучить и научить думать, искать, догадываться, проверять, спорить, сомневаться, принимать и отказываться.
Другое дело, что сейчас уже дети испорчены и испорчено детское творчество. Красивую картинку первым делом пытаются продать, к видеозаписи хорошей песни прикрутить рекламу, а автор любого реферата уже готов давать интервью.
Поэтому значительная часть пара, разумеется, уходит в свисток группочек вконтактике, логотипчиков, футболочек, кепоччек, сувенирчиков, интервьюшечек, фанклубчиков… о чертов смысл жизни, если ты есть!
С другой стороны, а могут ли дети сейчас быть не испорченными? Разве это от них зависит? Разве это их выбор?
А если не добавлять гидропирит, а налить в емкость побольше и подключить воздушную помпу. Должен получиться офигенный по красоте эффект светящихся пузырьков. Или скорости реакции не хватит?
Давайте попробуем искать не первый/последний из эквивалентных элементов, а границы содержащего их интервала.
Интервал будет полуоткрытый справа, т.е. [lower_bound, upper_bound) как и все используемые интервалы. В случае, если искомого элемента нет, интервал будет пустой и обе границы (у пустого интервала границы равны) будут указывать на «место для вставки».
Для определения как отсортирована последовательность используем компаратор.
Будем считать, что компаратор comp в нашей последовательности выполняет роль оператора < и элементы в ней отсортированы по возрастанию (возрастанию относительно компаратора).
Т.е. если у нас последовательность целых чисел отсортирована по убыванию, то компаратором в ней будет оператор >. Если у нас последовательность пар чисел, отсортированных по величине второго числа… ну вы поняли о чем я.
lower_bound — позиция первого элемента, который не меньше искомого.
upper_bound — позиция первого элемента, который больше искомого.
Я буду использовать не индексы, а итераторы т.к. считаю, что в данной постановке задачи они уместнее (а ещё потому, что я это буду делать на C++ «в стиле STL»).
Попробуем найти lower_bound:
template<typename FwdIter, typename T, typename Comp>
FwdIter lower_bound(FwdIter first, FwdIter last, T const& x, Comp comp)
{
// если интервал пустой, то его и возвращаем
if (first == last)
return first;
// вычислим позицию среднего элемента
FwdIter middle = first;
std::advance(middle, std::distance(first, last) / 2);
// Если средний элемент меньше искомого, т.е. искомый больше среднего элемента,
// то т.к. последовательность отсортирована по возрастанию,
// искомый элемент должен находиться справа от среднего, иначе — слева
if (comp(*middle, x))
return lower_bound(++middle, last, x, comp);
else
return lower_bound(first, middle, x, comp);
}
upper_bound можно выразить через lower_bound:
У нас есть оператор <, а нам нужен ≤.
Выразим одно через другое:
a ≤ b ⇔ !(b < a)
template<typename FwdIter, typename T, typename Comp>
FwdIter upper_bound(FwdIter first, FwdIter last, T const& x, Comp comp)
{
typedef typename std::iterator_traits<FwdIter>::value_type value_type;
auto less_equal = [&comp](value_type const& a, T const& b){return !comp(b, a);};
return lower_bound(first,last, x, less_equal);
}
Варианты для компаратора по умолчанию пишутся тривиально.
Ну и осталась обертка для проверки входит ли элемент в последовательность и на какой позиции.
template<typename FwdIter, typename T, typename Comp>
FwdIter binary_search(FwdIter first, FwdIter last, T const& x, Comp comp)
{
FwdIter found = lower_bound(first, last, x, comp);
// Если элемент не найден, found может оказаться равен правой границе.
// Если found указывает на существующий элемент, то он не меньше искомого.
// Т.е. *found или больше или равен x, если больше, то x не нашелся.
if (found == last || comp(x, *found))
{
// Элемент не найден.
// Вернем верхнюю границу диапазона в качестве индикатора.
return last;
}
return found;
}
Последняя обертка, не даёт информацию о месте вставки, если элемент не нашелся, однако никто не запрещает воспользоваться lower_bound напрямую, если мы собираемся вставлять элемент.
Аналогично. Когда я узнал, что scope — это всего-навсего объект, а переменные «внутри» него — это его свойства, оказалось, что в прототипах и в скопах используется по сути один и тот же механизм, делегация.
А «магическая» конструкция with() всего-то навсего добавляет в эту цепь произвольный объект. И тогда js стал для меня из непредсказуемой штуки красивым и изящным языком.
Если уж про пистолет, то надо не только сам пистолет протирать, но и весь процесс заряжания производить в перчатках, желательно медицинских (не оставляющих ворса). Т.е. брать в них патроны из коробки, вставлять в магазин. Гильзы-то останутся на месте после стрельбы, если это не барабанный пистолет. И сам магазин вставлять в пистолет в перчатках — бывает, когда двух выстрелов недостаточно, приходится доставать запасной магазин — а первый может быть экстренно сброшен под ноги. Не всегда может удаваться его потом подобрать.
Куда более впечатляет осознание того, что и «сейчас» которое мы наблюдаем уже «прошлое». Скорость прохождения сигналов в нервах конечна и не очень высока даже по меркам вашего сотового телефона. Пока сигналы доходят до нейронов, пока складывается очередная картинка осознания — того, на что мы смотрели и слушали уже нет.
Более того: «сейчас» по сути это даже не «сейчас минус доля секунды», а «сейчас как мы его себе представляем в голове минус доля секунды». И получается что мы все время в «прошлом» (привет финнам) и в виртуальной построенной в голове реальности частично и в меру развитости чувств восприятия и качества осознания отдельно индивидуума соответствующей окружающей реальности минус доля секунды.
Будущего вообще не существует — путешествовать некуда. Оно еще не наступило. Прошлого тоже нет — это только наш образ о прошлом в голове «тут и сейчас».
Классика эконофизики: Farjoun and Machover, «Laws of chaos»
Также интересные модели есть у Cockhsott and Cottrell
А «большие дяди» используют хотя бы метод Рунге-Кутты 4 порядка. Пишется в 4 строчки, а погрешность — O(h^2).
Задача детского научно-технического творчества — это не создать внезапно конкурентноспособную технологию (т.к. конкурировать школьнику с сотнями исследовательских групп с бездонным финансированием невозможно).
Детская научная деятельность — это процесс, который важнее результата. Это то, что должно приучить и научить думать, искать, догадываться, проверять, спорить, сомневаться, принимать и отказываться.
Другое дело, что сейчас уже дети испорчены и испорчено детское творчество. Красивую картинку первым делом пытаются продать, к видеозаписи хорошей песни прикрутить рекламу, а автор любого реферата уже готов давать интервью.
Поэтому значительная часть пара, разумеется, уходит в свисток группочек вконтактике, логотипчиков, футболочек, кепоччек, сувенирчиков, интервьюшечек, фанклубчиков… о чертов смысл жизни, если ты есть!
С другой стороны, а могут ли дети сейчас быть не испорченными? Разве это от них зависит? Разве это их выбор?
Интервал будет полуоткрытый справа, т.е. [lower_bound, upper_bound) как и все используемые интервалы. В случае, если искомого элемента нет, интервал будет пустой и обе границы (у пустого интервала границы равны) будут указывать на «место для вставки».
Для определения как отсортирована последовательность используем компаратор.
Будем считать, что компаратор comp в нашей последовательности выполняет роль оператора < и элементы в ней отсортированы по возрастанию (возрастанию относительно компаратора).
Т.е. если у нас последовательность целых чисел отсортирована по убыванию, то компаратором в ней будет оператор >. Если у нас последовательность пар чисел, отсортированных по величине второго числа… ну вы поняли о чем я.
lower_bound — позиция первого элемента, который не меньше искомого.
upper_bound — позиция первого элемента, который больше искомого.
Я буду использовать не индексы, а итераторы т.к. считаю, что в данной постановке задачи они уместнее (а ещё потому, что я это буду делать на C++ «в стиле STL»).
Попробуем найти lower_bound:
upper_bound можно выразить через lower_bound:
У нас есть оператор <, а нам нужен ≤.
Выразим одно через другое:
a ≤ b ⇔ !(b < a)
Варианты для компаратора по умолчанию пишутся тривиально.
Ну и осталась обертка для проверки входит ли элемент в последовательность и на какой позиции.
Последняя обертка, не даёт информацию о месте вставки, если элемент не нашелся, однако никто не запрещает воспользоваться lower_bound напрямую, если мы собираемся вставлять элемент.
За исключеним нескольких нюансов, мы практически переизобрели соответствующие алгоритмы из STL:
lower_bound
upper_bound
binary_search
equal_range
Тщательно не тестировал, но вроде работает.
object → [[proto]] → [[proto]] → [[proto]] → null
[[scope]] → [[scope]] → [[scope]] → window → null
А «магическая» конструкция
with()
всего-то навсего добавляет в эту цепь произвольный объект. И тогда js стал для меня из непредсказуемой штуки красивым и изящным языком.Более того: «сейчас» по сути это даже не «сейчас минус доля секунды», а «сейчас как мы его себе представляем в голове минус доля секунды». И получается что мы все время в «прошлом» (привет финнам) и в виртуальной построенной в голове реальности частично и в меру развитости чувств восприятия и качества осознания отдельно индивидуума соответствующей окружающей реальности минус доля секунды.
Будущего вообще не существует — путешествовать некуда. Оно еще не наступило. Прошлого тоже нет — это только наш образ о прошлом в голове «тут и сейчас».