O for Eight Year Olds?

This question already has an answer here:

  • What is a plain English explanation of “Big O” notation? 37 answers

  • One way of thinking about it is this:

    O(N^2) means for every element, you're doing something with every other element, such as comparing them. Bubble sort is an example of this.

    O(N log N) means for every element, you're doing something that only needs to look at log N of the elements. This is usually because you know something about the elements that lets you make an efficient choice. Most efficient sorts are an example of this, such as merge sort.

    O(N!) means do something for all possible permutations of the N elements. Traveling salesman is an example of this, where there are N! ways to visit the nodes, and the brute force solution is to look at the total cost of every possible permutation to find the optimal one.


    The big thing that Big-O notation means to your code is how it will scale when you double the amount of "things" it operates on. Here's a concrete example:

    Big-O       |  computations for 10 things |  computations for 100 things
    ----------------------------------------------------------------------
    O(1)        |   1                         |     1
    O(log(n))   |   3                         |     7
    O(n)        |  10                         |   100
    O(n log(n)) |  30                         |   700
    O(n^2)      | 100                         | 10000
    

    So take quicksort which is O(n log(n)) vs bubble sort which is O(n^2). When sorting 10 things, quicksort is 3 times faster than bubble sort. But when sorting 100 things, it's 14 times faster! Clearly picking the fastest algorithm is important then. When you get to databases with million rows, it can mean the difference between your query executing in 0.2 seconds, versus taking hours.

    Another thing to consider is that a bad algorithm is one thing that Moore's law cannot help. For example, if you've got some scientific calculation that's O(n^3) and it can compute 100 things a day, doubling the processor speed only gets you 125 things in a day. However, knock that calculation to O(n^2) and you're doing 1000 things a day.

    clarification: Actually, Big-O says nothing about comparative performance of different algorithms at the same specific size point, but rather about comparative performance of the same algorithm at different size points:

                     computations     computations       computations
    Big-O       |   for 10 things |  for 100 things |  for 1000 things
    ----------------------------------------------------------------------
    O(1)        |        1        |        1        |         1
    O(log(n))   |        1        |        3        |         7
    O(n)        |        1        |       10        |       100
    O(n log(n)) |        1        |       33        |       664
    O(n^2)      |        1        |      100        |     10000
    

    You might find it useful to visualize it:

    大O分析

    Also, on LogY/LogX scale the functions n1/2, n, n2 all look like straight lines, while on LogY/X scale 2n, en, 10n are straight lines and n! is linearithmic (looks like n log n).

    链接地址: http://www.djcxy.com/p/40008.html

    上一篇: O(logn)总是一棵树吗?

    下一篇: O八岁?