我相信我对$ Mathcal {o}(1)$,$ theta(n)$和$ theta(n^2)$等复杂性有合理的掌握。

就列表而言,$ Mathcal {O}(1)$是一个不断的查找,因此它只是获得了列表的头脑。 $ theta(n)$是我在整个列表中走的地方,而$ theta(n^2)$都在列表中的每个元素中浏览列表。

除了知道它位于$ Mathcal {o}(1)$和$ theta(n)$之间的某个位置之外,是否有类似的直观方法来掌握$ theta( log n)$?

有帮助吗?

解决方案

$ theta( log n)$复杂性通常与细分连接。在以榜单为例时,请想象一个元素被排序的列表。您可以在$ mathcal {o}( log n)$时间中搜索此列表中的搜索 - 由于列表的分类性质,您实际上不需要查看每个元素。

如果您查看列表中间的元素并将其与所搜索的元素进行比较,则可以立即说出它是位于数组的左侧还是右侧。然后,您只需取一个半,然后重复该步骤,直到找到它或使用1个项目进行1个项目的列表。

您可以看到该列表有效地将每个步骤切成一半。这意味着,如果您获得了$ 32 $的长度列表,那么您需要达到的最大步骤是$ 5 $。如果您有$ 128 = 2^7 $项目的列表,则仅需$ 7 $ steps,对于$ 1024 = 2^{10} $的列表,您只需要$ 10 $ steps等。

如您所见,$ 2^n $中的指数$ n $总是显示必要的步骤数。对数用于“提取”此指数号码,例如$ log_2 2^{10} = 10 $。它还概括列出不是两个长的幂的长度。

其他提示

就(平衡)树(例如二进制树)而言,所有$ log $ as Base 2):

  • $ theta(1)$正在获得树的根
  • $ theta( log n)$是从根到叶的步行
  • $ theta(n)$正在穿越树的所有节点
  • $ theta(n^2)$是在树上的所有子集上的操作,例如,任何两个节点之间的不同路径的数量。
  • $ theta(n^k)$ - 上述任何子集的$ k $节点的概括(对于常数$ k $)
  • $ theta(2^n)$是所有可能的节点子集的操作(所有可能的大小的子集,即,$ k = 1,2, ldots,n $。)。例如,不同的数量 子树 树。

对于可能的$ O( log n)$,您需要能够以恒定的时间操作相对于$ n $将问题大小按比例减少一定的任意金额。

例如,在二进制搜索的情况下,您可以在每个比较操作的情况下将问题大小减少一半。

现在,您是否必须将问题大小减少一半,实际上是没有。即使算法可以将问题搜索空间降低0.0001%,只要百分比和减少问题大小的操作保持恒定,即使它可以将问题搜索空间降低0.0001%,也就是$ o( o() log n)$算法,它不会是快速算法,但是它仍然是$ o( log n)$,具有很大的常数。 (假设我们正在谈论$ log n $带有基本2日志)

考虑将小数$ n $转换为二进制的算法

while n != 0:
   print n%2, 
   n = n/2

这个 while 循环运行$ log(n)$ times。

是的,$ log(n)$在$ 1 $和$ n $之间,但是比$ n $接近$ 1 $。什么是$ log(n)$?日志函数是指数的逆函数。让我从指数开始,您应该更好地了解对数是什么。

考虑两个数字,$ 100 $和$ 2^{100} $。 $ 2^{100} $是$ 2 $乘以自己的$ 100 $倍。您可以努力计数$ 100 $数字,但是您可以计算$ 2^{100} $吗?我敢打赌你不能。为什么? $ 2^{100} $是一个很大的数字,以至于它比宇宙中所有原子的数量大。一会儿反思。这是一个很大的数字,它允许您给每个原子一个名称(编号)。手指指甲中的原子数可能是数十亿美元的。 $ 2^{100} $应该对任何人都足够(双关码:)。

现在,在两个数字之间,$ 100 $和$ 2^{100} $,$ 100 $是$ 2^{100} $的对数(基本$ 2 $)。 $ 100 $比$ 2^{100} $相对小。任何人都应该在家中拥有100美元的不同物品。但是,$ 2^{100} $对宇宙足够好。当想到$ log(n)$和$ n $时,请考虑主页与宇宙。

指数和对数从何而来?他们为什么对计算机科学如此感兴趣?您可能不会注意到,但是指数无处不在。您是否支付了信用卡的利息?您只是为您的房屋支付了一个宇宙(还不错,但曲线适合)。我喜欢认为指数来自产品规则,但欢迎其他人提供更多示例。您可能会问什么产品规则;我会回答。

假设您有两个城市$ a $ and $ b $,它们之间有两种方法。它们之间的路径数是多少?二。那是微不足道的。现在说,还有另一个城市$ c $,您可以通过三种方式从$ b $到$ c $。 $ a $ a $ c $之间有几条路径?六,对吗?你是怎么得到的?你数了吗?还是您乘以它们?无论哪种方式,都可以很容易地看到两种方式给出了类似的结果。现在,如果您添加一个城市$ d $,可以从$ c $以四种方式达到$ c $,那么$ a $ a $ d $之间有几种方式?计数如果您不信任我,但它等于$ 2 cdot 3 cdot 4 $,即$ 24 $。现在,如果有十个城市,并且从一个城市到另一个城市都有两条路径,那么它们的安排就像他们在一条直线上一样。从头到尾有多少路?如果您不信任我,将它们乘以它们,但是我会告诉您有$ 2^{10} $,为$ 1024 $。请参阅$ 2^{10} $是$ 10 $的指数结果,$ 10 $是$ 2^{10} $的对数。 $ 10 $是少量数字,而$ 1024 $。

对数函数$ log_2(n)$是$ n $ $ n $ to $ n $ to $ 2^n $(请注意,$ 2 $是对数的基础)。如果您将$ log_b(n)$与自身$ b $ times(请注意,$ b $是对数的基础),您会得到$ n $。 $ log(n)$很小,与$ n $相比,它很小,以至于您的房屋的大小是$ n $是宇宙的大小。

实际上,$ log(n)$函数执行与常数功能非常相似。它们确实会随$ n $增长,但是它们的增长非常缓慢。如果您优化了一个以对数时间运行的程序,该程序在一天前需要进行,则可能会以几分钟的顺序运行。在Euler项目上是否有问题检查自己。

为了继续您的主题,$ o( log n)$就像反复猜测$ x $位于列表中的位置,并被告知“更高”或“较低”(就索引而言)。

它仍然基于列表的大小,但是您只需要访问元素的一小部分即可。

如果我们有一个 划分和征服算法, ,我们只提出一个递归呼吁,要求一个子问题,这是第二种情况 师父定理, ,即非收回部分的时间复杂性为$ theta( lg^kn)$,那么算法的复杂性将为$ theta( lg^{k+1} n)$。

换句话说,当我们有一个划分和征服算法并在一个问题上汇总呼吁自我的问题,而不是当前问题的恒定因素,而非收回部分的时间为$ theta(1)$(constand ),那么算法的运行时间将为$ lg n $。

二进制搜索 算法是经典示例。

直觉是您可以将数字减少到1个为1的o(lg n)之前,将其切成数字,例如n。

要进行可视化,请尝试将其绘制为二进制树,并通过求解此几何进程来计数级别的数量。

2^0+2^1+...+2^h = n
许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top