算法中的数论基础

算法中的数论基础

本篇文章适用于算法考试或比赛之前的临场复习记忆,没有复杂公式推理,基本上是知识点以及函数模版,涵盖取模操作、位运算的小技巧、组合数、概率期望、进制转换、最大公约数、最小公倍数、唯一分解定理、素数、快速幂等知识点

文章目录

  • 算法中的数论基础
    • 一、取模操作
    • 二、位运算的小技巧
        • 1.基础位运算
        • 2.给一个数n,确定它的二进制表示中的第x位是0还是一
        • 3.将一个数的二进制表示中的第x位修改为0或1
        • 4.位图的思想
        • 5.提取一个数(n)二进制中最右边的1
        • 6.干掉一个数(n)二进制表示中最右侧的1
        • 7.位运算的优先级
        • 9,异或运算
    • 三、组合数
      • 组合数的思想
      • 如何应用组合数
      • 注意事项
    • 四、概率论与期望集定义式
        • C++中的实现方法
          • 1. 直接计算期望(小规模问题)
          • 2. 动态规划(中等规模问题)
        • 注意事项与优化技巧
    • 五、进制转换
      • C++中进制转换详解(二进制、十进制、十六进制互转)
        • 一、核心方法总结
        • 二、具体实现方法
          • 1. 十进制 → 二进制
          • 2. 十进制 → 十六进制
          • 3. 二进制 → 十进制
          • 4. 十六进制 → 十进制
          • 5. 二进制 ↔ 十六进制(直接转换)
        • 三、应用场景与注意事项
    • 六、最大公约数,最小公倍数,唯一分解定理
        • 最大公约数(GCD)
        • 最小公倍数(LCM)
        • 唯一分解定理(质因数分解)
    • 七、素数
      • 素数判断方法
        • 1. 试除法(Trial Division)
      • 素数筛法
        • 1. 埃拉托斯特尼筛法(Sieve of Eratosthenes)
        • 2. 欧拉筛法(线性筛法)
    • 八、快速幂,费马小定理求逆元
      • 快速幂
      • 费马小定理求逆元
      • 注意事项
    • 九、排列组合,第二类斯特林数
      • 一、排列组合
        • 1. 概念
        • 2. 实现方法
      • 二、第二类斯特林数(Stirling Numbers of the Second Kind)
        • 1. 概念
        • 2. 实现方法
        • 3. 使用场景

一、取模操作

取模也叫取余,设 a,b 为两个给定的整数,a≠0。设 dd 是一个给定的整数。那么,一定存在唯一的一对整数 qq 和 rr,满足 b=qa+r,r<b。也就是我们很就学过的除法取余。

在编程语言中,我们常用 % 符号代表取模。

在比赛题目中,当结果非常大时,通常要求取模运算,取模有如下性质:

  • (a % M + b % M) % M = (a + b) % M
  • (a % M) * (b % M) % M = (a * b) % M

所以在编程比赛中,为了防止整数溢出,基本每进行一次运算就要一次取模,因此常常会看到:

(a * b % M + c) % M * d % M

注意:取模仅对加法和乘法满足上述性质,但是对除法不满足

二、位运算的小技巧

1.基础位运算

包括:<< >> ~ & | ^ 这些运算符的使用方法

2.给一个数n,确定它的二进制表示中的第x位是0还是一
if((n >> x) & 1)	return 1;
else return 0;
3.将一个数的二进制表示中的第x位修改为0或1
//修改为0
n = n & (~(1 << x))
//修改为1
n = n | (1 << x)
4.位图的思想

将一个变量的每一个二进制位看成一个标志位,这就像STM32中的寄存器一样,每一位存放不同的数代表不同的状态

5.提取一个数(n)二进制中最右边的1
n & (-n);

示例:

 0110101000//n1001010111//n的反码1001011000//加1之后的补码
&01101010000000001000
6.干掉一个数(n)二进制表示中最右侧的1
n & (n - 1);
7.位运算的优先级

对于位运算的优先级,能用括号就用括号

9,异或运算
//1. a ^ 0 = a;
//2. a ^ a = 0;
//3. a ^ b ^ c = a ^ (b ^ c);
  • a + b == 2 * (a & b) + (a ^ b)`:同学们可以尝试证明一下。
  • Lowbit(x) == x & (-x):获取整数 xx 的最低位。
  • a ^ b <= a + b :可通过位的异或性质具体证明。

三、组合数

组合数的思想

组合数C(n,k)表示从n个元素中选取k个元素的方案数,其核心在于无重复、无顺序的选择。这种思想常用于需要枚举所有可能组合或计算组合数量的场景。

如何应用组合数

  1. 直接计算组合数

    • 公式法:利用阶乘直接计算,但需注意溢出,适用于小规模数据。

      int combination(int n, int k) 
      {if (k > n) return 0;if (k == 0 || k == n) return 1;return combination(n - 1, k - 1) + combination(n - 1, k);
      }
      
    • 动态规划预处理:适用于多次查询,结合模运算避免溢出。

      const int MOD = 1e9 + 7;
      vector<int> fact, inv;// 计算 (a^b) % mod,使用快速幂算法
      int pow_mod(int a, int b, int mod) 
      {int ret = 1;a %= mod;  										// 确保 a 在 mod 范围内while (b > 0) {if (b % 2 == 1)   							// 如果当前二进制位为1,乘上对应的幂ret = (ret * 1LL * a) % mod;  			// 注意用 1LL 避免溢出a = (a * 1LL * a) % mod;  					// 平方并取模b /= 2;  									// 移动到下一个二进制位}return ret;
      }// 预处理阶乘和逆元
      void precompute(int max_n) 
      {fact.resize(max_n + 1);inv.resize(max_n + 1);fact[0] = 1;for (int i = 1; i <= max_n; ++i)fact[i] = (1LL * fact[i - 1] * i) % MOD;inv[max_n] = pow_mod(fact[max_n], MOD - 2, MOD); // 快速幂求逆元for (int i = max_n - 1; i >= 0; --i)inv[i] = (1LL * inv[i + 1] * (i + 1)) % MOD;
      }
      int C(int n, int k) 
      {if (k < 0 || k > n) return 0;return (1LL * fact[n] * inv[k] % MOD) * inv[n - k] % MOD;
      }
      

      注意:

      1. (1LL * fact[n] * inv[k] % MOD) * inv[n - k] % MOD;
  2. 生成所有组合

    • 回溯法:通过递归生成所有可能的组合。

      #include <vector>
      using namespace std;void dfs(int s, int n, int k, vector<int>& path, vector<vector<int>>& ret) 
      {if (path.size() == k) {ret.push_back(path);return;}// 提前剪枝:剩余元素不足以填满组合时提前终止for (int i = s; i <= n - (k - path.size()) + 1; ++i) {path.push_back(i);dfs(i + 1, n, k, path, ret);path.pop_back();}
      }vector<vector<int>> combine(int n, int k) 
      {vector<vector<int>> ret;vector<int> path;dfs(1, n, k, path, ret);return ret;
      }
      

注意事项

  • 溢出问题:当n较大时,直接计算阶乘会导致溢出,需使用模运算和预处理。
  • 效率考量:生成所有组合的时间复杂度为O(C(n,k)),应避免在n较大时使用。
  • 剪枝优化:在回溯过程中及时剪枝(如剩余元素不足时终止递归),提升效率。

四、概率论与期望集定义式

C++中的实现方法
1. 直接计算期望(小规模问题)
  • 场景:状态数少且概率明确的问题(如简单骰子问题)。

  • 示例代码

    double calculateDiceExpectation() {double expectation = 0.0;for (int i = 1; i <= 6; ++i) {expectation += i * (1.0 / 6.0);}return expectation; // 输出3.5
    }
    
2. 动态规划(中等规模问题)
  • 场景:状态转移具有概率依赖的问题(如随机游走、迷宫逃脱)。

  • 示例问题
    一个迷宫中有陷阱(概率( p )死亡)和出口(概率( 1-p )逃脱),求逃脱的期望步数。

  • 递推公式
    [
    E[i] = 1 + p \cdot E[\text{死亡}] + (1-p) \cdot E[\text{逃脱}]
    ]
    简化后:
    [
    E[i] = \frac{1}{1-p} \quad (\text{若死亡则期望为无穷大})
    ]

  • 代码实现

    double mazeEscapeExpectation(double p) {if (p >= 1.0) return INFINITY; // 必死情况return 1.0 / (1.0 - p);
    }
    
注意事项与优化技巧
  1. 浮点数精度问题
    • 使用double类型时,避免连续乘除导致精度损失。
  • 对精度敏感的问题可改用分数形式(如分子分母分开存储)。
  1. 状态压缩与记忆化

    • 当状态参数较多时,用位运算或哈希表压缩状态。
    • 示例
    unordered_map<State, double> memo;double dp(State s) {if (memo.count(s)) return memo[s];// 计算逻辑return memo[s] = result;}

五、进制转换

C++中进制转换详解(二进制、十进制、十六进制互转)

一、核心方法总结
转换方向标准库方法手动实现法应用场景
十进制 → 其他cout格式控制符、bitset除基取余法输出格式化、算法题快速实现
其他 → 十进制stoi()/stol()指定基数按权展开计算输入解析、自定义转换逻辑
二 ↔ 十六通过十进制中转或二进制分组转换四位二进制对应一位十六进制数据压缩、内存地址处理
二、具体实现方法
1. 十进制 → 二进制

方法1:使用 bitset(固定位数)

#include <bitset>
int num = 42;
cout << "二进制: " << bitset<8>(num) << endl; // 输出00101010

方法2:递归除基取余法(动态位数)

string decimalToBinary(int n) {if (n == 0) return "0";string bin;while (n > 0) {bin = to_string(n % 2) + bin;n /= 2;}return bin;
}
// 调用示例:cout << decimalToBinary(42); // 输出101010
2. 十进制 → 十六进制

方法1:使用 cout 格式控制符

int num = 255;
cout << "十六进制(小写): " << hex << num << endl;    // 输出ff
cout << "十六进制(大写): " << uppercase << hex << num; // 输出FF

方法2:手动转换(支持负数)

string decimalToHex(int num) {if (num == 0) return "0";const char hexDigits[] = "0123456789ABCDEF";string hex;unsigned int n = num; // 处理负数转为补码while (n > 0) {hex = hexDigits[n % 16] + hex;n /= 16;}return hex;
}
// 调用示例:cout << decimalToHex(-42); // 输出FFFFFFD6
3. 二进制 → 十进制

方法1:使用 stoi 函数

string binStr = "101010";
int decimal = stoi(binStr, nullptr, 2); // 第二个参数为终止位置指针
cout << decimal; // 输出42

方法2:按权展开计算

int binaryToDecimal(string binStr) {int dec = 0;for (char c : binStr) {dec = dec * 2 + (c - '0');}return dec;
}
// 调用示例:cout << binaryToDecimal("101010"); // 输出42
4. 十六进制 → 十进制

方法1:使用 stoi 函数

string hexStr = "FF";
int decimal = stoi(hexStr, nullptr, 16); // 第三个参数指定基数
cout << decimal; // 输出255

方法2:手动转换(支持大小写)

int hexCharToValue(char c) {if (isdigit(c)) return c - '0';c = toupper(c);return 10 + (c - 'A');
}int hexToDecimal(string hexStr) {int dec = 0;for (char c : hexStr) {dec = dec * 16 + hexCharToValue(c);}return dec;
}
// 调用示例:cout << hexToDecimal("1a"); // 输出26
5. 二进制 ↔ 十六进制(直接转换)

核心思路:每4位二进制对应1位十六进制

string binaryToHex(string binStr) {// 补齐到4的倍数位(左侧补0)binStr = string((4 - binStr.size() % 4) % 4, '0') + binStr;const string hexDigits = "0123456789ABCDEF";string hex;for (size_t i = 0; i < binStr.size(); i += 4) {string chunk = binStr.substr(i, 4);int value = bitset<4>(chunk).to_ulong();hex += hexDigits[value];}// 去除前导0(保留最后一个0)hex.erase(0, hex.find_first_not_of('0'));return hex.empty() ? "0" : hex;
}// 调用示例:binaryToHex("101010") → "2A"
三、应用场景与注意事项
  1. 算法题常见应用

    • 位运算优化:二进制转换常用于位掩码操作(如状态压缩)
    • 内存地址处理:十六进制用于表示内存地址(如0x7ffeeb0a7c
    • 文件格式解析:如解析PNG文件的IHDR块中的宽度/高度(十六进制)
  2. 关键注意事项

    • 溢出处理:使用stolstoull处理大数(如stoull("FFFF", nullptr, 16)
    • 输入验证:检查非法字符(如二进制字符串中出现非0/1字符)
    bool isValidBinary(string s) {return s.find_first_not_of("01") == string::npos;
    }
    
    • 负数处理:手动实现时需考虑补码形式(如bitset<32>(-42).to_string()
  3. 性能优化技巧

    • 预处理映射表:提前建立二进制到十六进制的映射表
    unordered_map<string, char> binToHexMap = {{"0000", '0'}, {"0001", '1'}, /* ... */ {"1111", 'F'}
    };
    
    • 位运算加速:用移位代替除法(如num >>= 1代替num /= 2

六、最大公约数,最小公倍数,唯一分解定理

最大公约数(GCD)

使用欧几里得算法(辗转相除法),支持处理负数和零:

#include <cstdlib>  // 用于abs函数int gcd(int a, int b) 
{a = abs(a);b = abs(b);while (b != 0) {int tmp = a % b;a = b;b = tmp;}return a;
}
最小公倍数(LCM)

基于GCD计算,处理溢出和零的情况:

long long lcm(int a, int b) 
{a = abs(a);b = abs(b);if (a == 0 || b == 0) return 0;  // 0与任何数的LCM为0return (a / gcd(a, b)) * (long long)b;  // 防止溢出
}
唯一分解定理(质因数分解)

高效分解整数为质因数乘积,处理负数和特殊值:

#include <vector>
using namespace std;vector<pair<int, int>> prime_factors(int n) {vector<pair<int, int>> factors;if (n == 0) return factors;  // 0无法分解if (n < 0) {factors.emplace_back(-1, 1);  // 处理负号n = -n;}// 处理因子2if (n % 2 == 0) {int cnt = 0;while (n % 2 == 0) {n /= 2;cnt++;}factors.emplace_back(2, cnt);}// 处理奇数因子for (int i = 3; i * i <= n; i += 2) {if (n % i == 0) {int cnt = 0;while (n % i == 0) {n /= i;cnt++;}factors.emplace_back(i, cnt);}}// 处理剩余的大质数if (n > 1) factors.emplace_back(n, 1);return factors;
}

七、素数

质数(Prime number,又称素数),指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)

素数判断方法

1. 试除法(Trial Division)

原理:检查从2到√n的所有整数是否能整除n。
实现代码

bool isPrime(int n) 
{if (n <= 1) return false;      // 0和1非素数if (n <= 3) return true;       // 2和3是素数if (n % 2 == 0) return false;  // 排除偶数// 只需检查奇数因子到√nfor (int i = 3; i * i <= n; i += 2)   if (n % i == 0) return false;  return true;
}

素数筛法

1. 埃拉托斯特尼筛法(Sieve of Eratosthenes)

原理:标记素数的倍数,逐步筛选出所有素数。
实现代码

vector<bool> sieve(int n) 
{vector<bool> isPrime(n+1, true);isPrime[0] = isPrime[1] = false;for (int i = 2; i*i <= n; ++i) {if (isPrime[i]) {for (int j = i*i; j <= n; j += i) // 标记i的倍数(从i*i开始)isPrime[j] = false;}}return isPrime;
}

优点:实现简单,适合大规模区间筛素数。


2. 欧拉筛法(线性筛法)

原理:每个合数仅被其最小质因数标记,保证线性时间复杂度。
实现代码

vector<bool> eulerSieve(int n) {vector<bool> isPrime(n+1, true);vector<int> primes;  // 存储素数isPrime[0] = isPrime[1] = false;for (int i = 2; i <= n; ++i) {if (isPrime[i]) primes.push_back(i);// 用当前数和已知素数标记合数for (int p : primes) {if (i * p > n) break;isPrime[i * p] = false;if (i % p == 0) break;  // 保证只被最小质因数标记}}return isPrime;
}

时间复杂度:( O(n) ),空间复杂度 ( O(n) )。

优点:效率更高,适合需要极高性能的场景。

边界条件:注意处理 ( n = 0, 1 ) 等特殊情况。

八、快速幂,费马小定理求逆元

快速幂

概念:快速幂是一种高效计算幂运算的算法,将时间复杂度从O(n)降低到O(log n)。其核心思想是通过二分法将指数分解为二进制形式,并利用幂的平方性质减少乘法次数。

实现步骤

  1. 初始化结果为1。
  2. 循环处理指数,当指数大于0时:
    • 若当前指数为奇数,将结果乘以底数并取模。
    • 底数平方并取模,指数右移一位(除以2)。

C++代码示例

long long fast_pow(long long a, long long b, long long mod) {long long res = 1;a %= mod; // 确保a在mod范围内while (b > 0) {if (b & 1) res = (res * a) % mod;a = (a * a) % mod;b >>= 1;}return res;
}

费马小定理求逆元

概念:当模数p为质数且a与p互质时,a的逆元(即a⁻¹ mod p)可通过费马小定理计算为a^(p-2) mod p。

使用条件

  • 模数p必须是质数。
  • a与p互质(即a不是p的倍数)。

实现方法:直接调用快速幂计算a^(p-2) mod p。

C++代码示例

long long mod_inverse(long long a, long long p) {return fast_pow(a, p-2, p);
}

注意事项

  • 模数非质数:使用扩展欧几里得算法求逆元。
  • 溢出问题:确保中间结果不超过数据类型范围,必要时使用快速乘。
  • 输入验证:确保a与p互质,避免求逆元失败。

通过结合快速幂和费马小定理,可以在模数为质数时高效处理涉及除法的模运算问题。

九、排列组合,第二类斯特林数

一、排列组合

1. 概念
  • 排列(Permutation):从 n 个元素中选出 k 个元素 有序排列 的方案数,公式为:
  • 组合(Combination):从 n 个元素中选出 k 个元素 不考虑顺序 的方案数,公式为:
2. 实现方法

在模数 MOD(通常为质数如 1e9+7)下,通过预处理阶乘和阶乘的逆元,实现快速计算:

const int MOD = 1e9+7;
const int MAX_N = 1e5;
long long fact[MAX_N+1], inv_fact[MAX_N+1];// 预处理阶乘和逆元阶乘
void precompute() {fact[0] = 1;for (int i = 1; i <= MAX_N; i++) {fact[i] = fact[i-1] * i % MOD;}inv_fact[MAX_N] = fast_pow(fact[MAX_N], MOD-2, MOD); // 费马小定理求逆元for (int i = MAX_N-1; i >= 0; i--) {inv_fact[i] = inv_fact[i+1] * (i+1) % MOD;}
}// 计算排列 P(n, k)
long long permutation(int n, int k) {if (k > n) return 0;return fact[n] * inv_fact[n-k] % MOD;
}// 计算组合 C(n, k)
long long combination(int n, int k) {if (k > n) return 0;return fact[n] * inv_fact[k] % MOD * inv_fact[n-k] % MOD;
}

二、第二类斯特林数(Stirling Numbers of the Second Kind)

1. 概念
  • 定义:将 n 个不同的元素划分为 k非空集合 的方案数,记为 S(n, k)
  • 递推公式
    在这里插入图片描述
2. 实现方法

通过动态规划递推计算:

const int MAX_N = 1000;
long long stirling[MAX_N+1][MAX_N+1];void precompute_stirling() {stirling[0][0] = 1;for (int n = 1; n <= MAX_N; n++) {for (int k = 1; k <= n; k++) {stirling[n][k] = (stirling[n-1][k-1] + k * stirling[n-1][k]) % MOD;}}
}) return 0;return fact[n] * inv_fact[k] % MOD * inv_fact[n-k] % MOD;
}
3. 使用场景
  • 计算概率问题时(如抽卡问题)。
  • 动态规划中的状态转移涉及选择元素(如背包问题)。
  • 组合数学问题(如路径计数、多项式展开)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis下载稳定版本5.0.4

https://www.redis.net.cn/download/ Redis下载 Redis 版本号采用标准惯例:主版本号.副版本号.补丁级别,一个副版本号就标记为一个标准发行版本,例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的副版本号用来表示非标准版本,例如2.9.x发行版本是Redis 3.0标准版本的非标准发行版本…

‌UniApp 安卓打包完整步骤(小白向)

‌ ‌一、环境准备‌ ‌安装 HBuilderX‌ 下载最新版 HBuilderX 并安装&#xff08;官方 IDE&#xff0c;支持一键打包&#xff09;‌16确保已安装 Node.js&#xff08;用于依赖管理&#xff09;‌26 ‌配置 Android 开发环境‌ 安装 ‌Java JDK 17‌&#xff08;建议选择稳定…

【Springboot知识】Springboot配置加载机制深入解读

文章目录 配置加载概述**Spring Boot 配置加载机制详解****一、配置加载顺序&#xff08;优先级由低到高&#xff09;****二、关键配置机制说明****1. Profile 机制****2. 外部化配置****3. 配置属性绑定到 Bean****4. 动态覆盖配置** **三、配置加载流程图****2. 配置导入&…

AI图像生成

要通过代码实现AI图像生成&#xff0c;可以使用深度学习框架如TensorFlow、PyTorch或GANs等技术。下面是一个简单的示例代码&#xff0c;演示如何使用GANs生成手写数字图像&#xff1a; import torch import torchvision import torchvision.transforms as transforms import …

基于springboot的个人博客系统

一、系统架构 前端&#xff1a;html | bootstrap | jquery | css | ajax 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. 注册 02. 登录 03. 管理后台-首页 04. 管理后台-文章-所有文…

BOTA六维力矩传感器如何打通机器人AI力控操作的三层架构?感知-决策-执行全链路揭秘

想象一下&#xff0c;你对着一个机器人说&#xff1a;“请帮我泡杯茶。”然后&#xff0c;它就真的开始行动了&#xff1a;找茶壶、烧水、取茶叶、泡茶……这一切看似简单&#xff0c;但背后却隐藏着复杂的AI技术。今天&#xff0c;我们就来揭秘BOTA六维力矩传感器在机器人操控…

ffmpeg播放音视频流程

文章目录 &#x1f3ac; FFmpeg 解码播放流程概览&#xff08;以音视频文件为例&#xff09;1️⃣ 创建结构体2️⃣ 打开音视频文件3️⃣ 查找解码器并打开解码器4️⃣ 循环读取数据包&#xff08;Packet&#xff09;5️⃣ 解码成帧&#xff08;Frame&#xff09;6️⃣ 播放 / …

在 Wireshark 中如何筛选数据包

1. 显示过滤器&#xff08;Display Filters&#xff09; 显示过滤器用于 在已捕获的数据包中筛选&#xff0c;语法类似于编程语言中的条件表达式。 &#xff08;1&#xff09;基本过滤 表达式说明ip.addr 192.168.1.1显示所有涉及 192.168.1.1 的 IP 包ip.src 192.168.1.1…

ES6 新增特性 箭头函数

简述&#xff1a; ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语…

Python数据可视化-第7章-绘制3D图表和统计地图

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第7章 绘制3D图表和统计地图 本章首先介绍了使用mplot3d工具包绘制3D图表&#xff0c;然后介绍了使用animation模块制作动画&#…

【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘

对象的创建 1.类加载检查 虚拟机遇到一条new的指令&#xff0c;首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有&#xff0c;那必须先执行类的加载过程。 2.分配内存 在类…

Oracle 表空间高水位收缩全攻略

1. 概述 本文档是针对某个特定用户表空间收缩的文档&#xff0c;实际操作要结合生产库具体情况。主要包括以下几个流程&#xff1a; 收集当前数据库相关信息降低数据库表高水位线Resize 收缩数据文件 具体细节详见以下章节。 2. 时间规划 操作类型预估时间实际时间数据库信…

Pytest多环境切换实战:测试框架配置的最佳实践!

你是否也遇到过这种情况&#xff1a;本地测试通过&#xff0c;一到测试环境就翻车&#xff1f;环境变量错乱、接口地址混乱、数据源配置丢失……这些「环境切换」问题简直像定时炸弹&#xff0c;随时引爆你的测试流程&#xff01; 测试人员每天都跟不同的环境打交道&#xff0…

蓝桥杯赛前题

开始每个人能量为3 答题了&#xff0c;答题者1 扣分最后算 #include<bits/stdc.h> using namespace std;const int N1e510; int a[N]; int main(){int n,k,q;cin>>n>>k>>q;for(int i1;i<n;i){a[i]k; }for(int i1;i<q;i){int x;cin>>x;a[…

VSCode优雅的使用debug

原始用法&#xff1a;(这里不使用) 配置launch.json&#xff0c;里面传入参数然后debug&#xff0c;这里我们通常需要传入的参数比较多&#xff0c;而且经常修改参数&#xff0c;直接去修改launch.json会比较麻烦&#xff0c;所以使用sh脚本比较方便。 {// Use IntelliSense to…

oracle常见问题处理集锦

oracle常见问题处理集锦 oracle常见问题处理集锦ORA-03001:未实施的功能ORA:28000 the count is locked oracle常见问题处理集锦 ORA-03001:未实施的功能 问题 ORA-03001:未实施的功能 在datagrip中修改表名称&#xff0c;使用的语法是&#xff1a; rename old_name to new_n…

项目日志配置模板示例

1.新增application.properties配置 logging.configclasspath:logback-spring.xml spring.profiles.activedev 将项目部署到服务器时需要将dev修改为test后再进行打包部署 2.新增logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <…

2025年第十八届“认证杯”数学中国数学建模网络挑战赛【BC题】完整版+代码+结果

# 问题一&#xff1a;随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二&#xff1a;LSTM时间序列预测from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…

C语言实现TcpDump

一、 在 C 语言中实现 TCP 抓包功能&#xff0c;通常可以使用 libpcap 库。libpcap 是一个广泛使用的网络抓包库&#xff0c;它提供了捕获网络数据包的接口。 libpcap 是一个广泛使用的 C 语言库&#xff0c;用于捕获和过滤网络数据包。它提供了一个通用接口&#xff0c;用于访…

Spark-Core编程

sortByKey算子&#xff1a;对(K, V)型RDD按key排序&#xff0c;K需实现Ordered接口&#xff0c;可指定升序或降序及分区数。 join算子&#xff1a;连接两个(K, V)和(K, W)型RDD&#xff0c;返回(K, (V, W))型RDD 。 leftOuterJoin算子&#xff1a;类似SQL左外连接&#xff0c;返…