预排序的优势分析
以下均设 x x x为需要查找的数的个数。
预排序后二分查找的总运算次数
用归并排序,最坏的情况是最坏排序时间加最坏查找时间
T
1
=
n
l
o
g
2
n
+
x
l
o
g
2
n
T_1=nlog_2n+xlog_2n
T1=nlog2n+xlog2n
不排序查找的总运算次数
最坏的情况是
T
2
=
x
n
T_2=xn
T2=xn
比较
把n看做常数,当
T
1
<
T
2
T_1<T_2
T1<T2时有
n
l
o
g
2
n
+
x
l
o
g
2
n
<
x
n
nlog_2n+xlog_2n<xn
nlog2n+xlog2n<xn
解不等式求出
x
>
n
l
o
g
2
n
n
−
l
o
g
2
n
x>\frac{nlog_2n}{n-log_2n}
x>n−log2nnlog2n
这个东西目测是
O
(
l
o
g
n
)
O(logn)
O(logn)级别的。为什么呢?
证明
函数
f
(
n
)
=
n
n
−
l
o
g
2
n
f(n)=\frac{n}{n-log_2n}
f(n)=n−log2nn的导数在n足够大时一定是正数,所以一定存在c>0,当
n
>
n
0
,
n
0
>
=
c
n>n_0,n_0>=c
n>n0,n0>=c时,
f
(
n
)
>
c
f(n)>c
f(n)>c,两边同时乘
l
o
g
2
n
log_2n
log2n得到
c
l
o
g
2
n
>
f
(
n
)
l
o
g
2
n
,
n
>
n
0
clog_2n>f(n)log_2n,n>n_0
clog2n>f(n)log2n,n>n0即
c
l
o
g
2
n
>
n
n
−
l
o
g
2
n
l
o
g
2
n
,
n
>
n
0
clog_2n>\frac{n}{n-log_2n}log_2n,n>n_0
clog2n>n−log2nnlog2n,n>n0符合O的定义。
所以
x
>
n
l
o
g
2
n
n
−
l
o
g
2
n
=
O
(
l
o
g
n
)
x>\frac{nlog_2n}{n-log_2n}=O(logn)
x>n−log2nnlog2n=O(logn)表明只要log级别的查询次数,预排序就会有明显的优势。