是不是n是log n?

时间:2015-10-19 12:49:41

标签: algorithm data-structures

考虑一个问题有两种解决方案。

  1. 执行n / 2次,即。如果n = 100则执行50次
  2. 在sqrt中执行n次,即。如果n = 100则执行10次。
  3. 这两个解决方案是否可以被称为 O(log N)

    如果是这样,那么N和N / 2的sqrt之间存在巨大差异。

    如果我们不能说O(log N)那么我们可以说它是N吗?

    但问题是这两者之间的差异。通过下面的图像,算法应该出现在这些问题中的任何一个,在这些问题下,这些解决方案将会出现吗?

    enter image description here

    请帮我解决这个问题。

3 个答案:

答案 0 :(得分:6)

考虑这三种情况。

  1. 执行n/2次。这意味着每次我们将n增加100倍,执行时间就会增加100倍。

  2. 执行sqrt(n)次。这意味着每次我们将n增加100倍,执行时间就会增加10倍。

  3. 执行log(n)次。这意味着每当我们将n增加100倍时,执行时间就会增加一定量。

  4. 不,这三件事情甚至都差不多。第一个比第二个差得多。第三个比第二个好得多。

答案 1 :(得分:1)

它们都不是O(logn)

以下是O(logn)Binary search algorithm

的示例

答案 2 :(得分:0)

最佳算法是您拥有的数据的最佳算法。如果您不知道自己拥有哪些数据,请考虑大量数据,例如n = 10亿。你会选择O(31623)还是O(5000000000)?绘制比较图并找出数据大小的位置。

如果您的数据集是n = 4,那么任一算法都是相同的。如果您了解详细信息,由于它执行的操作,实际上sqrt(n)算法可能需要更长的时间。

你可以拥有最快的O(1)。一个这样的例子是在哈希映射中查找,但是你的内存大小可能会受到影响。所以你应该考虑空间限制和时间限制。

您也会误解并过度分析复杂性分类。 O(n)算法不是用n个操作执行的算法。任何常数乘数都不会影响分类顺序。重要的是当问题增长时,操作数量的增加。考虑两种搜索算法。

A) Scan a sorted list sequentially from index 0 to (n-1) to find the number.

B) Scan a sorted list from from index 0 to (n-1), skipping by 2, and backtracking if necessary.

显然,A最多需要n次操作,而B需要n / 2 + 1次操作。但他们都是O(n)。你可以说算法B更快,但我可以在我的机器上运行它,速度是原来的两倍。因此,复杂性是一般的类,人们不应该对操作的细节过于挑剔。

如果您正在尝试开发更好的算法,那么搜索具有更好复杂性类的算法比使用稍微少一些算法的算法更有用。