1、快速幂求解
假设要求a^b,按照一般的思路就是把a连乘b次,很显然时间复杂度为O(n),而快速幂能却能达到O(logn),其的原理如下:
假设要求a^b,其实b是可以用二进制表示的,该二进制数第i位的权为2^(i-1),例如当b=11时,11的二进制为1011,即11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,于是有a^11=a^(2^0+2^1+2^3),即可将a^11转化为算 a^(2^0)*a^(2^1)*a^(2^3) ,总体来说快了很多,原来需算11次,而现在只需算3次。
对于处理二进制数,一般很会想到用位运算这个强大的工具: & 和 >> ,&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取该二进制的最末位,同时还可以判断该数的奇偶 x&1==0 为偶,x&1==1为奇。>>运算为移位运算符,将二进制的最后一位去掉。
具体代码如下:
int QuickPow(int a,int b){
int result = 1, base = a;
while( b != 0 ){
//当二进制位为1时,将更新后的base累乘到result中
if( b&1 != 0 )
result = result * base;
//只要b不为0,就要更新base
base = base * base;
//通过右移遍历所有的二进制位
b = b >> 1;
}
return result;
}
2、简述C++虚函数作用及底层实现原理
要点是要答出虚函数表和虚函数表指针的作用。C++中虚函数使用虚函数表和 虚函数表指针实现,虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地 址,假如子类的虚函数重写了父类的虚函数,则对应在虚函数表中会把对应的虚函数替换为子类的 虚函数的地址;虚函数表指针存在于每个对象中(通常出于效率考虑,会放在对象的开始地址处), 它指向对象所在类的虚函数表的地址;在多继承环境下,会存在多个虚函数表指针,分别指向对应 不同基类的虚函数表。
3、C++的set与map的实现方式?以及map的find函数返回的类型?
set与map的底层实现是平衡二叉树红黑树来实现的,unordered_map与unordered_set的底层实现是哈希表;
map的find函数返回的类型迭代器类型;
日积月累,与君共进,增增小结,未完待续。