我想知道如何计算此例子的O(Log(N)): 我们有一个10个元素的排序数组[1 3 4 8 10 15 18 20 25 30] 当我们进行正常搜索时,我们有O(10)的复杂性,这意味着我们必须检查数组的每个情况,因此O(10)= 10。 但是如果我们进行二分法搜索,因为我们有一个排序数组,我们有一个复杂度(O(Log(10))这个符号O(Log(10))= ???的结果是什么? 我有一个误解我们应该使用Log base 10或2还是究竟是什么? 谢谢你的帮助
答案 0 :(得分:12)
您误解了算法增长顺序的概念。请阅读一本关于算法的书,让你的概念变得强大。在任何情况下,我都会尝试高级解释,
如果你有一个像你所说的10个元素的数组,并且你进行了“普通搜索”(它被称为线性搜索),你将遍历数组中的每个元素,这意味着如果有'n'个元素'必须检查n'元素。所以它是O(n)而不是O(10)。如果它是O(10)[btw,O(10)= O(1)]意味着它总是需要10次或更少次迭代,无论数组中有多少元素,情况都不是这样的。如果你的数组有100个元素,那么需要100次迭代,所以我们说顺序是O(n),其中n是输入大小(这里是数组的大小)。
上面的方法适用于非排序数组,对于排序数组,我们可以使用更快的方法进行搜索,就像在字典中查找单词一样,这种技术称为二进制搜索。这里发生的是,你查找数组的中间元素,看看你要搜索的数字在哪里,无论是在上半部分还是下半部分。然后,选择所需的一半,并应用相同的方法将其分成两半并进行检查。由于这是递归完成的,因此它使用对数增长(在二进制搜索的情况下,它是log 2到base 2)。请阅读二进制搜索和对数增长顺序,以便更好地理解。
答案 1 :(得分:4)
我认为你很困惑为什么二进制搜索是log(n)以及为什么它是基础2.想一想,在你的二进制搜索的每一步,你都将输入大小减少了2倍。你需要这样做吗?您需要对基数进行2次登录,以便将样本量减少到1。
例如,如果您有4个元素,第一步将搜索范围缩小为2,第二步将搜索范围缩小为1,然后停止。因此,您必须将log(4)记录到基数2 = 2次。换句话说,如果log n base 2 = x,则上升到幂x的2是n。
因此,如果你正在进行二元搜索,你的基数将是2.更明显的是,在你的情况下,Log(10)base 2将是3.3左右,即你将进行最多4次比较。
答案 2 :(得分:2)
我担心这不是渐近线的工作方式。 Big-O表示法旨在描述算法如何针对可变大小输入进行缩放。特别是,算法对固定输入(如上所述)所需的操作数总是恒定的,即O(1)。类似地,big-O表示法对常数乘法不变。这意味着:
答案 3 :(得分:0)
我有一个误解我们应该使用Log base 10或2或者究竟是什么
没关系。复杂性不会改变。日志库2与:
相同Log_2(N) = Log(N) / Log(2)
两者都是O(Log(N))
。
答案 4 :(得分:0)
好吧,O标记不能给出复杂度函数的确切值。它给出了增长率。如果您这样说
T( n )= O(lg n )
表示,如果您增加 n ,则时间算法需要搜索 n 个元素的数组,其增长不会快于lg n 。
您提出的问题应以不同的方式提出。您可能要问的问题是,算法需要搜索多少个迭代(或递归)步骤才能遍历 n 元素数组。
这个问题的答案是算法只需要
( int )(lg n )
步骤。
因此,如果您有10个元素组成的数组,则算法将在不超过lg 10 = 3个迭代步骤的情况下找到请求的值(或发现数组中不存在该值)。