Я бы тупо посчитал корреляцию оценок по фильмам, оценённым обоими критиками.
Особенности:
Симметричность (А похож на Б так же, как Б на А)
Устойчивость к константному смещению и множителю. Если я по душе очень критичен и в целом занижаю оценки даже хорошим вещам, а другой более лоялен и ставит всем на балл выше, мы всё равно коррелируем по вкусу.
Учёт антикорреляции. Если я оценил три фильма 1/3/5, а оппонент — 5/3/1, то корреляция скажет, что у нас абсолютно противоположные вкусы, а предложенный автором топика метод отметит сходство во втором фильме.
Не работает с теми, кто всем ставит одинаковые оценки (если подумать, это логично: такой критик вообще бесполезен).
Вернулись же к тому, с чего начали :-) Теперь boxing одного и того же числа делается кучу раз во внутреннем цикле ( put(key, Integer.valueOf(i)) ). Хоть код и «красивее», но память опять загаживается, и всё тормозит :-)
Перечитайте внимательно. Вообще в изначальном коде так и было — в обоих местах (и в for, и в прототипе put) был int, а память под Integer кушалась тоннами. Надо исправить оба места на Integer, чтобы эффект исчез. Возможно, мне не стоило видоизменять пример, чтобы оставить только одно узкое место…
> for (Integer i = 0; ...) это моветон.
Это некрасиво, но в данном случае оптимально. Как я отметил, можно завести свой кэш Integer-объектов и пользоваться им только внутри put, а снаружи везде использовать int. Но это дополнительные ненужные накладные расходы. Тут весь код — низкоуровневая реализация некого алгоритма, поэтому ему позволительно быть не очень красивым.
Лишние unboxing'и не так страшны, это всего лишь по сути разыменование указателя. А вот лишний boxing — это существенно более неприятная операция.
Как я написал, это не поможет. Тогда всё равно внутри put будут создаваться каждый раз новые объекты. Если не хочется использовать Integer, надо внутри put доставать Integer-объекты из своего кэша.
Начнёте о других языках подумывать — придётся интерфейс менять =)
Я бы предложил язык сделать параметром и в случае его отсутствия использовать какой-нибудь дефолт для документа/аккаунта.
Ещё надо просто сделать число прописью без суммы. Во всяких документах бывают и другие числа прописью (номер продаваемой квартиры в договоре купли-продажи, например).
Особенности:
А ещё непосредственно PHP используют как шаблонизатор :-)
> Это не работает для простых чисел больше 256.
Математики не простили бы столь вольное употребление выражения «простые числа» =)
Это некрасиво, но в данном случае оптимально. Как я отметил, можно завести свой кэш Integer-объектов и пользоваться им только внутри put, а снаружи везде использовать int. Но это дополнительные ненужные накладные расходы. Тут весь код — низкоуровневая реализация некого алгоритма, поэтому ему позволительно быть не очень красивым.
Лишние unboxing'и не так страшны, это всего лишь по сути разыменование указателя. А вот лишний boxing — это существенно более неприятная операция.
В какой IRC-сети?
Начнёте о других языках подумывать — придётся интерфейс менять =)
Я бы предложил язык сделать параметром и в случае его отсутствия использовать какой-нибудь дефолт для документа/аккаунта.
Ещё надо просто сделать число прописью без суммы. Во всяких документах бывают и другие числа прописью (номер продаваемой квартиры в договоре купли-продажи, например).
> В свое время очень нравился Rubik's SpeedKIT
Я его сейчас и кручу. Дороговат, да, зато просто в магазине продавался :-)