我相信我对,和这样的复杂性有一定的了解。Θ (n )Θ (n 2)
就列表而言,是一个常量查找,因此它只是成为列表的开头。 是我遍历整个列表的位置,而对于列表中的每个元素遍历该列表一次。Θ (n )Θ (n 2)
除了只知道位于和之间,有没有类似的直观方法来掌握它?Θ (n )
我相信我对,和这样的复杂性有一定的了解。Θ (n )Θ (n 2)
就列表而言,是一个常量查找,因此它只是成为列表的开头。 是我遍历整个列表的位置,而对于列表中的每个元素遍历该列表一次。Θ (n )Θ (n 2)
除了只知道位于和之间,有没有类似的直观方法来掌握它?Θ (n )
Answers:
的复杂性通常与细分连接。以列表为例时,请想象一个列表,其元素已排序。您可以在O(log n )时间内在此列表中搜索-由于列表的排序性质,实际上您不需要查看每个元素。
如果查看列表中间的元素并将其与搜索的元素进行比较,则可以立即说出它是位于数组的左半边还是右半边。然后,您可以只取一半,然后重复该过程,直到找到它或找到一个列表,其中包含一项要比较的项目。
您可以看到列表有效地将每一步减半。这意味着,如果获得长度为的列表,则到达一个项目列表的最大步骤为5。如果您有128 = 2 7个项目的列表,则只需要7步;对于1024 = 2 10的列表,则只需10个步,依此类推。
正如你可以看到,指数在2 ñ始终显示的必要步骤。对数用于精确地“提取”该指数,例如log 2 2 10 = 10。它还可以概括列出不是2的幂的长度。
O(log n)
在列表具有恒定时间随机访问的情况下。在更典型的列表实现(链接列表)上,这是O(n log n)
就(平衡)树而言(例如,二叉树,因此所有均以2为底):
为了使成为可能,您需要能够通过恒定时间操作相对于n按比例任意减小问题大小。
例如,对于二进制搜索,您可以通过每次比较操作将问题大小减少一半。
现在,您是否必须将问题大小减少一半,实际上没有。即使可以将问题搜索空间减少0.0001%,该算法也是,只要它用于减少问题大小的百分比和用于运算的常量保持不变,它就是O (log n )算法,它不会是一个快速的算法,但是它仍然是O (log n ),具有很大的常数。(假设我们正在讨论以2为底的log n)
考虑将十进制数转换为二进制的算法
while n != 0:
print n%2,
n = n/2
此while
循环运行次。
是的,在1到n之间,但比n更接近1。什么是log (n )?对数函数是指数的反函数。让我从指数开始,您应该对对数有一个更好的了解。
考虑两个数字和2 100。2 100是2乘以自己100倍。您可以尽力计算100个数字,但是可以计算2 100个数字吗?我敢打赌你不能。为什么?2 100是一个很大的数字,它大于宇宙中所有原子的数目。反思一下。它是一个巨大的数字,它使您可以为每个原子命名(数字)。指甲中的原子数量可能约为数十亿个。 2 100应该足以容纳任何人(双关语:))。
现在,在两个数字和2 100之间,100是2 100的对数(以2为底)。100比2 100小得多。任何人都应该在家中拥有100种不同的物品。但是,对于宇宙来说2 100就足够了。在考虑对数(n )和n时,请考虑家与宇宙。
指数和对数从哪里来?他们为什么对计算机科学如此感兴趣?您可能没有注意到,但是无处不在。您是否支付了信用卡利息?您只需为自己的房屋支付了费用(还算不错,但是曲线很合适)。我喜欢认为指数来自产品规则,但也欢迎其他人提供更多示例。您可能会问什么是产品规则?我会回答。
假设您有两个城市和B,它们之间有两种选择。它们之间的路径数是多少?二。那是微不足道的。现在说,还有另一个城市C,您可以通过三种方式从B到C。现在A和C之间有多少条路径?六对吧 你是怎么得到的?你数了吗?还是您将它们相乘?无论哪种方式,都很容易看出两种方式都给出相似的结果。现在,如果您添加可以通过四种方式从C到达的城市D,那么A和D之间有多少种方式?计数,如果你不相信我,但它是等于是24。现在,如果有十个城市,并且从一个城市到下一个城市有两条路径,它们的排列方式就好像它们是一条直线。从头到尾有几条路?如果您不信任我,请乘以它们,但我会告诉您有2 10,即1024。看到,2 10是指数结果10和10是对数2 10。与1024相比,10是一个很小的数字。
对数函数对n等于n对2 n(注意2是对数的底数)。如果您multipy 登录b(ñ )与自身b倍(注意,b是对数的底)你ñ。log (n )非常小,与n相比是如此之小,以至于它是房屋的大小,其中n是宇宙的大小。
实际上,函数的执行与常量函数非常相似。它们的确以n增长,但是增长非常缓慢。如果您将程序优化为以耗时一天进行的对数时间运行,则可能会在几分钟内运行它。检查有关Euler项目的问题。