之前一直对O(logN)这个复杂度如何推导出的存在疑问,这段时间看了一些算法相关的内容,正好看到这个问题,大略研究了一下算是基本解答了我的疑惑;现记录如下
假设有一棵高为H的满二叉树,则它的节点共有N = 2H-1个;
假设需要搜索这棵二叉树中是否存在某个元素,那么对于本次搜索而言,最坏的情况即是搜索到最后一层;那么对于最坏的搜索情况而言,一共会搜索H次(即这棵树的高度);
以上是前提条件
因为 N = 2H-1,即树的节点数
又 log2N = log22H-1 = H - 1
且 对于H极大的情况而言,-1可忽略不计
所以 搜索次数 H ≈ log2N
由换底公式可得:log2N = logAN/logA2
因为 A是某一给定的数
所以 1/logA2为一常数
所以 log2N = logAN/logA2 = ClogAN
所以 O(log2N) = O(ClogAN) = O(logAN)
所以 对任何底数A,复杂度均可化为O(log2N)
即 对于任何A叉树,搜索该树中某一个元素是否存在的复杂度均为O(log2N)
因此 可简化为O(logN)
如果有一大小为N的数组,搜索该数组中的元素是否存在与某树中,该算法的复杂度为O(NlogN)
最后给出复杂度的大小关系:
O(1) < O(logN) < O(√N) < O(N) < O(NlogN) < O(N2) < O(N3) < O(2N) < O(N!)