Я слышал, что логарифмы довольно часто упоминаются в контексте программирования. Они кажутся решением многих проблем, но я не могу найти реальный способ их использования. Я прочитал Запись в Википедии, и это, честно говоря, не оставляет меня в мудрости.
Итак, где я могу узнать о реальных проблемах программирования, которые решают логарифмы? У кого-нибудь есть примеры проблем, с которыми они столкнулись, которые были решены с помощью логарифмирования?
Можете ли вы объяснить, почему вы думаете, что это не о программировании? Обратите внимание на предложение, выделенное жирным шрифтом во втором абзаце.





Единственная проблема, которую я могу вспомнить, - это вычисление произведения столбца в SQL. В SQL Server нет агрегатной функции PRODUCT (), поэтому для этого использовалась сумма логарифмов (с помощью функции LOG10 ()) каждого значения. Основным недостатком было то, что все числа в столбце должны были быть положительными и отличными от нуля (вы не можете вычислить логарифм от отрицательного числа или нуля).
Определенно отличное преобразование, о котором вы упомянули здесь, которое может быть расширено за счет простого SQL. Когда продуктов действительно мало, вы часто можете подсчитать сумму в журнале.
Допустим, у вас есть 1000 долларов, и они находятся на сберегательном счете с процентной ставкой 2,4%.
Сколько лет вам придется ждать, пока у вас не будет 2000 долларов, чтобы купить новый ноутбук?
1000 × 1.024x = 2000
1.024x = 2
x = журнал 1.024 2 = 29,23 года
Я думаю, ^ яснее, чем ** для обозначения экспоненты ... мне по крайней мере
Это очень интересно, и именно это я имел в виду под «реальным миром». Пытаясь найти этот ответ, я нашел следующее очень полезным: math.about.com/od/formulas/a/compound.htm Чтобы вернуться к 2000 году, я получил следующее: 1000 * (1 + 0,024) ** 29.2263362061568
Исправлена опечатка, спасибо за отзыв. @ Чарльз Ропер, теперь ты понял. Другими словами, журнал сообщает вам, сколько раз вам нужно умножить число само на себя, чтобы перейти к другому числу.
Теперь вы используете несовместимые операторы экспоненты ... :)
@Charles Roper: Блин, я не должен редактировать свои посты поздно ночью, когда пью вино :-)
Я заметил, что обозначение, используемое для журнала, было неправильным (по крайней мере, по моему опыту ... Поправьте меня, если я ошибается!). Исправлено это, а также небольшая проблема с округлением.
@strager: На самом деле я привык к обозначению, в котором основание журнала записывается в верхнем индексе перед журналом, но я не мог найти, как это сделать. Так лучше, спасибо!
Применяя эту формулу к реальным сберегательным счетам, помните, что процентные ставки указаны за год, но часто проценты начисляются чаще. Для ежемесячного начисления сложных процентов каждый месяц вы умножаете на (1 + r / 12).
@Mendelt: используйте HTML-теги <sup> и </sup>. Они поддерживаются (по крайней мере, мы / я посты).
Откуда 1.024 взялось?
Логарифмы в программировании также часто используются для описания эффективности алгоритма с использованием Обозначение Big O.
Например, алгоритм двоичного поиска будет иметь наихудший сценарий O (log (n)) (на отсортированном наборе), тогда как наихудший случай линейного поиска - O (n)
Да, конечно, это отличный пример. Каждый раз, когда у вас что-то делится пополам после каждой итерации, подумайте о Log!
Я видел логарифмы, используемые для отображения облаков тегов. Эта страница объясняет это:
Наиболее очевидное использование в каждом примере программирования - точность. Проще говоря, подумайте о хранении целых чисел без знака. Сколько бит нужно для хранения X? Ну, максимальное значение, которое вы можете сохранить в n битах, равно 2 ^ n - 1, поэтому вам может потребоваться log_2 X + 1 бит для хранения X. Теперь вы можете легко выбрать short, int, word, long и т. д.
Журналы - это разновидность метаарифметики. Это способ думать о каждом числе как о (возможно, фиксированной) базе, возведенной в степень. Операции выполняются только с экспонентами. Это означает, что вы можете выполнять умножение и деление, выполняя сложение и вычитание журналов. Другими словами, вы помещаете свои данные в пространство журнала, выполняете набор арифметических операций и возвращаете их в пространство, отличное от журнала. Если потеря точности с плавающей запятой и накладные расходы на преобразование в пространство журнала или из него невелики, то вы можете получить общую победу во времени.
Один хитрый трюк, который вы можете сделать с журналами, - это вычислить количество символов, которые число займет при печати, взяв логарифмическую базу-2 числа и разделив ее на лог-базу-10 (2), что является постоянным временем. по сравнению с набором умножителей.
Я полагаю, вы слышали о логарифмах с контекстом потребляемого времени.
Конкретный пример - алгоритмы поиска. Учитывая набор упорядоченных данных (представьте себе отсортированный массив int), вы хотите найти индексный ключ для значения в этих данных. Мы можем извлечь выгоду из того факта, что массив отсортирован (например, 1, 2, 6, 192, 404, 9595, 50000). Допустим, мы хотим найти индекс для значения 2. Мы можем минимизировать пространство поиска, отбирая (игнорируя) половину массива на каждом шаге. Мы начинаем этот поиск с проверки значения в середине массива. В массиве 7 значений, затем мы делаем индекс 7/2 = 3,5 = 3 как int. array [3] равен 192. Значение, которое мы ищем, равно 2, поэтому мы хотим продолжить поиск в нижней половине области поиска. Мы полностью игнорируем индексы 4, 5, 6, поскольку все они выше 192 и, в свою очередь, также выше 2. Теперь у нас есть пространство поиска, которое выглядит как (1, 2, 6). Затем мы снова индексируем в середину (повторяем процесс) и сразу же находим 2. Поиск завершен, индекс до 2 равен 1.
Это очень маленький пример, но он показывает, как работает такой алгоритм.
Для 16 значений вам нужно выполнить поиск не более 4 раз. Для 32 значений вы выполняете поиск максимум 5 раз, 64 значения 6 раз и так далее. 1048576 значений ищутся за 20 шагов. Это намного быстрее, чем сравнивать каждый элемент в массиве по отдельности. Конечно, это работает только для отсортированных наборов данных.
Логарифмы довольно часто используются в диаграммах и графиках, когда одна или обе оси покрывают большой диапазон значений.
Некоторые природные явления лучше всего выражаются в логарифмической шкале; некоторые примеры - уровни звукового давления (SPL в дБ) и магнитуды землетрясения (шкала Рихтера).
Один пример из многих: начисление сложных процентов по очень маленькой ставке с большим количеством периодов.
Вы можете сделать это самым простым способом, даже используя быстрое возведение в степень, но точность может пострадать из-за того, как хранятся числа с плавающей запятой, а вычисление s * r power n по-прежнему требует O (ln (n)) операций.
С логарифмами это несколько точнее.
A = ln (s * r мощность n) = ln (s) + n * ln (r)
Два поиска в вашей базе данных логарифмов дают вам ln (s) и ln (r), при этом ln (r) начинается с очень малого, а числа с плавающей запятой работают с максимальной точностью около 0
result = exp (A), здесь обратный поиск.
Это также единственный действительно эффективный способ, если вы работаете с нецелыми показателями, например, для извлечения кубических корней.
Ознакомьтесь с Open Courseware MIT: Введение в алгоритмы. Бесплатное обучение. Потрясающий.
Выглядит действительно очень интересно, но охватывает ли это логарифмы?
Я рекомендую д: История числа как хорошее обоснование важности логарифмов, их открытия и отношения к природным явлениям.
Другой способ взглянуть на это - посмотреть на количество базовых множителей в числе. Я уверен, что вы можете увидеть, как это все соотносится, в следующих примерах.
Десятичный (основание 10):
Двоичный (основание 2):
Шестнадцатеричный (основание 16):
Если вы хотите мыслить переменными:
Многие (многие!) Отношения в реальном мире логарифмические. Например, меня не удивит, если распределение оценок репутации в Stack Overflow будет журнал нормальный. Подавляющее большинство пользователей будет иметь оценку репутации 1, а у горстки людей будет недостижимо высокая репутация. Если вы примените к этому распределению логарифмическое преобразование, оно, вероятно, будет почти линейным. Быстрое сканирование https://stackoverflow.com/users?page=667 показывает, что это правда.
Возможно, вы более знакомы с концепцией Длинный хвост, которая представляет собой приложение логарифмического распределения.
Одно из самых "крутых" применений логарифмов, которое я нашел, - это Спиральное хранилище. Это хеш-таблица, которая позволяет вам разделять одну корзину за раз по мере роста таблицы, перемещая менее половины записей в этой корзине в ту же новую корзину. В отличие от линейного хеширования, где производительность изменяется циклически и все сегменты имеют тенденцию разделяться примерно в одно и то же время, спиральное хеширование обеспечивает хороший и плавный рост таблицы.
Он был опубликован около 30 лет назад Г. Н. Мартином, о котором мне не удалось узнать много, кроме того факта, что он также изобрел Кодирование диапазона. Похоже на умного парня! Мне не удалось получить копию его оригинальной статьи, но статья Пер-Оке Ларсона «Динамические хеш-таблицы» имеет очень четкое описание.
В качестве примера того, о чем говорит Крис, алгоритм, который изменяет сложность в зависимости от количества бит в значении, (вероятно) будет иметь эффективность, описываемую O (log (n)).
Другой повседневный пример экспонент (и, следовательно, логарифмов) имеет формат Числа с плавающей запятой IEEE.
Логарифмическая функция - это просто функция, обратная экспоненциальной функции, в том же смысле, что вычитание является обратным сложению. Так же, как это уравнение:
a = b + c
утверждает тот же факт, что и это уравнение:
a - c = b
это уравнение:
b ** p = x
(где ** возводится в степень) утверждает тот же факт, что и это уравнение:
log [base b] (x) = p
Хотя b может быть любым числом (например, log [base 10] (10,000) = 4), «естественной» базой для математики является e (2,718281828 ...), о котором глянь сюда.
«Общие» логарифмы, которые чаще используются в технике, используют основу 10. Быстрая и грязная интерпретация общего (с основанием 10) логарифма некоторого числа x заключается в том, что оно на единицу меньше, чем количество десятичные цифры, необходимые для выражения чисел размером x.
В моем собственном исследовании я наткнулся на несколько полезных ресурсов:
Это потрясающий набор уроков по логарифмам. Этот комментарий шестиклассника хорошо подводит итог:
Thank you so much. This week, my math teacher told me to challenge myself, so I tried logarithms. At first I was like, 'I can't do this, it's too hard'. Then I watched the video, and now they're even fun! I'm in 6th grade, my math teacher is impressed. I can't thank you enough.
Эта статья содержит хороший пример использования журнала по базе 2 для определения количества раундов, необходимых для завершения турнира на выбывание с учетом команд Икс.
Отличное, интуитивно понятное (как и следовало ожидать, учитывая название) руководство по е, основанию натурального логарифма. Множество иллюстраций и примеров делают эту статью жемчужиной.
Это продолжение статьи о е и обсуждает натуральный логарифм (ln), который, используя интуитивно понятное объяснение, данное в статье, «дает вам время, необходимое для достижения определенного уровня роста».
На самом деле на сайте Лучшее объяснение есть много хорошего контента. Поистине великолепный ресурс.
Еще один инструмент, с которым я сталкивался раньше, но о котором полностью забыл, - это Instacalc. Судя по всему, это тот же человек - Калид Азад - автор сайта Better Explained. Это действительно полезный инструмент, когда вы занимаетесь математикой.
+1 за упоминание Калид Азад!
Демистификация натурального логарифма (ln) в BetterExplained - лучшее, что я нашел. Он очищает основы от концепций и помогает понять лежащие в основе концепции. После этого все кажется легкой прогулкой.
Вот несколько сайтов, которые я использовал:
Я использовал логарифмы для расчета годовой оценки стоимости дома, чтобы определить, был ли продавец честен.
Уравнения оценки дома
Вот основное уравнение:
p * (1 + r)^y = n
Итак, если 6 лет назад цена составляла 191 000 долларов (проверяя сайт вашего модного аудитора), а запрашиваемая цена - 284 000 долларов, какова будет норма оценки (без учета каких-либо одноразовых затрат на улучшение)?
191,000 * (1 + r)^6 = 284,000 (1 + r)^6 = 284,000 / 191,000 = 1.486 Using a property of exponents and logarithms… 6 ( log (1 + r) ) = log 1.486 log (1 + r) = (log 1.486) / 6 = 0.02866 Using another property of exponents and logarithms… 10 0.02866 = 1 + r 1.068 = 1 + r r = 1.068 – 1 = 0.068 = 6.8% (kind of high!)
Чтобы определить, какая будет разумная цена ... используйте 4% и учитывайте любые улучшения, которые они сделали (которые должны быть указаны в веб-идентификаторе, который они были основными ... но это не будет включать ремонт ванной комнаты / кухни и т. д.)
191,000 * (1 + 0.04)^6 = n n = 241,675 + reasonable cost of improvement which of course will depreciate over time and should not represent 100% of the cost of the improvement
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он не о программировании.