计算机算法设计与分析(1-6章 复习笔记)

简介: 计算机算法设计与分析(1-6章 复习笔记)

计算机算法设计与分析

最近发现一些刷题的网站,牛客、力扣,很适合用来熟悉算法和语言知识点。

第1章 算法概述

1.1 算法与程序

算法 是解决问题的一种方法或一个过程。

    严格地说,算法是由若干条指令组成的有穷序列,且满足下述4条性质。

  1. 输入
  2. 输出:至少产生一个量作为输出。
  3. 确定性:每条指令清晰、无歧义。
  4. 有限性:执行次数、时间有限

程序和算法不同。程序不一定满足上述4条性质。

1.2 算法复杂性分析

最坏时间复杂度:O;时间上界;

1.3 NP完全性理论

可在多项式时间内求解的判断问题构成    P类问题。

第2章 递归与分治策略

 分治法的思想:将一个难以直接解决的大问题分解为一些规模较小的相同问题,以便各个击破,分而治之。

2.1 递归的概念

直接或间接调用自身的算法称为递归算法。

【例2-1】阶乘函数。

阶乘函数可递归的定义为:

n!  = 1            ,n=0

   = n(n-1)!   ,  n>0

递归式的第一式给出了这个函数的 初始值,是非递归定义的(直接给出)。每个递归函数都必须有非递归定义的初始值,否则会一直递归下去。

递归式的第二式用较小的自变量的函数值来表示较大自变量的函数值的方法来定义n的阶乘。

用代码表示:

int factorial(int n){
 
    if (n==0)
 
        return 1;
 
    else
 
        return n*factorial(n-1);
 
}

【例2-6】Hanoi塔问题

问题略。

可用递归方法解决:

当n=1时,只要将当前盘子从当前位置塔a放在目标塔b即可。

当n>1时,需要利用塔c作为辅助塔,将n-1个圆盘移动到c上,然后将剩下的最大圆盘移动到b上。即n个圆盘的问题变成两次n-1个圆盘的问题。

用代码表示:

//4个参数依次是剩余数量,起点,终点,中间点
 
void hanoi(int n, char a, char b, char c){
 
    if (n==1)
 
        move(a,b);
 
    else
 
    {
 
       hanoi(n-1,a,c,b);
 
       move(a,b);
 
       hanoi(n-1,c,b,a);
 
    }
 
       
 
}
 
void move(char begin,char end){
 
cout<<begin<<"--->"<<end<<"\n";
 
}


2.2 分治法的基本思想

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,子问题之间相互独立且与原问题类型相同。

2.3二分搜索技术

二分搜索是分治的典型例子。

给定已排好序(为了简便,设为升序排序)的n个元素a[0,n-1],要在其中找到一特定元素x。

如果用顺序搜索(从头开始依次往后比较),最坏情况需要n次比较;

分搜索采用分治策略,最坏情况用O(logn) 时间完成。

二分搜索的基本思想:将n个元素分成数量基本相同的两份,取a[n/2]与x比较,如果x 等于a[n/2],则找到,算法终止;如果x<a[n/2],则x较小,只要在数组a的左半部继续搜索;

如果x>a[n/2],则x较大,只要在数组a的右半边继续搜索。

/*二分搜索 */
 
template<class Type>
 
int BinarySearch(Type a[],const Type& x, int n){
 
    int left = 0;
 
    int right = n-1;
 
    while(left<=right)
 
    {
 
        int middle = (left+right)/2;
 
        if (x==a[middle])
 
            return middle;
 
        if (x>a[middle])
 
            left = middle+1;
 
        if (x<a[middle])
 
            right = middle-1;
 
    }
 
    return -1;
 
}
 
 
 
//递归形式
 
int  BinarySearch(int a[],int x,int left,int right){
 
    if(left>right)
 
        return -1;
 
    int middle = (left+right)/2;
 
    if (x==a[middle])
 
        return middle;
 
    if(x<a[middle])
 
        return BinarySearch(a,x,left,middle-1);
 
    if(x>a[middle])
 
        return BinarySearch(a,x,middle+1,right);
 
}

2.4 大整数的乘法

有二进制整数X和Y,要计算X * Y,

将X分成两份:A、B,

Y分解两份:C、D

XY = (A*2n/2 +B)(C*2n/2 +D)

=AC*2n +((A-B)(D-C)+AC+BD)* 2n/2 +BD  //利用数学变形,减少乘法次数

2.5 Strassen矩阵乘法

(直接分解再乘并不能减少乘法次数,通过一些变形增加加减法次数,减少乘法次数)。

2.7 合并序。

用分治策略对N个元素进行排序。

基本思想:将待排序的n个元素分成大小大致相同的两个子集,分别对两个子集进行排序,然后再合并两个子集。

template<class Type>
 
void MergeSort(Type a[],Type b[], int left, int right) {
 
    if (left < right) {
 
        int i = (left + right) / 2;
 
        MergeSort(a, b,left, i);
 
        MergeSort(a, b,i + 1, right);
 
        Merge(a, b, left, i, right); //合并到b数组
 
        Copy(a, b, left, right);   //复制回a数组
 
    }
 
 
 
template<class Type>
 
void Merge(Type c[], Type d[], int l, int m, int r) {  //合并c[l:m]和c[m+1:r]到d[l:r]
 
    int i = l, j = m + 1;
 
    int pos = l;
 
    while ((i <= m) && (j <= r)) {
 
        if (c[i] <= c[j])
 
            d[pos++] = c[i++];
 
        else
 
            d[pos++] = c[j++];
 
        if (i > m) {    //第1个数组放完了,直接把第2个数组剩下的放到d
 
            for (int q = j; q <= r; q++)
 
                d[pos++] = c[q];
 
        }
 
        if (j > r) {      //第2个数组放完了,直接把第1个数组剩下的放到d
 
            for (int q = i; q <= m; q++)
 
                d[pos++] = c[q];
 
        }
 
    }
 
}
 
 
 
template<class Type>
 
void Copy(Type a[], Type b[], int left, int right) {
 
    for (int i = left; i <= right; i++)
 
        a[i] = b[i];
 
}

2.8 快速排序

对于数组a[p:r]按三个 步骤排序:

1. 分解(Divide):以a[p]为基准元素,a[p:r]分解为3段:a[p:q-1].a[q]]和a[q+1:r]

使得a[p:q-1]中的元素都<=a[q] , a[q+1:r]>=a[q],下标q在划分过程中确定。

2.递归求解(Conquer):使用递归对a[p:q-1]和a[q+1:r]进行排序。

3.合并(Merge):a[p:q-1]和a[q+1:r]排序好后,不需要进行操作就已经排好序了。

template<class Type>
 
void QuickSort(Type a[],int p,int r){
 
    if(p<r){
 
        int q = Partition(a,p,r);
 
        QuickSort(a,p,q-1);
 
        QuickSort(a,q+1,r);
 
    }
 
}
 
 
 
template<class Type>
 
int Partition(Type a[],int p, int r){
 
    int i=p+1, j =r;
 
    Type x = a[p];
 
    while(true){
 
        while(a[i]<x && i<r)   //直到找到a[i]>=x
 
            i++;
 
        while(a[j]>x)           //直到找到a[j]<=x
 
            j--;
 
        if(i>=j)
 
            break;
 
        swap(a[i],a[j]);    //交换a[i],a[j],使得左边都小于x,右边>x
 
    }
 
   swap(a[p],a[j]);
 
    return j;
 
}
相关文章
|
11月前
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
740 4
|
9月前
|
机器学习/深度学习 边缘计算 算法
NOMA和OFDMA优化算法分析
NOMA和OFDMA优化算法分析
451 127
|
6月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
371 3
|
6月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
124 0
|
8月前
|
编解码 算法 5G
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
744 2
|
7月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
412 0
|
8月前
|
人工智能 自然语言处理 算法
2025 年 7 月境内深度合成服务算法备案情况分析报告
2025年7月,中央网信办发布第十二批深度合成算法备案信息,全国389款产品通过备案,服务提供者占比超七成。截至7月14日,全国累计备案达3834款,覆盖文本、图像、音视频等多模态场景,广泛应用于生活服务、医疗、金融等领域。广东以135款居首,数字人、AI客服等C端应用主导,民营企业成主力,国企聚焦公共服务。随着AI政策推动,备案已成为AI产品合规上线关键环节。
|
11月前
|
存储 监控 算法
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
264 14
|
自然语言处理 算法 安全
境内深度合成服务算法备案通过名单分析报告
本报告基于《境内深度合成服务算法备案通过名单》,分析了2023年6月至2025年3月公布的10批备案数据,涵盖属地分布、行业应用及产品形式等多个维度。报告显示,深度合成算法主要集中于经济发达地区,如北京、广东、上海等地,涉及教育、医疗、金融、娱乐等多行业。未来趋势显示技术将向多模态融合、行业定制化和安全合规方向发展。建议企业加强技术研发、拓展应用场景、关注政策动态,以在深度合成领域抢占先机。此分析旨在为企业提供参考,助力把握技术发展机遇。
境内深度合成服务算法备案通过名单分析报告
|
供应链 算法 搜索推荐
从公布的前十一批其他算法备案通过名单分析
2025年3月12日,国家网信办发布算法备案信息,深度合成算法通过395款,其他算法45款。前10次备案中,深度合成算法累计3234款,其他类别647款。个性化推送类占比49%,涵盖电商、资讯、视频推荐;检索过滤类占31.53%,用于搜索优化和内容安全;调度决策类占9.12%,集中在物流配送等;排序精选类占8.81%,生成合成类占1.55%。应用领域包括电商、社交媒体、物流、金融、医疗等,互联网科技企业主导,技术向垂直行业渗透,内容安全和多模态技术成新增长点。未来大模型检索和多模态生成或成重点。
从公布的前十一批其他算法备案通过名单分析

热门文章

最新文章