算法学习--数学知识

简介: 算法学习--数学知识


一 试除法判断质数 O(√n)


质数有一个非常重要的性质, 那就是当 d|n 时, n/d|n 也成立, 其中 d|n表示 d 能被 n 整除, 比如 3 能被 12 整除, 4 也能被 12 整除

所以我们在用试除法判断质数的时候, 就没有必要循环 d : 2~n, 只要 d : 2~n/d即可


模板题 866. 试除法判定质数 - AcWing 题库

#include<iostream>
#include<cstdio>
using namespace std;
const int N=100+10;
int n;
int a[N];
bool is_prime(int x){
    if(x<2){
        return false;
    }
    //写成i<=x/i可以防止爆int
    for(int i=2;i<=x/i;i++){
        if(x%i==0){
            return false;
        }
    }
    return true;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        scanf("%d", &a[i]);
    }
    for(int i=0;i<n;i++){
        if(is_prime(a[i])){
            puts("Yes");
        }
        else{
            puts("No");
        }
    }
    return 0;
}


二 筛质数 O(n)

筛法的基本思想是有一组数 2,3,4,5,6,7,8,9,10,11,12,... 顺着这组数从前往后遍历, 把遍历到的数的倍数删掉


void get_primes(){
  for(int i=2;i<=n;i++){
    if(!st[i]){
      primes[cnt++]=i;
    }
    for(int j=i+i; j<=n; j+=i) st[j]=true;
  }
}


这种朴素算法的时间复杂度为 n×(1/1+1/2+...+1/n)≈n⋅ln⁡n≈O(n⋅log⁡n)

观察这种朴素筛法我们可以发现, 遍历的过程当中,没有必要去删掉每个数的倍数, 上面的例子当中 12 就在遍历到 2, 3, 4, 6 的时候筛掉, 但是 4, 6 本身已经被筛掉了, 所以我们在遍历的过程中, 没有必要删掉每个数的倍数, 只要删掉质数的倍数既可以了

void get_primes(){
  for(int i=2;i<=n;i++){
    if(!st[i]){
      primes[cnt++]=i;
      for(int j=i+i; j<=n; j+=i) st[j]=true; // 放入 if 语句当中, 只删掉质数的倍数
    }
  }
}


这种算法的时间复杂度为 n×(1/1+1/2+...+1/p)≈O(n⋅log⁡log⁡n), 1/1+1/2+...+1/p大概有 n/ln⁡n项, 这种筛法被称为埃氏筛法

如果用埃氏筛法, 上面的例子当中 12 就会在遍历到 2, 3 的时候筛掉, 这当中还是有一些重复操作, 于是就有了线性筛法


void get_primes(){
    for(int i=2;i<=n;i++){
        if(!st[i]){
            primes[cnt++]=i;
        }
        // 把所有的 primes[j]*i 使用其最小质因子删掉
        for(int j=0;primes[j]<=n/i;j++){
            st[primes[j]*i]=true;
            if(i%primes[j]==0) break;
        }
    }
}


与埃氏筛法不同的是, 线性筛法是把所有的 primes[j]*i 筛掉, 这里 i 是一个质数, primes[j] 是在之前迭代种得到的所有比 i 小的质数

  1. i%primes[j]==0 时, 说明 primes[j]i 的最小质因子 (primes[j]是递增的), 因此 primes[j] 一定是 primes[j]*i 的最小质因子
  2. i%primes[j]!=0 时, 说明 primes[j] 一定小于 i 的所有质因子, 所以 primes[j] 也一定是 prime[j]*i 的最小质因子

综上两条, primes[j]*i 是被它的最小质因子 primes[j] 筛掉的, 但是当 i%primes[j]==0, 必须 break, 因为 primes[j]i 的最小质因子, 所以 primes[j+1]*i 的最小质因子是 primes[j], 而不是 primes[j+1], primes[j+1]*i 不是被它的最小质因子筛掉的

对于一个合数 x, 假设 primes[j]x 的最小质因子, 当 i 枚举到 x/primes[j] 时, i 枚举到 x 之前一定会先到达 x/primes[j] 所以这个 x 就被筛掉了, 而且仅仅只是被最小质因子筛掉了一次

所有合数都只会被它的最小质因子筛掉一次, 算法复杂度为 O(n)


模板题 868. 筛质数 - AcWing 题库

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e6+10;
int n;
int primes[N], cnt;
bool st[N];
void get_prime(){
    for(int i=2;i<=n;i++){
        // 这个数没有被筛掉,说明它是一个质数,就把它存起来
        if(!st[i]){
            primes[cnt++]=i;
        }
        // 把所有的 i*primes[j] 使用其最小质因子删掉
        for(int j=0;primes[j]<=n/i;j++){
            st[i*primes[j]]=true;
            if(i%primes[j]==0){
                break;
            }
        }
    }
}
int main(){
    cin>>n;
    get_prime();
    cout<<cnt<<endl;
    return 0;
}


相关文章
|
4月前
|
机器学习/深度学习 算法 数据挖掘
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
180 0
|
3月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
243 1
|
3月前
|
机器学习/深度学习 人工智能 算法
当AI提示词遇见精密算法:TimeGuessr如何用数学魔法打造文化游戏新体验
TimeGuessr融合AI与历史文化,首创时间与空间双维度评分体系,结合分段惩罚、Haversine距离计算与加权算法,辅以连击、速度与完美奖励机制,实现公平且富挑战性的游戏体验。
|
9月前
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
10月前
|
机器学习/深度学习 算法
扩散模型=进化算法!生物学大佬用数学揭示本质
在机器学习与生物学交叉领域,Tufts和Harvard大学研究人员揭示了扩散模型与进化算法的深刻联系。研究表明,扩散模型本质上是一种进化算法,通过逐步去噪生成数据点,类似于进化中的变异和选择机制。这一发现不仅在理论上具有重要意义,还提出了扩散进化方法,能够高效识别多解、处理高维复杂参数空间,并显著减少计算步骤,为图像生成、视频合成及神经网络优化等应用带来广泛潜力。论文地址:https://arxiv.org/pdf/2410.02543。
311 21
|
11月前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
2396 11
架构学习:7种负载均衡算法策略
|
11月前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
3717 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
11月前
|
机器学习/深度学习 人工智能 算法
Transformer打破三十年数学猜想!Meta研究者用AI给出反例,算法杀手攻克数学难题
《PatternBoost: Constructions in Mathematics with a Little Help from AI》提出了一种结合传统搜索算法和Transformer神经网络的PatternBoost算法,通过局部搜索和全局优化交替进行,成功应用于组合数学问题。该算法在图论中的Ramsey数研究中找到了更小的反例,推翻了一个30年的猜想,展示了AI在数学研究中的巨大潜力,但也面临可解释性和通用性的挑战。论文地址:https://arxiv.org/abs/2411.00566
282 13
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
784 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS

热门文章

最新文章