快速幂原理及伪代码

应用场景是求解M^{n}形式的连续幂次元算,M可以是数值或矩阵形式。经典算法题为斐波那契数列问题。

快速幂的核心思想是将n以二进制方式表示成n=\sum_{i=0}^{\left \lceil \log_{2}{n}\right \rceil} a_{i}*2^{i},则所要求解的原式可以表示为M^{\sum_{i=0}^{\left \lceil \log_{2}{n}\right \rceil} a_{i}*2^{i}} = \prod_{i=0}^{\left \lceil \log_{2}{n}\right \rceil} M^{a_{i}*2^{i}}a_{i}取值为0或1取决于二进制表示的n在i位的值,a_{i} = (n>>i) \&1i=0,base=M; i=1, base=M^2; i=2, base=M^4,......。可以看到随着i增加1则base为上一个的平方。亦可从公式推导\frac{M^{2^{i+1}}}{M^{2^i}} = M^{2^i}

按上述原理可写成如下的代码,其中multiply是所有可乘的方法的抽象表示,例如数值乘,矩阵乘。

时间复杂度:O(\log n)

空间复杂度:O(1)

result = 1; // 或I单位矩阵
base = M;
while (n > 0) {
  if (n & 1) { // a_i = 1
    result = multiply(result, base);
  }
  base = multiply(base, base);
  n >> 1;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序(Quicksort)是一种基于比较的排序算法,它的基本思想是通过划分(partition)将一个序列分成两个子序列,其中一个子序列的所有元素都小于另一个子序列的所有元素,然后递归地对这两个子序列进行排序。 下面是C语言快速排序的伪代码和流程图: 伪代码: ``` quickSort(arr[], low, high) { if (low < high) { // 划分并获取分割点 pivot = partition(arr, low, high); // 递归对左子序列进行排序 quickSort(arr, low, pivot - 1); // 递归对右子序列进行排序 quickSort(arr, pivot + 1, high); } } partition(arr[], low, high) { // 取第一个元素作为枢轴值 pivot = arr[low]; while (low < high) { // 从右往左找第一个小于枢轴值的元素 while (low < high && arr[high] >= pivot) high--; // 将该元素移到左边 arr[low] = arr[high]; // 从左往右找第一个大于枢轴值的元素 while (low < high && arr[low] <= pivot) low++; // 将该元素移到右边 arr[high] = arr[low]; } // 将枢轴值放入其最终位置 arr[low] = pivot; // 返回分割点 return low; } ``` 流程图: ``` +--------------+ | quickSort | | arr, low, | | high | +------+-------+ | | v +----+----+ | partition| | arr, low| | high | +----+----+ | | v +---------------+----------------+ | | v v +--------+-------+ +--------+-------+ | quickSort(arr, | | quickSort(arr, | | low, pivot- | | pivot+1, | | 1) | | high | +----------------+ +----------------+ ``` 其中,`quickSort()`函数用于递归地对子序列进行排序,`partition()`函数用于划分序列并返回分割点。在`partition()`函数中,首先选择第一个元素为枢轴值,然后使用两个指针从序列两端开始扫描,不断交换左右两端的元素,直到指针相遇,此时分割点即为指针的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值