一种时间复杂度为 log(n) 的模糊查询算法!
本算法为本人在痛苦中摸索出来!应该有前人早已得出相同或类似算法。
本算法不打算写出,只写出它的时间和空间复杂度分析!这个算法可以用折半查找实现,也可以用平衡树查找实现。本人认为用平衡树最为完美,可以动态加入记录,又可以在最坏情况下用 log(n) 的时间复杂度查出结果。为了描述简单而又不失算法的精髓,暂时不考虑有重复记录的情况。
——本人在有重复记录,但仍是有序的集合中,可以用折半法和平衡树实现快速查找。
如果一个数据库有 n(如 n=10^8) 篇文章,每篇文章有 m(如 m=1^3) 个字符,那么在这个数据库中查询任何一个字符串,所用时间只有 m*log2(n) ,还有一个算法,如果用户输入的字符串只由无空格的单词组成,而每个单词平均只有 k (如
k=8) 个字符,那么,时间复杂度可以进一步降至 k*log2(m*n) .
不过,第一种算法需要 m*n*addressbytes 的空间代价,
或相当于 addressbyets 倍于文章自身的空间代价。
第二种算法需要 m*n*(addressbyte+ceil((log2(k))/8)) 的空间代价,
或相当于 ceil(addressbyets)+ceil(ceil(log2(k))/8)
倍于文章自身的空间代价。
如果 n=10^8 , m=10^3 , k=8 , addressbytes = 4
则对第一种算法:
时间复杂度为: 10^3*log2(10^8) = 26576
空间代价为 : 10^11 * 4 = 4*10^11 ,
或相当于 4 倍于文章自身的空间代价。
对第二种算法:
时间复杂度为: 8*log2(10^3*10^3) = 293
空间代价为 : 10^11 * 4+375*10^8 =4.00375*10^11
或相当于 4+1=5 倍于文章自身的空间代价。