在哪里可以了解对数?

时间:2020-03-06 14:36:25  来源:igfitidea点击:

我听到对数在编程环境中提到很多。它们似乎是许多问题的解决方案,但是我似乎找不到找到使用它们的真实方法。我已经阅读了Wikipedia条目,很坦率地说,这让我没有一个更明智的选择。

那么,我在哪里可以了解对数解决的现实编程问题呢?有没有人举例说明通过实施对数可以解决的他们所面临的问题?

解决方案

我唯一想起的问题是必须计算SQL中列的乘积。 SQL Server没有PRODUCT()聚合函数,因此可以通过使用每个值的对数之和(使用LOG10()函数)来实现。主要缺点是该列中的所有数字都必须为正且非零(我们无法计算负数或者零的对数)。

假设我们有$ 1000,并且存入一个利率为2.4%的储蓄帐户。

我们必须等到2000年才能购买新笔记本电脑多少年?

1000 1.024x = 2000

1.024x = 2

x =日志1.024 2 = 29.23年

编程中的对数也经常用于描述使用Big O表示法的算法的效率。

例如,二元搜索算法的最坏情况为O(log(n))(在排序集上),而线性搜索的最坏情况为O(n)

我已经看到了用于显示标签云的对数。这是一个解释它的页面:

标签云字体分配算法

每个编程示例中最明显的用法是精度。简而言之,请考虑存储无符号整数。我们需要多少位存储X?好吧,可以存储在n位中的最大值是2 ^ n 1,因此我们需要log_2 X + 1位来存储X。现在我们可以轻松地选择short,int,word,long等。

对数是一种元算术。这是将每个数字视为(可能是固定的)基数成指数的一种方式。仅对指数执行操作。这意味着我们可以通过对日志进行加法和减法来进行乘法和除法。换句话说,我们将数据放入日志空间,执行一组算术,然后将其拉回到非日志空间。如果浮点精度损失和转换日志空间或者转换出日志空间的开销很便宜,那么我们可能会在总体上赢得胜利。

我们可以对日志执行的一个巧妙技巧是,计算数字打印时要采用的字符数,方法是将数字的对数取二与一组乘数比较。

我假设我们听说过有关上下文和时间消耗的对数。

一个具体的例子是搜索算法。给定一组有序数据(想一想int的排序数组),我们想在该数据中找到指向某个值的索引键。我们可以受益于数组已排序的事实(例如,1、2、6、192、404、9955、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次,依此类推。以20个步骤搜索1048576个值。这比必须分别比较数组中的每个项目要快得多。当然,这仅适用于排序的数据集合。

当一个或者两个轴覆盖较大范围的值时,对数在图表和图形中经常使用。

某些自然现象最好以对数表示。声压级(以dB为单位的SPL)和地震震级(里氏标度)就是一些例子。

众多例子中的一个:以非常小的比率计算大量期间的复利。

即使使用快速幂运算,我们也可以使用最直接的方法进行操作,但是由于浮点数的存储方式和计算s * r幂n仍需要O(ln(n))运算,因此准确性可能会受到影响。

使用对数,它会更准确。

A = ln(s * r功率n)= ln(s)+ n * ln(r)
对数数据库中的两次查找使我们获得ln(s)和ln(r),其中ln(r)开始时很小,并且以接近0的最佳精度进行浮点运算
result = exp(A),在这里进行反向查找。

如果我们使用非整数指数,例如提取立方根,这也是唯一真正有效的方法。

查看MIT的开放课件:算法简介。免费教育。惊人的。

我建议使用e:"数字的故事"作为对数重要性,发现和与自然现象的相关性的良好基础。

另一种查看方法是查看一个数中的基乘数。我相信我们可以在以下示例中看到所有这些之间的关系。

十进制(以10为底):

  • log10(1)= 0,(10 ^ 0)= 1
  • log10(10)= 1,(10 ^ 1)= 10
  • log10(100)= 2,(10 ^ 2)= 100
  • log10(1000)= 3,(10 ^ 3)= 1000
  • log10(10000)= 4,(10 ^ 4)= 10000
  • log10(100000)= 5,(10 ^ 5)= 100000

二进制(以2为底):

  • log2(1)= 0,(2 ^ 0)= 1
  • log2(2)= 1,(2 ^ 1)= 2
  • log2(4)= 2,(2 ^ 2)= 4
  • log2(8)= 3,(2 ^ 3)= 8
  • log2(16)= 4,(2 ^ 4)= 16
  • log2(32)= 5,(2 ^ 5)= 32
  • log2(64)= 6,(2 ^ 6)= 64
  • log2(128)= 7,(2 ^ 7)= 128

十六进制(以16为底):

  • log16(1)= 0,(16 ^ 0)= 1
  • log16(16)= 1,(16 ^ 1)= 16
  • log16(256)= 2,(16 ^ 2)= 256
  • log16(4096)= 3,(16 ^ 3)= 4096
  • log16(65536)= 4,(16 ^ 4)= 65536

如果要考虑变量:

  • 对数N(X)= Y
  • (N ^ Y)= X

现实世界中的许多关系都是对数的。例如,如果Stack Overflow上信誉得分的分布是对数正态分布,这不会令我感到惊讶。绝大多数用户的声誉得分为1,少数人的声誉很高。如果将对数转换应用于该分布,则可能几乎是线性关系。快速浏览https://stackoverflow.com/users?page=667可以证明这是正确的。

我们可能更熟悉"长尾巴"概念,它是对数分布的应用。

我发现对数更"酷"的应用之一是螺旋存储。它是一个哈希表,可让我们随着表的增长一次拆分一个存储桶,从而将该存储桶中不到一半的记录重新定位到同一新存储桶中。与线性哈希不同,线性哈希的性能是周期性变化的,并且所有存储桶都倾向于在大约同一时间拆分,而螺旋哈希可以使表顺利,平稳地增长。

该书大约在30年前由G.N. N. Martin出版,除了他还发明了Range Encoding之外,我对此并没有太多的了解。好像是个聪明人!我一直无法获得他的原始论文的副本,但是Per-ke Larson的论文" Dynamic hash table"具有非常清晰的描述。

作为克里斯正在谈论的一个例子,一种基于值中位数改变复杂度的算法(可能)将具有由O(log(n))描述的效率。

指数(以及对数)的另一个日常示例是IEEE浮点数格式。

对数函数只是指数函数的反函数,从某种意义上说,减法是加法的反函数。就像这个等式:

a = b + c

陈述与该等式相同的事实:

a - c = b

这个等式:

b ** p = x

(其中**提升为幂)表示与该等式相同的事实:

log [base b] (x) = p

尽管b可以是任何数字(例如log base 10= 4),但是数学的"自然"底数是e(2.718281828 ...),有关此信息,请参见此处。

在工程中使用较多的"常用"对数使用10为底。对某个数字" x"的常用(以10为底)对数的快速解释(强调脏)是,它小于表示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.

Ruby Quiz#105:锦标赛对决

本文包含一个很好的示例,该示例使用x为2的底数来确定完成淘汰赛所需的回合数。

指数函数和E的直观指南

极好的,直观的(如我们期望的那样,给出了标题)e的自然对数的基础指南。许多插图和示例使这成为文章的瑰宝。

揭开自然对数(ln)的神秘面纱

这是关于e的文章的后续文章,并讨论了自然对数(ln),它使用文章中给出的直观解释"为我们提供了达到一定增长水平所需的时间"。

实际上,"更好的解释"网站上有很多优质的内容。确实,这是一个出色的资源。

我以前真正碰到过但又被完全遗忘的另一个工具是Instacalc。似乎由作者更好的解释网站的同一人Kalid Azad撰写。在学习数学时,这是一个非常有用的工具。

揭开自然对数(ln)的神秘面纱
在BetterExplained是我发现的最好的。
它从基础上清除了概念,并理解基础概念。
在那之后,一切似乎都是步履蹒跚。

这是我使用过的一些网站:

  • http://www.helpalgebra.com/articles/propertiesoflogarithms.htm
  • http://www.math.unc.edu/Faculty/mccombs/web/alg/classnotes/logs/lognotation.html
  • http://www.math.unc.edu/Faculty/mccombs/web/alg/classnotes/logs/logprops.html
  • http://abacus.bates.edu/acad/acad_support/msw/exps_and_logs.pdf
  • http://people.hofstra.edu/Stefan_Waner/Realworld/calctopic1/logs.html

我使用对数来计算房屋的年度升值,以确定卖方是否公平。

房屋升值方程

这是基本的等式:

  • 先前的价格= p
  • 新价格= n
  • 升值率= r
  • 升值年数= y
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%的价格,并考虑他们进行的任何改进(应在网站ID中列出这些价格是主要的,但不包括浴室/厨房的改建等)。

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