之前一直对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!)