算法设计与分析知识点整理1

简介: 算法设计与分析知识点整理

一、算法的基本概念

算法是求解问题的一系列计算步骤,用来将输入数据转换为输出结果。


1.算法的基本特征

有限性

确定性

可行性

输入性

输出性

2.算法设计需要满足的目标

正确性

可使用性

可读性

健壮性

高效率和低存储需求

3.算法和程序的区别

一、形式不同


1、算法:算法在描述上一般使用半形式化的语言。


2、程序:程序是用形式化的计算机语言描述的。


二、性质不同


1、算法:算法是解决问题的步骤。


2、程序:程序是算法的代码实现。


三、特点不同


1、算法:算法要依靠程序来完成功能。


2、程序:程序需要算法作为灵魂。


二、时间复杂度计算

1.大O表示法

"大O表示法"表示程序的执行时间或占用空间随数据规模的增长趋势。大O表示法就是将代码的所有步骤转换为关于数据规模n的公式项,然后排除不会对问题的整体复杂度产生较大影响的低阶系数项和常数项。


只关注循环执行次数最多的那段代码

加法法则(总复杂度等于量级最大的那段代码的复杂度)

乘法法则(嵌套代码复杂度等于内外代码复杂度的乘积)

2.最坏和平均情况

指算法在所有输入I下的所执行基本语句的最多执行次数和平均次数


3.根据递归方程求解时间复杂度

3.1 根据递归树求解

①画递归图

w1.png



②相加化简得时间复杂度


3.2 根据主方法求解

主定理:a ≥ 1 和 b > 1,是常数,f ( n )是一个函数,T(n)是定义在非负整数上的递归式:

T(n) = aT(n/b) + f(n),


若对某个常数 ε>0 有 f ( n ) = O ( n l o g b a − ε ) f(n) = O(nlog_ba-ε)f(n)=O(nlog

b

a−ε),则 T ( n ) = Θ ( n l o g b a ) T(n) = Θ(nlog_ba)T(n)=Θ(nlog

b

a) 。

若f ( n ) = Θ ( n l o g b a ) f(n) = Θ(nlog_ba)f(n)=Θ(nlog

b

a),则 T ( n ) = Θ ( n l o g b a ∗ l g n ) T(n) = Θ(nlog_ba*lgn)T(n)=Θ(nlog

b

a∗lgn)。

若对某个常数 ε>0 有 f ( n ) = Ω ( n l o g b a + ε ) f(n) = Ω(nlog_ba+ε)f(n)=Ω(nlog

b

a+ε),且对某个常数 c<1 和所有足够大的 n 有 a f ( n / b ) ≤ c f ( n ) af(n/b) ≤ cf(n)af(n/b)≤cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n) = Θ(f(n))T(n)=Θ(f(n)) 。

三、六大算法


计算机解决问题其实没有任何奇技淫巧,它唯一的解决办法就是穷举,穷举所有可能性。算法设计无非就是先思考“如何穷举”,然后再追求“如何聪明地穷举”。


------《labuladong的算法小抄》


1.分治法

1.1 算法思路

先「分」后「治」,先按照运算符将原问题拆解成多个子问题,然后通过子问题的结果来合成原问题的结果。


1.2 适用范围

该问题的规模缩小到一定的程度就可以容易地解决

该问题可以分解成若干个规模较小的相似问题

利用该问题分解出的子问题可以合并为该问题的解

该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题

1.3 基本步骤

①分解出若干个子问题


②求解子问题


③子问题合并


2.回溯法(DFS)

2.1 算法思路

解决一个回溯问题,实际上就是一个决策树的遍历过程。(其实就是穷举,如果配合着剪枝技巧就是聪明的穷举)


注:DFS使用的数据结构是栈,往往利用递归来解决(递归调用利用的就是系统栈)


2.2 算法步骤

①针对给定的问题确定解空间


②确定结点的拓展搜索规则


③以深度优先搜索(DFS)的方式搜索解空间树,并在搜索过程中可以采用剪枝函数来避免无效搜索。


2.3 算法框架

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

2.4 算法技巧

①剪枝函数——聪明的穷举


对于一些明显不符合题意的分支进行剪枝,避免无效穷举。


②数组交换


这个用于解空间为全排列树的情况,而且保存路径的方式为数组,此时可以对数组数据进行交换来保证排列中的每个元素不同。


3.分枝限界法(BFS)

虽然不喜欢官方的定义,但是为了更好理解这个名字,还是要了解以下概念:


分枝——使用广度优先的策略


限界——使用限界函数计算函数值(可以理解为权重)来决定遍历顺序


3.1 算法思路

和回溯法一样都是穷举决策树,不过分支限界法使用**广度优先遍历(BFS) **的方式穷举。


这种穷举方式使分支限界法有以下特点:


①BFS 找到的路径一定是最短的,但代价就是空间复杂度可能比 DFS 大很多


②适用于找到某种意义下的最优解(其实也可以选择遍历决策树找到找到符合条件的解,但是这样一来时间复杂度和DFS一样,但是空间复杂度却高了很多,得不偿失)


③在找最优解中,BFS往往时间复杂度更低,但空间复杂度更高(不需要像DFS那样遍历所有节点,但代价就是需要额外空间来存储至少一层的结点)


④往往用队列/优先队列的数据结构


3.2 算法框架

// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
    Queue<Node> q; // 核心数据结构
    Set<Node> visited; // 避免走回头路
    q.offer(start); // 将起点加入队列
    visited.add(start);
    int step = 0; // 记录扩散的步数
    while (q not empty) {
        int sz = q.size();
        /* 将当前队列中的所有节点向四周扩散 */
        for (int i = 0; i < sz; i++) {
            Node cur = q.poll();
            /* 划重点:这里判断是否到达终点 */
            if (cur is target)
                return step;
            /* 将 cur 的相邻节点加入队列 */
            for (Node x : cur.adj()) {
                if (x not in visited) {
                    q.offer(x);
                    visited.add(x);
                }
            }
        }
        /* 划重点:更新步数在这里 */
        step++;
    }
}


3.3 算法技巧

①优先队列

优先弹出更优的结点,这样可以更快找到最优解。


②双向 BFS 优化

传统的 BFS 框架就是从起点开始向四周扩散,遇到终点时停止;而双向 BFS 则是从起点和终点同时开始扩散,当两边有交集的时候停止。


在算法实现上还有技巧,每次扩散结点时选择较小一端(较小的队列),如果我们每次都选择一个较小的集合进行扩散,那么占用的空间增长速度就会慢一些,效率就会高一些。


不过,双向 BFS 也有局限,因为你必须知道终点在哪里。


相关文章
|
2月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
92 4
|
3天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
18 6
|
27天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
61 1
|
2月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
2月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
3月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
70 4
|
3月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
69 1
|
2月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
175 0
|
3月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
58 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计

热门文章

最新文章