之前一直对O(logN)这个复杂度如何推导出的存在疑问,这段时间看了一些算法相关的内容,正好看到这个问题,大略研究了一下算是基本解答了我的疑惑;现记录如下

假设有一棵高为H的满二叉树,则它的节点共有N = 2个;

假设需要搜索这棵二叉树中是否存在某个元素,那么对于本次搜索而言,最坏的情况即是搜索到最后一层;那么对于最坏的搜索情况而言,一共会搜索H次(即这棵树的高度);

以上是前提条件

      因为      N = 2,即树的节点数

      又         logN = log2 = H - 1

      且         对于H极大的情况而言,-1可忽略不计

      所以      搜索次数 H ≈ logN

      由换底公式可得:logN = logN/log2

      因为      A是某一给定的数

      所以      1/log2为一常数

      所以      logN = logN/log2 = ClogN

      所以      O(logN) = O(ClogN) = O(logN)

      所以      对任何底数A,复杂度均可化为O(logN)

      即         对于任何A叉树,搜索该树中某一个元素是否存在的复杂度均为O(logN)

      因此      可简化为O(logN)

如果有一大小为N的数组,搜索该数组中的元素是否存在与某树中,该算法的复杂度为O(NlogN)

最后给出复杂度的大小关系:

O(1) < O(logN) < O(√N) < O(N) < O(NlogN) < O(N) < O(N) < O(2) < O(N!)

05-18 20:45