算法 基础

article/2025/11/10 19:59:06

什么是算法?

算法(Algorithm)
是指解题方案的准确而完整的描述,
是一系列解决问题的清晰指令,
算法代表着用系统的方法描述解决问题的策略机制。
一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

大 O 表示法

定义:如果存在着正的常数 c 和自然数 n0,当 n >= n0 时;有 f (n) <= Cg(n) 成立,则称 f( n ) = O(g( n ))

算法分析中, 如果一个的算法的时间复杂性是O(g( n )),
读作 g( n )  “ 级  ” 的 或 “ 阶 ” 的。
 如: 线性阶的(O(n))、平方阶的(O(n^2))、立方阶的(O(n^3)) ……

1) 加法规则 T(n,m) = T1(n) + T2(n) = O (max ( f(n), g(m) )
2) 乘法规则 T(n,m) = T1(n) * T2(m) = O (f(n) * g(m))
3) 一个特例(问题规模为常量的时间复杂度)
在大O表示法里面有一个特例,如果T1(n) = O(c), c是一个与n无关的任意常数,
T2(n) = O ( f(n) ) 则有T(n) = T1(n) * T2(n) = O ( c*f(n) ) = O( f(n) )
在大O表示法中,任何非0正常数都属于同一数量级,记为O(1)。
4) 一个经验规则
复杂度与时间效率的关系:
c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是常量)
高                                                                     低

越靠左边效率越高,越靠右边效率越低

算出次数方程,求极限值

案例分析(一)
设 T(n) = (n+1)2    = n2+2n +1 <=  n2 + 2n2 + n2;
选 n0 = 1, c=4 ; T(n) <= 4n2。所以,T(n) = O(n2) 当 n 为无穷大,4可以忽略
案例分析(二)
设 T(n) = 3n3+2n2
T(n) <= 5n3。所以,T(n) = O(n3)

在算法分析中,通常所说的找到了时间复杂性的级别,
是指找到了同样级别的最简单的函数。
如:307 n2、 n2/2、 n2 都是同一级别的函数,最简单的函数是n2 。
所以, 307 n2、 n2/2、 n2 的级别都是O(n2 ) 。

时间复杂性的级别的判断:级别越低越好

如果算法的空间和数据的数目个数无关,空间复杂度就是O(1)

常用排序算法复杂度

常用程序的时间复杂度

/*算法: 解决问题的方法特征:1.有穷性:有限个执行步骤,执行结束终止2.确切性: 每一步都有确定的含义3.输入项:0个或者多个 要有数据的输入 默认初始化的方式4.输出项:对输入的数据做实质性分析5.可行性:每一个步骤在一定时间内可以完成算法优劣:1.时间复杂度:程序运行的时间2.空间复杂度:程序用到的最大空间3.正确性4.可读性5.健壮性:针对特殊数据代码是否可行时间复杂度: 大O表示法用程序执行的最多的次数去描述时间复杂度放大化T(n)=n 次 ---> O(n);T(n)=2*n+n^2+1 次  2*n+n^2+1<=3*n^2  O(n^2) 近似描述T(n)=n^2+1 次  O(n^2);  极限T(n)+T(n^2) 次 Max(T(n),T(n^2))  O(n^2);T(n)=C(常量)   O(1);
*/
#include <stdio.h>
/*1.函数调用: O(1);2.交换数据: O(1);3.循环看循环条件No.1 循环条件是变量-> 时间复杂度跟随变量变化4.递归的复杂度递归操作:No.1 每次递归都是问题的规模的减半,其他地方是常数 二分法T(n)=T(n/2)+O(1)   T(n)=O(log2N)No.2 每次操作-1 递推的形式形成递归 T(n)=O(n)    求阶乘
*/
void test1(int n) 
{int x = 0;for (int i = 1; i <= n; i++) {x++;      //n}//时间复杂度为O(n)  最多执行n次     for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {x++;  //n^2}}//时间复杂度为O(n^2) 最多执行n^2次     //加法原则Max()
}
void test0(int n) 
{
#if 0//O(n);int result = 0;for (int i = 0; i < n; i++)result += i;printf("%d\n", result);
#endif//O(1);-> 数学表达式 等差数列求和int result = 0;result = n * (n + 1) / 2;//1+2+3+..n;//n+n-1+..1;//(n+1)n/2printf("%d\n", result);
}
int  F(int n) 
{if (n == 1 || n == 2)       //O(1)return 1;return F(n - 2) + F(n - 1); //O(n)
}int main() 
{int array[3] = { 1,2,3 };		//数组遍历-> 程序执行次数与数组长度有关联for (int i = 0; i < 3; i++) {printf("%d\t", array[i]);   //3次  无限化 n次}return 0;
}

一些简单的算法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//字符串转数字
int my_atoi(char* str)			//123
{int result = 0;		int i = 0;while (str[i] != '\0')	    //1							//2      //3{result = result * 10 + str[i] - '0';   //result=1   10+2=12  //120+3//'1'-'0' =1  ASCIIi++;                    //位数}return result;
}
//递归的方式 要描述次数-> 加一个长度
int loop_atoi(char* str, int len) 
{if (len == 1)return str[len - 1] - '0';elsereturn loop_atoi(str, len - 1) * 10 + str[len - 1] - '0';
}//求最大公约数: 同时能够整除的两个数的最大整数
//链表的反转
//--->4 8  -->4 最大公约数
//--->2 3  -->6 最小公倍数
//递归的方式
int gcd(int m, int n) 
{//保持m是最大的if (m < n) {int temp = m;m = n;n = temp;}if (n == 0) {return m;       //直接返回m}return gcd(n, m % n);
}
//数字类的递归->把值带进去
unsigned int Gcd(unsigned int M, unsigned int N)
{unsigned int Rem;   //36 16      -->4while (N > 0){Rem = M % N;    //Rem=36%16  -->4   Rem=16%4=0M = N;          //M=16       -->    M=4N = Rem;		//N=4        -->    N=0}return M;			//4
}
int main() 
{printf("%d\t", my_atoi("1234"));printf("%d\t", loop_atoi("1234",4));printf("%d\t", gcd(8, 4));return 0;
}/*输出*/4

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

相关文章

《算法基础》简单算法

《acwing算法基础》简单算法 文章目录 《acwing算法基础》简单算法快速排序:思路:时间复杂度:代码:快排边界问题:练习题: 归并排序:思路:时间复杂度:代码:练习题: 二分思想:思路:时间复杂度:代码:练习题: 一维前缀合与二维前缀和:差分:双指针算法:模板:练习题: 二进制算法:离散…

算法(基础)

算法基础 学习网址排序线性表顺序表链表栈与队列栈队列贪心法分治法搜索法滤波哈夫曼编码与译码B站视频csdn博客算法是编程的灵魂 学习网址 https://www.runoob.com/排序 冒泡排序分析

算法基础课-基础算法

基础算法 第一章 基础算法1快速排序2归并排序3二分算法整数二分浮点二分 4高精度高精度加法高精度减法高精度乘法&#xff08;一个高精度乘正常整数&#xff09;高精度除法&#xff08;一个高精度除以正常整数&#xff09; 5前缀和一维前缀和二维前缀和 6差分一维差分二维差分 …

【算法基础】基础算法

快速排序 模板题&#xff1a;785. 快速排序 - AcWing题库 思路&#xff1a; 定义一个x&#xff08;一般喜欢用中间的&#xff09;&#xff0c;我们快速排序&#xff0c;让x左边的都比它小&#xff0c;同时让右边的都比它大。然后像二分一样不断细分&#xff0c;缩小范围进行同…

数据结构与算法基础

来源&#xff1a; bilibili数据结构与算法基础&#xff08;青岛大学-王卓&#xff09; 1.2 基本概念和术语 数据结构 数据元素之间的关系称为结构&#xff0c;数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 数据结构的两个层次&#xff1a;逻辑结构和物理结构…

数据结构与算法基础(一)

大家好 我是makasa 这个栏目呢&#xff0c;我会按照我之前通过视频学习的一个笔记来记录. 同时,通过写这几篇blog来巩固一下我的基础 数据结构与算法&#xff0c;顾名思义&#xff0c;分为两个部分&#xff1a;数据结构、算法。那它们各自具体概述是什么呢。让我们看以下两个图…

【算法】算法基础

文章目录 1. 字符串1.1LeetCode151 Reverse Words in a String1.2LeetCode557 Reverse Words in a String III1.3统计字符串字母&#xff0c;数字&#xff0c;空格和其他字符个数1.4把字符串转换成整数1.5回文字符串 2.整数2.1LeetCode7 Reverse Integer2.2判断一个数是不是质数…

算法基础---基础算法

文章目录 快速排序归并排序二分 整数二分浮点数二分高精度 高精度加法高精度减法高精度乘法高精度除法前缀和 一维前缀和二维前缀和差分 一维差分二维差分双指针位运算离散化区间合并 一、快速排序 思想&#xff1a;1.首先确定一个分界点&#xff08;随机取任意一点为…

算法基础知识总结(基础算法)

算法基础知识总结 Efficient procedures for solving problems on large inputs. 一、基础算法 1、快速排序 1、类别&#xff1a;快速排序是一种 交换排序&#xff0c;冒泡排序也是一种交换排序。 2、原理&#xff1a;将未排序的元素根据一个作为基准的主元&#xff08;Pi…

算法基础知识

一、算法的定义 算法&#xff1a;对特定问题求解步骤的一种描述&#xff0c;是为解决一个或一类问题给出的一个确定的、有限长的操作序列。 二、算法与程序的区别与联系 区别&#xff1a; 程序&#xff1a;与某种编程语言有关&#xff0c;能直接在机器上运行。 算法&#xff1a…

算法基础简介

一、什么是算法 在数学领域&#xff0c;算法是为了解决某一类问题的公式和思想。 在计算机领域&#xff0c;本质是一些计算机指令&#xff0c;解决特定运算和逻辑问题。 算法的掌握程度&#xff0c;一方面可以检验程序员对计算机底层的了解&#xff0c;一方面也…

Unity 移动的几种方法(从某一点移动到另外一点)

对于unity的几种移动方法,在以下给出整理 1 方向*速度 2 vector.lerp 与目标点永远不会重合 3 vector.MoveTowards 会与目标点重合 4 translate方法 纯移动 5 WASD键盘方法 刚 体方法 7.鼠标方法 捕鱼达人 8.射线方法(指哪到哪) Controll…

Unity 控制物体移动

目录 1、通过改变物体的位置使物体移动 2、通过给物体施加力使物体移动 3、移动characterController以及碰撞检测 一、相关代码展示 1、通过改变物体的位置使物体移动 using System.Collections; using System.Collections.Generic; using UnityEngine;public class move …

unity3D人物移动的实现(一)

人物的移动&#xff0c;首先要考虑人物与地面的碰撞&#xff0c;碰撞发生的条件是&#xff0c;两者必须都为碰撞体&#xff0c;且至少有一方为刚体&#xff0c;为了方便&#xff0c;我们就给人物加上刚体属性和碰撞体。 1首先是碰撞体属性&#xff0c;人形使用胶囊碰撞体&#…

Unity让物体跟随鼠标移动

前言 最近在学习Unity&#xff0c;记录下学习的成果吧。本文最终结果是要实现一个小飞机跟随鼠标移动的效果。看下图片。 向量 在Unity中&#xff0c;每个对象都有自己的位置属性&#xff0c;组件叫做Transform,通过Transform可以获取对象的位置属性。在上面的实例中&#…

01_Unity常用的移动方法

文章目录 基础框架匀速移动变速移动自定义变速运动总结&#xff1a; 在制作一款游戏的时候&#xff0c;经常需要对物体的位置进行移动&#xff0c;我们希望这个移动是具有多样性的&#xff0c;并且可操作的。 C#中提供了非常丰富的移动代码工具&#xff0c;通过这些工具我们可以…

Unity点击物体后,移动到物体所在位置

Unity点击物体后&#xff0c;移动到物体所在位置 方法一&#xff1a;OnMouse检测&#xff08;需要Collider组件&#xff09; 脚本挂在被点击的物体上 using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;/// <summary> /// 缺点…

Unity2D教程:人物移动

关注专栏&#xff0c;持续更新哦 教程总目录 按键 自带的Input有GetAxisRaw来获取按下按键后所对应的值&#xff0c;Input.GetAxisRaw(“Horizontal”)在按下D或右箭头返回1&#xff0c;A或左箭头返回-1&#xff1b;Input.GetAxisRaw(“Vertical”)同理。 Input.GetAxis会根…

Unity物体跟随鼠标移动

刚开始在将鼠标点转换为世界坐标时&#xff0c;我以为可以直接使用Unity的Camera.main.ScreenToWorldPoint( Input.mousePosition ) 就完事了&#xff0c;事实证明我想的太简单了。在我们使用这个API将鼠标屏幕点&#xff08;Screen&#xff09;转换成世界坐标&#xff08;Worl…

Unity中物体移动方法详解

一&#xff1a;Transform ——transform.Translate&#xff1a;不会考虑到碰撞transform.Translate(Vector3 targetPos&#xff0c;指定参照坐标系(默认为Space.Self)) ——transform.position&#xff1a;直接改变物体的坐标 二&#xff1a;刚体 ——MovePosition ——veloc…