算法设计与分析基础知识

article/2025/10/28 17:47:53

一、算法设计基础

算法是(algorithm)是对特定问题求解步骤的一种描述,是指令的有限序列。

算法的五个特性

输入:一个算法可以有零个或多个输入。

输出:一个算法有一个输出或多个输出。

有穷性(finiteness):对于任何合法的输入,算法必须总是能够在有穷时间内完成。

确定性(determinacy):算法中的每一条指令都必须有确切的含义,并且对于相同的输入只能得到相同的输出。

可行性(feasibility):算法中的每一条指令都可以通过已经实现的基本操作执行有限次来实现。

“好算法”的特性:正确性(correctness),健壮性(robustness),可理解性(comprehensible),抽象分级(abstract classification),高效性(high efficiency)。

(个人认为可理解性和抽象分级相差不大,都是为了便于理解。)

基本的数据结构

数据结构(data structure)是指相互之间存在一定关系的数据元素的集合。

线性表(linear list):简称表,是n个数据元素的有限序列。

(stack):是限定仅在一端进行插入和删除操作的线性表。插入和删除都在栈顶进行操作,另一端为栈底。具有后进先出(last in first out)的特性。

队列(queue):是只允许在一端进行插入操作,在另一端进行删除操作的线性表。插入在队尾,删除在队头。具有先进先出(first in first out)的特性。

(tree):是n(n>=0)个节点的有限集合

任意一颗非空树满足以下条件:

1、有且仅有一个特定的成为根(root)的节点。

2、当n>1时,除根节点之外的其余节点被分成m(m>0)个互不相交的有限集合T1,T2,...,Tm,其中每个集合又是一棵树,并称为这个根节点的子树(subtree)。

(graph):由n(n>=0)个顶点的有限集合和顶点之间边的集合组成,通常表示为:G=(V,E),其中,G表示一个图,V是顶点的集合,E是顶点之间边的集合。

算法设计的一般过程

分析问题-->选择算法设计计数-->设计并描述算法-->手工运行算法(调试)-->分析算法的效率-->实现算法-->不断循环过程直到满足需求

算法优化方向:常量计算,算术运算,用位运算代替除法和取模运算,有利于编译优化,优化逻辑运算,合理安排条件表达式的顺序,改善循环结构。

二、算法分析基础

算法的时间复杂度分析是一种事前分析估算的方法,是对算法所消耗资源的一种渐进分析方法。

渐进分析是指忽略具体机器、编程语言和编译器的影响,只关注在输入规模增大时算法运行时间的增长趋势。

输入规模是指输入量的多少,一般可以从问题描述中得知。

基本语句是执行次数与整个算法的执行次数成正比的语句,基本语句对算法运行时间的贡献最大,是算法中最重要的操作。

算法的计算复杂性概念

① 复杂性:所需资源多少

② 算法复杂性:算法运行时所需资源的量

③ 时间复杂性:所需时间资源的量T(n)

④ 空间复杂性:所需空间资源的量S(n)

评价一个算法的好坏主要是从两个方面:

一是看算法运行所占用的时间。时间复杂度来衡量,例如:在以下3个程序中,

(1)x=x+1;
(2)for(i=1;i<=n;i++)x=x+1;
(3)for(i=1;i<=n;i++)for(j=1;j<=n;j++)x++;

语句x=x+1的出现的次数分别为1,n和(n+1)n/2,则这三个程序段的时间复杂度分别为O(1),O(n),O(n^2),分别为常量阶、线性阶和平方阶。

在算法时间复杂度的表示中,还有可能出现的有:对数阶O(log n),指数阶O(2n)等。C,log n,n,nlog n,n^2,n^3,2^n。

指数阶的算法不是一个好的算法。

二是看算法运行时所占用的空间,即空间复杂度。空间复杂度不如时间复杂度那么重要。

时间复杂性和空间复杂性在一定条件下是可以相互转化的。动态规划法是一种以牺牲空间换取时间的很好算法。

非递归算法时间复杂度分析

算法的时间复杂度是指算法运行所需的时间。

设有一个在抽象机上运行的算法A,I是某次运行时的输入数据,其规模为n,则算法A的运行时间T是n和I的函数,记做T(n,I)。又设在该次运算中抽象机的第i个基本运算Oi的执行次数为βi,1≤i≤m。βi也是n和I的函数,记做βi(n,I)。那么算法A在输入为I时的运行时间是:

最好、最坏和平均时间复杂度:

最好时间复杂度

最坏时间复杂度

平均时间复杂度

递归算法的时间复杂度分析

扩展递归,扩展就是将地推关系式中等式右边的项根据递推式进行替换,扩展后的项被在此扩展,依此下去,得到一个求和表达式,然后就可以借助于求和技术了。

例,分析下列递推式的时间复杂度:

设n=2^k,将递推式扩展

递归算法实际上是一种分而治之的方法,是把复杂问题分解为若干个简单问题来求解,通常满足如下通用分支递推式:

其中a,b,c,k都是常数。这个递推式描述了规模为n的原问题分解为b个规模为n/b的子问题,其中a个子问题需要求解,是合并各个子问题的解需要的工作量。

如果T(n)式一个非递减函数,且满足通用分支递推式,则有以下结果成立:

算法的渐进分析

1、若存在两个正的常数c和n0,对于任意n>=n0,都有T(n)<=c*f(n),则称T(n)=O(f(n))。

大O符号用来描述增长率的上限,表示T(n)的增长最多像f(n)增长的那样快,这个上限的阶越低,结果就越有价值。

2、若存在两个正的常数c和n0,对于任意n>=n0,都有T(n)>=c*g(n),则称T(n)=Ω(g(n))。

大Ω符号用来描述增长率的下限,表示T(n)的增长至少像g(n)增长的那样快,这个上限的阶越高,结果就越有价值。

O(f(n))和Ω(g(n))是一个函数集合,这个函数集合具有同样的增长趋势,f(n)和g(n)只是其中一个函数。

3、若是一个m次多项式,则A(n)=O()。

参考资料————

算法设计与分析(第3版),王红梅。

https://blog.csdn.net/m0_46316970/article/details/114340309


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

相关文章

为你的股票绘制趋势图

手里有一点点公司的股票&#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线绘制代码部分结果展示 写在最后 前言 说明…

使用mpl_finance画股票K线图

使用mpl_finance画股票K线图 前言正文 前言 今天给大家介绍一下如何利用 python 中的 mpl_finance 模块画股票K线图。 该模块在 matplotlib 2.0之前是叫做 matplotlib.finance 但此之后是叫做 mpl_finance。 详细介绍请看https://matplotlib.org/api/finance_api.html 。具体用…

Python画图实战之画K线图【附带自动下载股票数据】

关于Python画图的基本知识可以先查看下面这篇文章Python画图&#xff08;直方图、多张子图、二维图形、三维图形以及图中图&#xff09;https://blog.csdn.net/weixin_41896770/article/details/119798960 对于股民来说&#xff0c;K线图是最常见的一种参考&#xff0c;使用Pyt…

一步一步教你写股票走势图——K线图二(图表联动)

目录 一步一步教你写股票走势图——分时图一&#xff08;概述&#xff09; 一步一步教你写股票走势图——分时图二&#xff08;自定义xy轴&#xff09; 一步一步教你写股票走势图——分时图三&#xff08;对齐图表、自定义柱状图高亮&#xff09; 一步一步教你写股票走势图…

如何对走势图进行画线分析

现货黄金投资入门与技巧&#xff0c;如何都绕不开这个问题&#xff0c;那就是画线分析。画线分析是技术分析一个重要的流派&#xff0c;也是我们分析市场必不可少的手段&#xff0c;掌握画线的方法&#xff0c;对我们掌握现货黄金投资入门与技巧有很大的帮助。 一、支撑线和压力…

使用Python绘制精美绝伦的股票行情K线图

PythonPyQt2.74 本文简单介绍了如何从Tushare获取某支股票的价格数据&#xff0c;并根据价格数据画出相应的日K线图。 # -*- coding: utf-8 -*-import sys import talib import numpy as np import pandas as pd import tushare as ts import datetime as dt import pyqtgraph …

缠论 公式 自动画线 画笔 中枢 买卖点 源代码

显示效果 跨级别区间套演示 板块演示 个股演示 期货演示 源码如下&#xff1a; {三角形中枢}时间:4;A:HHHV(H,时间*5) AND HHV(H,时间*5)>REF(HHV(H,时间*5),1);B:LLLV(L,时间*5) AND LLV(L,时间*5)<REF(LLV(L,时间*5),1);CC1:DRAWLINE(A,H,B,L,0);CC2:DRAWLINE(B,L,A,H…

利用 python numpy +matplotlib 绘制股票k线图

一、python numpy matplotlib 画股票k线图 # -- coding: utf-8 -- import requests import numpy as np from matplotlib import pyplot as plt from matplotlib import animationfig plt.figure(figsize(8,6), dpi72,facecolor"white") axes plt.subplot(1…

一步一步教你写股票走势图——K线图三(添加均线)

目录 一步一步教你写股票走势图——分时图一&#xff08;概述&#xff09; 一步一步教你写股票走势图——分时图二&#xff08;自定义xy轴&#xff09; 一步一步教你写股票走势图——分时图三&#xff08;对齐图表、自定义柱状图高亮&#xff09; 一步一步教你写股票走势图…

[逐笔数据分析工具分享]如何分析股票逐笔数据

工具分享链接&#xff1a;https://pan.baidu.com/s/1fbDoPM2NzSBEn31gDBZnpQ 提取码&#xff1a;v0sm ​1. 配置stocklist.txt和datelist.txt stocklist为要分析的股票号码&#xff0c;可为任意个 datelist为要分析的日期&#xff0c;可为任意个 以上都为空时&#xff0c;则…

【K线绘图】教你用python绘制带有买卖点的股票K线图(附送鳄鱼指标、顾比均线指标、dataframe格式化输出)

提示&#xff1a;文章内买卖点不构成交易依据&#xff0c;请根据情况自行决策。 教你用python绘制带有买卖点的股票K线图&#xff08;附带鳄鱼指标、顾比均线指标、dataframe格式化输出&#xff09; 前言一、自己绘图&#xff0c;是不是疯了&#xff1f;二、分步说明1. 准备工作…

股票K线图绘制

股票K线图绘制 文章目录 股票K线图绘制前言一、股票K线图基础知识二、用Python绘制股票K线图总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都…

屏幕画笔工具Pointofix,期货/股票复盘分析画线好工具

工具介绍&#xff1a; Pointofix可以将K线图表定格在屏幕某一个画面上&#xff0c;然后可以使用工具趋势线、图形&#xff0c;放大某个细节等&#xff0c;是一款很好的复盘分析画线工具。 Pointofix使用功能&#xff1a; 1.高亮屏幕&#xff1a;手绘笔&#xff1b; 2.直线&…

解决一个信号6问题(sig6,signal6,SIGABRT,double free or corruption (!prev))

我遇到的信号6 99%都是由于数据越界导致&#xff0c;在memcpy的时候没有错误&#xff0c;在free的时候系统报SIGABRT。今天也不例外。代码是我写的&#xff0c;考虑不周&#xff0c;以后拷贝更多加小心。 上图中的data大小为1024&#xff0c;如果memcpy 1025各字节&#xff0c;…

Thread 1:Program received signal:SIGABRT错误之一

引起错误Thread 1:Program received signal:"SIGABRT"的可能情况很多 本文描述的是使用Tab Bar Controller时Tab Bar Item对应的View Controller在Attributes inspector中的NIB NAME与在identity inspector中的class设置的不对应引起的。 如图&#xff08;图片可能…