2013-02-23 119 views
2

我想知道如何计算O(Log(N)): 我们有一个10个元素的排序数组[1 3 4 8 10 15 18 20 25 30] 当我们进行正常搜索时,我们复杂度为O(10),这意味着我们必须检查数组的每一个情况,所以O(10)= 10. 但是如果我们进行二分搜索,因为我们有一个排序数组,我们的复杂度为(O日志(10))什么是这个符号0的结果(日志(10))= ???? 我有一个missunderstand我们将使用Log基地10或2或究竟是什么? 感谢您的帮助如何计算O(Log(N))?

回答

8

您误解了算法增长的顺序的概念。请阅读关于算法的书籍,并强化您的概念。在任何情况下,我会尝试在高层次上进行解释,如果你有一个像你说的10个元素的数组,并且你做了一个“正常搜索”(这就是所谓的线性搜索),你正在遍历每一个元素数组,这意味着如果有'n'个元素'n'元素必须被检查。所以它是O(n)而不是O(10)。如果它是O(10)[btw,O(10)= O(1)],这意味着它总是需要10次迭代或更少,不管该阵列中有多少元素,情况并非如此。如果数组有100个元素,则需要100次迭代,所以我们说的顺序是O(n),其中n是输入大小(这里是数组的大小)。

上述方法适用于非排序数组,我们可以使用更快的方法进行搜索,就像在字典中查找单词一样,这种技术称为二进制搜索。这里发生的是,你查看数组的中间元素,看看你正在寻找的谎言的位置,无论是在上半年还是下半年。然后,你选择你想要的一半,并应用相同的方法分成一半和检查。由于这是递归执行的,它使用对数增长(在二进制搜索的情况下,它是以2为底的日志)。请阅读二进制搜索和对数增长的顺序以便更好地理解。

+0

感谢,我的问题是我有一个我想解决一个算法问题,但我有1GHz的CPU以2秒执行的约束,所以我不知道如何精确计算的复杂性要知道,如果我的算法是正确与否当我有我想计算O(日志(N))我被阻止 – satyres 2013-02-23 19:05:54

+1

@satyres:阅读“*增长*”,无论是从书籍或在线。只有这样才能帮助你更好地理解。你的想法是非常错误的。 – 2013-02-23 19:09:34

+0

你能给我一个链接吗! – satyres 2013-02-23 19:14:12

2

恐怕不是渐近线如何工作,Big-O符号旨在描述算法如何针对可变尺寸输入进行缩放,特别是n算法在固定输入上所需的操作数目(如上所述)总是恒定的,即O(1)。同样,大O符号对恒定的乘法是不变的。这意味着:

  • O(1)= O(10)= O(日志(10))
  • 您的对数的基础不要紧,因为改变基仅引入一个常数因子
+0

感谢您的评论,在正常的阵列,以搜索项目我有充分的情况下,所以O(10)= 10右后看!但是对于二分体O(Log(10)),结果如何?谢谢?对于评论 – satyres 2013-02-23 18:58:46

0

我有一个missunderstand我们将使用日志基地10或2或究竟

没关系。复杂性不会改变。对数基2与

Log_2(N) = Log(N)/Log(2) 

两者都是O(Log(N))的元素。

2

我认为你为什么二进制搜索是log(n)以及它为什么是基数为2而感到困惑。想想看,在你的二进制搜索的每一步,你都会将输入大小减少2。你需要多少次这样做?你需要做2次这样的记录,以便将样本大小减少到1。

例如,如果您有4个元素,第一步将搜索减少到2,第二步将搜索减少到1你停下来。因此你必须将它记录(4)到基数2 = 2次。换句话说,如果log n base 2 = x,则2次幂x是n。

所以,如果你正在做一个二进制搜索你的基地将是2更清晰,你的情况日志(10)基地2将是东西3.3左右即你将最多4个比较来进行。

+0

虽然我不反对其他答案,这一个接近解决问题。和@satyres一样关于算法课程,麻省理工学院的讲座会很好。或者尝试一下梦幻般的可汗学院,我认为他们也应该有这方面的话题 – 2013-08-11 18:08:50

相关问题