算法基础简介

article/2025/11/10 20:36:31

一、什么是算法

        在数学领域,算法是为了解决某一类问题的公式和思想。
        在计算机领域,本质是一些计算机指令,解决特定运算和逻辑问题。
        算法的掌握程度,一方面可以检验程序员对计算机底层的了解,一方面也可以衡量程序员的思维逻辑能力。

二、什么是数据结构

        数据结构是数据的数据管理和组织的格式,使用目的是为了更高效的访问和修改数据。

1、数据结构的组成方式

1.1 线性结构

在这里插入图片描述

        包含数组、链表、栈、队列等

1.2 树形结构

在这里插入图片描述
        比较常用的是二叉树、二叉堆等

1.3 图

在这里插入图片描述
        比较复杂的数据结构,在图中会呈现出多对多的关联关系。

1.4 其他类型数据结构

在这里插入图片描述
        基本都是由基本数据结构演变而来,作用是为了解决某些特定问题。例如哈希表、跳表等。

三、数据结构和算法的关系

        数据结构是算法的基石。如果算法是高速公路上行驶的汽车,那么数据结构就是高速公路。
        不同的算法会采用不同的数据结构。例如:①堆排序算法中用的是二叉堆数据结构。②冒泡排序算法用的是数组数据结构。

四、算法的好坏标准

        一次代码运行的时间和所占用的内存决定的这个代码的好坏。
        算法最重要的两个标准:空间复杂度、时间复杂度。
        复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率和数据规模之间的增长关系。

函数和复杂度的转换原则
① 如果是常量级,则使用常数1表示。
② 只保留函数中的最高阶项。
③ 如果最高阶项存在,则省去最高阶项前面的系数。

1、时间复杂度

时间复杂度是算法执行的时间成本

1.1 常见时间复杂度

1.1.1 O(n)

        张三买了一屉包子,一屉包子中有10个,没三分钟吃掉一个。那么吃掉这一屉包子需要多久?
        答案:3*10=30min。
        如果有n个包子,可以记做T(n)=3n。转换为时间复杂度就是T(n)=O(n)

1.1.2 O(logn)

        假设张三比较饿,所以买了16个包子,张三每5分钟吃掉一半的包子,也就是第一个5分钟吃了8个包子,第二个5分钟吃掉4个包子,以此类推。那么张三把包子吃的只剩一个的时候,需要多久呢?
        答案:题目相当于让数字16不断的除以2,几次之后的结果为1。以2为底16的对数,也就是log2(16)。1次是5分钟,让5log2(16)=20。
        如果有n个包子,可以记做T(n)=5
log2(n),时间复杂度为T(n)=O(logn)

1.1.3 O(1)

        张三买了n屉包子和1个鸡蛋,张三每2分钟吃掉1个鸡蛋。那么张三吃掉整个鸡蛋需要多久呢?
        答案:2分钟
        也就是无论多少个包子,张三只吃一个鸡蛋,那么吃鸡蛋这个行为的数学公式可以表述为T(n)=2,转换为时间复杂度T(n)=O(1)

1.1.4 O(n2)

        张三买了一屉包子10个,吃掉第一个包子的时候需要花费1分钟,吃掉第二个包子的时候需要花费2分钟,吃掉第三个包子的时候需要花费3分钟,以此类推,每吃掉1个包子,所花费的时间就比上一次多1分钟,那么张三吃掉一屉包子需要多久呢?
        答案:1+2+3+4+5+6+7+8+9+10=55
        如果有n个包子, T ( n ) = 1 2 n 2 + 1 2 T(n)=\frac 12n^2+ \frac 12 T(n)=21n2+21
        转换为时间复杂度为T(n)=O(n2)

1.1.5 时长对比

        如果n足够大:
O ( 1 ) < O ( l o g n < O ( n ) < O ( n 2 ) ) O(1)<O(logn< O(n)<O(n^2)) O(1)<O(logn<O(n)<O(n2))

1.2 其他形式的时间复杂度

O ( n l o g n ) 、 O ( m n ) 、 O ( 2 n ) 、 O ( n ! ) 等 等 O(nlogn)、O(mn)、 O(2^n)、O(n!)等等 O(nlogn)O(mn)O(2n)O(n!)

2、空间复杂度

在执行一段代码的时候,会用到一些中间数据,中间数据所占用内存空间的大小就是空间成本,描述空间成本的方法叫空间复杂度

2.1 常见的空间复杂度

2.1.1 常量空间O(1)

        当算法的存储空间大小固定,和输入规模没有直接关系的时候,空间复杂度为O(1)

public static void method(int n)
{int var = 3;---
}

2.1.2 线性空间O(n)

        算法分配的空间是一个线性集合,例如数组,并且集合大小和输入的数值n成正比,那么空间复杂度就是O(n)

public static void method(int n)
{int[] var = new int[n];---
}

2.1.3 二维空间O(n2)

        算法分配的空间是一个二维数组集合的时候,并且集合大小和宽度都与输入的数值n成正比,那么空间复杂度就是O(n2)

public static void method(int n)
{int[][] matrix = new int[n][n];---
}

2.1.4 递归空间O(n)

        递归是一个比较特殊的场景,虽然递归代码中并没有显示的声明变量或集合,但是计算机在执行程序时,会专门分配一块内存,用来存储“方法调用栈”
        方法调用栈有入栈和出栈2个行为。当执行一个新的函数时,执行入栈操作,把调用的方法和参数信息压入栈中。当方法返回的时候,执行出栈操作,把调用的方法和参数信息从栈中弹出。
        纯粹的递归空间也是线性O(n)的。

public static int method(int n)
{if (n == 1){return 1;}return n + method(n-1);
}

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

相关文章

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…

【Unity】如何优雅地移动物体-8个方法

在游戏开发中&#xff0c;如何移动物体&#xff1f;是我们需要思考的事情。 Unity 引擎也提供了众多的方法&#xff0c;每个开发者的使用习惯也各不相同&#xff0c;所以往往不是很清楚在这种场景下哪种方式最好的或者最有效的。 那么&#xff0c;这篇文章&#xff0c;我想分享…

详解Unity的几种移动方式实现

前言 最近在学习如何制作 FPS 游戏&#xff0c;学习了如何使用角色控制器来控制角色的移动跳跃等等&#xff0c;结合之前学到的使用 transform&#xff0c;刚体等使物体移动&#xff0c;不同的移动方式适用于不同的场景&#xff0c;今天就来简要盘点一下各种移动方式以及其优劣…

unity物体四种移动方法总结

目录 一.通过修改位置来实现移动 二.通过物理系统实现位移 三.通过输入控制物体移动 一.通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法。 1.使用Translate&#xff08;&#xff09;函数。 2.&#xff0c;直接指定新的位置 将上述两种方法在void …

详解Unity的移动控制实现

前言 上一篇写了数种Unity中的移动方式&#xff0c;有物理移动&#xff0c;有非物理移动等&#xff0c;这篇我们来谈谈Unity中的移动控制方式&#xff0c;来结合上一篇所说的方法&#xff0c;用起来。一般控制是通过获取用户输入来处理角色移动逻辑的&#xff0c;而用户输入的…

JSON数据和解析

JSON> JavaScript Object Notation JSON是一个字符串 常常用于网络传输数据的一种字符 json数据是一种轻量级的数据交换格式&#xff0c;它基于一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语…

Android开发之JSON数据解析详解(一)

&#xfeff;&#xfeff; 今天很高兴和大家一起学习Android的JSON数据解析,可能对于学习安卓的朋友都知道JSON在数据解析方面已经很普遍了.所以也是我们必定要了解的知识 ,下面让我们了解一下JSON的发展历程. XML——这种用于表示客户端与服务器间数据交换有效负载的格式&am…

Android开发json数据解析

在Android开发过程中&#xff0c;或更新数据&#xff0c;或为减轻手机负担将大部分复杂运算交由服务器来进行&#xff0c;都需要与服务器之间进行数据交互&#xff0c;数据交互中&#xff0c;使用的较为频繁的格式变为json数据&#xff0c;书写便捷&#xff0c;操作方便&#x…

JSON解析data数据

之前 是用JSONObject去解析data后来就报错 com.alibaba.fastjson.JSONException: expect : at 0, actual

JSON数据解析 之JSONPath

一&#xff1a;JSONPath说明&#xff1a; JSONPath是一种通过配置正则表达式语法&#xff0c;抽取json中的指定数据的一种类库&#xff1b; 二&#xff1a;需要的jar依赖&#xff08;依赖阿里巴巴的fastjson.jar&#xff09; maven用户可通过maven远程仓库获取配置地址 <…

一文搞懂JSON及JSON数据解析

文章目录 前言一、XML1、简介2、XML解析方式2.1、SAX解析方式2.2、DOM解析方式2.3、JDOM解析方式2.4、DOM4J解析方式 二、JSON1. 简介及其语法格式2. 解析方式2.1 GSON解析2.1.1 对象转换为JSON字符串2.1.2 JSON字符串转换为对象 2.2 fastjson2.2.1 对象转换为JSON字符串2.2.2 …

c语言解析json数据

我使用的是cJSON: http://sourceforge.net/projects/cjson/ 先看json的数据结构 c中没有对象&#xff0c;所以json数据是采用链表存储的 C代码 typedef struct cJSON { struct cJSON *next,*prev; // 数组 对象数据中用到 struct cJSON *child; // 数…