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

article/2025/10/28 18:02:15

计算机算法设计与分析

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

第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;elsereturn 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++];elsed[pos++] = c[j++];if (i > m) {    //第1个数组放完了,直接把第2个数组剩下的放到dfor (int q = j; q <= r; q++)d[pos++] = c[q];}if (j > r) {      //第2个数组放完了,直接把第1个数组剩下的放到dfor (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]>=xi++;while(a[j]>x)           //直到找到a[j]<=xj--;if(i>=j)break;swap(a[i],a[j]);    //交换a[i],a[j],使得左边都小于x,右边>x}swap(a[p],a[j]);return j;}


http://chatgpt.dhexx.cn/article/XWiu377W.shtml

相关文章

算法设计与分析——概述

概述 算法的概念何为算法算法的五大特征算法设计的基本步骤算法与数据结构 算法分析算法时间复杂度算法空间复杂度渐进符号&#xff08;O、Ω和θ&#xff09; 算法设计工具——STLSTL概述何为STL容器何为STL算法何为STL迭代器 常用STL容器顺序容器关联容器适配器容器 推荐书籍…

算法设计与分析 —— 算法的复杂度分析

什么是算法的复杂度 &#xff08;1&#xff09;算法复杂度即算法所需要的计算机资源 &#xff08;2&#xff09;算法的复杂度可分为算法的时间复杂度 T ( n ) T(n) T(n) 和算法的空间复杂度 S ( n ) S(n) S(n)&#xff0c;其中 n n n 是问题的规模&#xff08;输入大小&am…

算法设计与分析 第一章 基础知识作业1

目录 算法分析题1.1 函数的渐进表达式1.3 证明对于任何实数x和整数a,b,n:1.7 函数渐进阶 算法实现题1.1 统计数字问题1.3 最多约数问题 算法分析题 1.1 函数的渐进表达式 求下列函数的渐近表达式&#xff1a;3n210n; n2/102n; 211/n; logn3; 10log3n 1.3 证明对于任何实数x…

USTC算法设计与分析-总结

《算法设计与分析》是中国科学技术大学计算机专业的研究生学科基础课&#xff0c;黄刘生老师讲概率算法和近似算法&#xff0c;汪炀老师讲分布式算法&#xff0c;因为课程内容繁杂且难度较大&#xff0c;所以结合了上课所做笔记和期末复习总结成思维导图&#xff0c;梳理下思路…

《算法设计与分析基础》第2版

今天开始学习《算法设计与分析基础》这本书&#xff0c;书中提及的算法均会在后续博客实现。 清华大学出版社。

算法设计与分析重点总结

考试题型&#xff1a; 选择 2* 10个 填空2* 10个 简答 3* 4个 程序分析填空 4* 4个 综合&#xff08;代码&#xff09;8* 4个 第一章基础知识 1.算法的定义 算法就是解决问题的方法&#xff0c;是解决某一特定问题的一组有穷指令的序列&#xff0c;是完成一个任务所需要的具…

算法设计与分析基础 第八章谜题

习题8.1 6.切割木棍问题 为下列问题设计一个动态规划算法。已知小木棍的销售价格pi和长度i相关&#xff0c;i1,2&#xff0c;…&#xff0c;n&#xff0c;如何把长度为n的木棍切割为若干根长度为整数的小木棍&#xff0c;使得所获得的总销售价格最大&#xff1f;该算法的时间效…

算法设计与分析基础(三)

算法设计与分析基础(三) 练习题 根据下列函数的增长次数按照从低到高的顺序对他们进行排序。 解答&#xff1a; 解答&#xff1a; 即&#xff0c;该多项式的始终值为ak*n^k,则结论成立。 考虑下面的算法&#xff1a; 算法Mystery(m) //输入:非负整数n S←0 for i←1 to …

算法设计与分析基础

To All Of You&#xff1a; 一个人在接受科技教育时能得到的最珍贵的收获是能够终身受用的通用智能工具。 在讨论算法的书籍中&#xff0c;一般会采用两种方案中的一种&#xff1a; 1.第一种方案是按照问题的类型对算法进行分类。这类教材安排了不同的章节分别讨论排序&…

第一章 算法设计与分析基础知识

系列文章目录 第一章 算法设计与分析基础知识 第二章 算法的分治策略 第三章 算法的动态规划 第四章 算法的贪心法 …… [TOC](这里写目录标题) # 一级目录 ## 二级目录 ### 三级目录 参考教材 《算法设计与分析&#xff08;第2版&#xff09;》是由屈婉玲、刘田、张立昂、王…

算法设计与分析——算法分析基础

算法分析主要是时间复杂度和空间复杂度的两个方面的分析 此处带着问题小预告一把&#xff1a; 时间复杂度&#xff1f;空间复杂度&#xff1f; 大O、大和大分别表示什么&#xff1f; 如何得到递归方程&#xff1f;如何求解递归方程呢&#xff1f; 带着问题来探索吧~ 目录…

算法设计与分析(1)——基础知识

写完 Java 的我又开始对 算法设计与分析 下手了(✿◡‿◡) 内容主要是以 北京大学 屈婉玲老师的 MOOC 视频来写的&#xff0c;视频共是十周的内容&#xff0c;我决定用 五 篇博客完成。 温馨提示&#xff1a;这个课程不仅适用于 算法设计与分析 的学习&#xff0c;也非常适用…

算法设计与分析——算法基础初步了解

算法的概念 算法:一个有计算步骤构成的序列&#xff0c;可以将一组输入值转换成相应的输出值。或可以用例解决一个明确的问题。 问题&#xff1a;输入及相应输出的描述&#xff1a; 算法的特点&#xff1a;确定性、可行性、输入和输出及有穷性。 正确的算法&#xff1b;停机并…

算法设计与分析基础知识

一、算法设计基础 算法是&#xff08;algorithm&#xff09;是对特定问题求解步骤的一种描述&#xff0c;是指令的有限序列。 算法的五个特性&#xff1a; 输入&#xff1a;一个算法可以有零个或多个输入。 输出&#xff1a;一个算法有一个输出或多个输出。 有穷性&#xff08;…

为你的股票绘制趋势图

手里有一点点公司的股票&#xff0c; 拿不准在什么时机抛售&#xff0c; 程序员也没时间天天盯着看&#xff0c;不如动手写个小程序&#xff0c; 把股票趋势每天早上发到邮箱里&#xff0c;用 python 的 pandas, matplotlib 写起来很容易&#xff0c; 几十行代码搞定。 准备环…

用PYTHON画图 看股票/数字货币的趋势分析 带你直观理解指标 K线图

用PYTHON画图 看股票/数字货币的趋势分析 带你直观理解指标 本文章将用PYTHON 画图 以比特币&#xff08;BTC&#xff09;为例 进行画图分析 &#xff08;小白向&#xff09; Pycharm平台编写 所用到的python库 import requests from lxml import etree import math import …

Plotly中绘制三种经典的股票交易图表(含视频讲解)

作者&#xff1a;Lemon 来源&#xff1a;Python数据之道 Plotly中绘制三种经典的 股票交易图表&#xff08;含视频讲解&#xff09; 大家好&#xff0c;我是 Lemon 。 背景 前一段时间&#xff0c; Lemon 发了一期视频&#xff0c;分享了 Plotly 和 Dash 在投资领域的应用案例。…

如何在股票软件画波浪?波浪原理?初级应用画线

如何在股票软件画波浪&#xff1f;波浪原理?初级应用画线 听语音 浏览&#xff1a;1|更新&#xff1a;2018-03-13 10:07|标签&#xff1a;股票 1 2 3 4 5 6 7 分步阅读 波浪理论最主要特征就是它的通用性&#xff0c;在股市中是一个十分重要的技术研究方向&#xff0c;一旦成…

使用Python生成股票K线图

可视化股票数据&#xff0c;这里只做简单的处理&#xff0c;只显示k线图。选取的是海通证券&#xff08;600837&#xff09;2020年1月1日之后150个交易日的数据。这里代码不多&#xff0c;没有封装成方法&#xff0c;代码如下。数据是提前获取的&#xff0c;获取方法见&#xf…

Python获取股票数据并绘制相应K线图,看这个就够了!

Python对股票的K线可视化 前言说明注意 数据获取Tushare获取股票数据获取医疗器械板块数据&#xff08;代码部分&#xff09;获取股票数据&#xff08;代码部分&#xff09; 数据预处理变量中文化&#xff08;代码部分&#xff09; K线绘制代码部分结果展示 写在最后 前言 说明…