Logarithms-对数

本文深入解析了对数的基本概念,包括其运算规则与在计算机科学中的应用,如二分查找算法的时间复杂度分析,以及对数在排序、二叉树层级等问题中的体现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对数意味着什么?

为了得到这个答案,基于这个底数,需要是它的多少幂?
例如对于:log_{10}{100}
它的意思是,底数是10,答案是100,那么10的多少幂能得到100?
也就是:10^x = 100
那么我们知道x = 2;所以 log_{10}{100} = 2;

对数的一些规则

下面的这些规律,在我们进行代数的数学运算是,非常有帮助。

  • 基本的: \log_{b}{(b^x)} = x 在简化方程式中很有帮助。
  • 乘法: Multiplication: \log_{b}{(x*y)} = \log_{b}{(x)} + \log_{b}{(y)} 。
  • 除法:Division: \log_{b}{(x/y)} = \log_{b}{(x)} - \log_{b}{(y)}。
  • 幂:Powers: \log_{b}{(x^y)} = y * \log_{b}{(x)} 。
  • 底数替换:Change of base: \log_{b}{(x)} = \frac{\log_{c}{(x)} }{\log_{c}{(b)} } 在更改对数的底时,非常有用,将对数的底从b该为c。

备注:frac:LaTex公式,frac{1}{10}相当于1/10;

在算法和面试中,哪些地方会提到对数

在计算机科学中,我们经常会问自己这样一个问题:

How many times must we double 1 before we get to n?
或者
How many times must we divide n in half in order to get back down to 1?

进一步思考上面的两个问题,可以转换为以下问题:

how many times from 1 to n by multiplying 2.
how many times from n to 1 by dividing 2

两者拥有同样的答案,就是log_{2}{n}。
如果这个答案不够明显,我们通过如下例子来证明得到它。

二分查找中的对数

二分查找需要耗费多少次,二分查找在有序列表中找寻目标数的一种算法。经过如下:

  1. 从列表中间的数开始:它是否大于或于目标数?由于该列表是有序的,我们可以得到目标数在列表的左侧还是右侧。
  2. 将问题拆分成半:我们从列表中丢弃不包含目标数的那一半。
  3. 重复上面的规则在新的列表中,直到找到目标数或则丢弃整个列表。

所以在二分查找过程中需要花费多少长时间?
So the question is, “how many times must we divide our original list size (n) in half until we get down to 1?”
推导过程:

n * \frac{1}{2} * \frac{1}{2} * \frac{1}{2} * \frac{1}{2} * … = 1
How many \frac{1}{2}'s are there? We don’t know yet, but we can call that number x:
n * (\frac{1}{2})^x = 1
n * \frac{1^ x}{2^x} =1
n*\frac{1}{2^x}=1
\frac{n}{2^x}=1
2^x=n
log_{2}{2^x} = log_{2}{n}
x = log_{2}{n}

所以二分法需要的次数为log_{2}{n}。

还有排序中的二分排序、完全二叉树的层级等等问题,都与log相关。

底数的总结

有时,人们不显示的写出底数,在计算机科学中,对数的底数常常都是2,所以log{n}也就与log_{2}{n}等同。

有些时候,log{n}的底数是10(数学);有些时候,底数是e(常数)。

### C++ 中对数函数的使用方法 在 C++ 中,`<cmath>` 头文件提供了多种用于计算对数值的函数。对于以 10 为底的对数,可以使用 `log10()` 函数;而对于自然对数,则有 `log()` 函数。 #### 使用 log10() 计算常用对数 为了确保高精度的结果,在某些实现中,`log10` 的准确性可达到至少 32 位小数[^1]: ```cpp #include <iostream> #include <cmath> int main(){ double value = 1000; std::cout << "Logarithm of " << value << " with base 10 is: " << log10(value) << "\n"; } ``` 此代码片段展示了如何利用 `log10()` 来求解给定值的十进制对数,并打印其结果。 #### 自然对数和其他基数的支持 除了 `log10()` ,还有其他几个有用的对数函数可供选择: - `log(double)` :返回 e 底下的自然对数- `log(float)` : 同上,但参数类型为 float; - `log(long double)` : 返回 long double 类型变量的自然对数- 对于任意正实数 b 和 x , 可通过公式 `log(x)/log(b)` 实现不同基底之间的转换。 ```cpp // Example demonstrating natural logarithms and custom bases conversion. #include <iostream> #include <cmath> int main(){ const double BASE = 2; // Define your desired base here double num = 8; // Calculate the natural logarithm using 'log' std::cout << "Natural Logarithm (" << num << ") = " << log(num) << '\n'; // Convert to a specified base by dividing two logs std::cout << "Base-" << BASE << " Logarithm ("<<num<<")=" << log(num)/log(BASE)<<'\n'; } ``` 上述程序不仅演示了怎样调用标准库中的自然对数运算符 (`log`),还说明了一个通用的方法来改变对数的基础——即除法法则的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值