Что делает || = (или - равняется), средний в Ruby?

повернуть матрицу по часовой стрелке на 45 градусов. Вы получите набор данных в форме ромба. Высота будет 2N-1, количество элементов в каждом ряду сверху будет примерно таким: 1,2,3,4,5,4,3,2,1 для N = 5

узнайте, что каждое число в строке всегда больше любого числа выше.

для k-й строки (считая от 1) у вас будет k элементов для k < N и, 2N-k для k> = N k принадлежит {1..2N-1}

Вычисляя накопленное количество элементов от строки 1 до k-1 и от 1 до k, вы найдете строка, в которой находится ваша цель (сумма (от 1 до k-1)

Теперь, когда вы нашли ряд элементов с наихудшим случаем N всего. Вы можете отсортировать их и затем найти правильный. this taks O ( N ln N)

, поскольку N = sqrt (n), общая стоимость этого алгоритма составляет O (sqrt (n) ln (sqrt (n)))

324
задан Peter O. 9 September 2014 в 11:21
поделиться

2 ответа

Этот вопрос так часто обсуждался в списках рассылки Ruby и блогах Ruby, что теперь в списке рассылки Ruby есть даже цепочки, единственной целью которых является сбор ссылок на все другие цепочки на список рассылки Ruby, в котором обсуждается эта проблема.

Вот один: Полный список || = (OR Equal) потоков и страниц

Если вы действительно хотите знать, что происходит, взгляните на Раздел 11.4. 2.3 «Сокращенные присвоения» проекта спецификации языка Ruby .

В первом приближении

a ||= b

эквивалентно

a || a = b

, а не эквивалентно

a = a || b

Однако это только первое приближение, особенно если a не определено . Семантика также различается в зависимости от того, простое ли это присвоение переменной, присвоение метода или присвоение индексации: все

a    ||= b
a.c  ||= b
a[c] ||= b

обрабатываются по-разному.

174
ответ дан 23 November 2019 в 00:53
поделиться

Означает или равно. Он проверяет, определено ли значение слева, а затем использует его. Если это не так, используйте значение справа. Вы можете использовать его в Rails для кеширования переменных экземпляра в моделях.

Быстрый пример на основе Rails, где мы создаем функцию для выборки текущего пользователя, вошедшего в систему:

class User > ActiveRecord::Base

  def current_user
    @current_user ||= User.find_by_id(session[:user_id])
  end

end

Он проверяет, является ли переменная экземпляра @current_user устанавливать. Если это так, он вернет его, тем самым сохранив вызов базы данных. Однако, если он не установлен, мы выполняем вызов, а затем устанавливаем для него значение переменной @current_user. Это действительно простой метод кэширования, но он отлично подходит для случаев, когда вы несколько раз получаете одну и ту же переменную экземпляра из приложения.

12
ответ дан 23 November 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: