【基础知识】

位运算

位运算(\(Bitwise Operations\))是一种直接对二进制位进行操作的运算方式。在 \(C++\) 中,位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。这些运算符在处理二进制数据时非常有用,尤其是在需要高效处理数据或进行底层操作时。

1. 左移运算符(<<

逻辑:左移运算符将一个数的二进制表示向左移动指定的位数,右侧用零填充。

语法

a << n
  • a 是要进行左移的数。
  • n 是要左移的位数。

示例

int a = 5;  // 二进制表示为 0000 0101
int b = a << 2;  // 左移2位,结果为 0001 0100,即十进制的 20

\(a << n\) 即为 \(a * (2^n)\)

解释

  • 5 的二进制表示是 0000 0101
  • 左移2位后,变为 0001 0100,即十进制的 20

2. 右移运算符(>>

逻辑:右移运算符将一个数的二进制表示向右移动指定的位数,左侧用符号位填充(对于有符号数)或用零填充(对于无符号数)。

语法

a >> n
  • a 是要进行右移的数。
  • n 是要右移的位数。

示例

int a = 20;  // 二进制表示为 0001 0100
int b = a >> 2;  // 右移2位,结果为 0000 0101,即十进制的 5

\(a >> n\) 即为 \(a / (2^n)\)

解释

  • 20 的二进制表示是 0001 0100
  • 右移2位后,变为 0000 0101,即十进制的 5

3. 其他位运算符

  • 按位与(&:对两个数的每一位进行与操作。

    int a = 5;  // 二进制表示为 0000 0101
    int b = 3;  // 二进制表示为 0000 0011
    int c = a & b;  // 结果为 0000 0001,即十进制的 1
    
  • 按位或(|:对两个数的每一位进行或操作。

    int a = 5;  // 二进制表示为 0000 0101
    int b = 3;  // 二进制表示为 0000 0011
    int c = a | b;  // 结果为 0000 0111,即十进制的 7
    
  • 按位异或(^:对两个数的每一位进行异或操作。

    int a = 5;  // 二进制表示为 0000 0101
    int b = 3;  // 二进制表示为 0000 0011
    int c = a ^ b;  // 结果为 0000 0110,即十进制的 6
    
  • 按位取反(~:对一个数的每一位进行取反操作。

    int a = 5;  // 二进制表示为 0000 0101
    int b = ~a;  // 结果为 1111 1010,即十进制的 -6(在补码表示中)
    

应用场景

位运算在以下场景中非常有用:

  • 位掩码:通过位运算来设置、清除或检查特定位。
  • 高效计算:通过位运算可以实现某些高效的操作,如快速乘以或除以2的幂。
  • 数据压缩:通过位运算可以实现数据的压缩和解压缩。
  • 加密算法:某些加密算法中会使用到位运算。

常用思想

算法设计中常用的思想有很多,以下是一些常见的算法设计思想:

1. 分治法(Divide and Conquer)

  • 思想:将问题分解为若干个规模较小的相同子问题,递归地解决这些子问题,然后将子问题的解合并得到原问题的解。
  • 应用:归并排序、快速排序、二分查找、大整数乘法等。

2. 动态规划(Dynamic Programming)

  • 思想:将问题分解为重叠的子问题,通过存储子问题的解来避免重复计算,从而提高效率。
  • 应用:最长公共子序列、背包问题、斐波那契数列、最短路径问题等。

3. 贪心算法(Greedy Algorithm)

  • 思想:在每一步选择中都采取在当前状态下最优的选择,希望通过局部最优解达到全局最优解。
  • 应用:霍夫曼编码、最小生成树(Prim算法、Kruskal算法)、活动选择问题等。

4. 回溯法(Backtracking)

  • 思想:通过逐步构建问题的解,并在构建过程中进行试探和回退,以找到所有可能的解。
  • 应用:八皇后问题、数独、组合问题、排列问题等。

5. 分支限界法(Branch and Bound)

  • 思想:类似于回溯法,但在搜索过程中通过剪枝来减少搜索空间,通常用于求解最优化问题。
  • 应用:旅行商问题、背包问题、最大团问题等。

6. 递归(Recursion)

  • 思想:通过将问题分解为更小的子问题,并递归地解决这些子问题,直到达到基本情况。
  • 应用:阶乘计算、斐波那契数列、树的遍历等。

7. 迭代(Iteration)

  • 思想:通过循环重复执行一组操作,直到满足某个条件为止。
  • 应用:循环排序、矩阵乘法、迭代求解方程等。

8. 随机化(Randomization)

  • 思想:在算法中引入随机性,以期望获得更好的性能或避免最坏情况。
  • 应用:快速排序的随机化版本、随机化选择算法、Monte Carlo算法等。

9. 近似算法(Approximation Algorithm)

  • 思想:在多项式时间内找到一个接近最优解的解,而不是最优解。
  • 应用:旅行商问题的近似算法、背包问题的近似算法等。

10. 图算法(Graph Algorithms)

  • 思想:专门用于处理图结构的问题,如最短路径、最小生成树、拓扑排序等。
  • 应用:Dijkstra算法、Kruskal算法、Floyd-Warshall算法、拓扑排序等。

11. 线性规划(Linear Programming)

  • 思想:通过线性方程和不等式来描述问题,并求解最优解。
  • 应用:资源分配问题、运输问题、生产计划问题等。

12. 启发式算法(Heuristic Algorithms)

  • 思想:通过启发式规则或经验来指导搜索过程,通常用于解决NP难问题。
  • 应用:模拟退火、遗传算法、蚁群算法等。

13. 双指针(Two Pointers)

  • 思想:使用两个指针在数组或链表中移动,以解决某些特定问题。
  • 应用:两数之和、三数之和、链表中的环检测等。

14. 滑动窗口(Sliding Window)

  • 思想:通过固定大小的窗口在数据结构上滑动,以解决某些连续子数组或子序列问题。
  • 应用:最长无重复子串、最小覆盖子串、最大子数组和等。

15. 位运算(Bit Manipulation)

  • 思想:通过操作二进制位来解决某些特定问题,通常用于优化时间和空间复杂度。
  • 应用:位掩码、位计数、位翻转等。
posted @ 2024-10-18 23:43  To_Carpe_Diem  阅读(15)  评论(0编辑  收藏  举报