【落羽的落羽 数据结构篇】算法复杂度

在这里插入图片描述

文章目录

  • 一、数据结构和算法简介
  • 二、算法复杂度
    • 1. 时间复杂度
    • 2. 空间复杂度

一、数据结构和算法简介

数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学习各种各样的数据结构,比如线性表、树、图、哈希等等。

算法,是定义良好的计算过程。简单来说,算法就是一系列的计算步骤,用来将输入数据转换成输出结果。衡量一个算法的好坏,需要从算法的复杂度来分析。

二、算法复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源,因此衡量一个算法的好坏,一般是从时间和空间两个维度来看,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,空间复杂度主要衡量一个算法运行所需要的额外空间。

1. 时间复杂度

在计算机科学中,T(N)描述了该算法的指令执行次数,并不是计算程序的运行时间。因为一个程序的运行时间不仅关乎算法本身,还有编译器版本、机器配置新旧等等因素。
T(N)计算了程序的执行次数,假设每句指令执行时间基本一样(实际有差别但是微乎其微),那么执行次数和运行时间就成等比关系,执行次数就能代表程序运行时间效率的优劣。比如对于同一个问题,算法a的T(N)=N,算法b的T(N)=N2,那么算法a的时间效率优于算法b。

计算时间复杂度要注意:由于CPU一秒可以处理上亿条代码指令,所以变量的单次定义语句可以忽略,时间复杂度只计算循环语句。而我们计算时间复杂度只是想比较算法程序的增长量级,也就是N不断变大时T(N)的差别,而**常数项和低阶项对结果的影响很小,甚至最高项的系数也可以忽略影响,所以我们只保留最高项,并且它的系数视作1。如果T(N)中没有任何关于N的项,时间复杂度就是1。复杂度的最终表示通常使用O的渐进表示法。**
例如:
T(N)=3N2+2N+10,则时间复杂度为O(N2)
T(N)=5N3+N2+5N,则时间复杂度为O(N3)
T(N)=6,则时间复杂度为O(1)

来几个例子分析就懂了:

void Func1(int N) 
{ 
    int count = 0;   //忽略
    for (int i = 0; i < N ; ++i) 
    { 
        for (int j = 0; j < N ; ++j) 
        { 
            ++count; //N^2次
        } 
    } 
    for(int k = 0; k < 2*N ; ++k) 
    { 
        ++count; //2N次
    } 
    int M = 10; //忽略
    while(M--) 
    { 
        ++count; //10次
    }
}
//T(N)=N^2+2N+10  时间复杂度为O(N^2)
void Func2(int N)
{
    int count = 0;
    for(int k=0; k<100; k++)
    {
        ++count;    //100次
    } 
    printf("%d",count);
}
//T(N)=100  时间复杂度为O(1)
void func3(int n)
{
    int cnt = 1;
    while(cnt < n)
        cnt *= 2;
}
//n=2时,执行次数为1。n=4时,执行次数为2。n=16时,执行次数为4 ......
//假设执行次数为x,则2^x=n。x=log n,时间复杂度为O(logN)
//(对数的底数对结果的影响也可以忽略,因此不管底数是多少都可以省略不写,都表示为log n)
long long func4(size_t N)
{
    if(N==0)
        return 1;
    return func4(N-1)*N;
}
//递归也是一种循环,递归算法的时间复杂度是单次递归的时间复杂度乘递归次数
//时间复杂度为O(1)×N = O(N)
void func5(int N, int M)
{
    int count = 0;
    for(int k = 0; k<N; k++)
        count++;    //N次
    for(int k = 0; k<M; k++)
        count++;    //M次
    printf("%d", count);
}
//T(N)=N+M
//若N=M,则时间复杂度为O(N)。若M远大于N,则为O(M)。若N远大于M,则为O(N)

除此之外,有些算法的时间复杂度还存在最好、平均、最坏情况。最好情况是任意输入规模的最小运行次数(下界),最坏情况是任意输入规模的最大运行次数(上界)。一般情况下,我们都关注算法的最坏运行情况。比如冒泡排序算法,就存在这样的情况:
最好情况是数组已经有序,时间复杂度就是O(N);最坏情况是数组完全逆序,时间复杂度是O(N2),因此冒泡排序的时间复杂度取最差情况O(N2)
在这里插入图片描述

2. 空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中需要额外临时开辟的空间。空间复杂度并不是程序运行所占用的内存大小,计算的是变量的个数。大多数算法使用的是有限个变量,所以空间复杂度为O(1)。但对于递归算法,递归的空间复杂度等于单词递归的空间复杂度乘以递归次数,即O(1)×N=O(N)
在实际算法题目中,我们尤其关注时间复杂度,空间复杂度就不是特别重要了。

在这里插入图片描述

本篇完,感谢阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/959235.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 一、Tushare 介绍 Tushare 是一个提供中国股市数据的API接口服务&#xff0c;它允许用户…

Java 实现Excel转HTML、或HTML转Excel

Excel是一种电子表格格式&#xff0c;广泛用于数据处理和分析&#xff0c;而HTM则是一种用于创建网页的标记语言。虽然两者在用途上存在差异&#xff0c;但有时我们需要将数据从一种格式转换为另一种格式&#xff0c;以便更好地利用和展示数据。本文将介绍如何通过 Java 实现 E…

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-添加内核编译

编译内核时将该 HDF 驱动编译到镜像中&#xff0c;接下来编写驱动编译脚本 Makefile&#xff0c;代码如下所示&#xff1a; 加入编译体系&#xff0c;填加模块目录到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多内容可以关注&#xff1a;迅为RK3568开发板篇OpenHa…

【含开题报告+文档+PPT+源码】基于SpringBoot的校园跑腿管理系统

开题报告 本文旨在探讨校园跑腿系统的设计与实现&#xff0c;通过深入研究与分析&#xff0c;实现了一套包含用户管理、发布跑腿单、跑腿抢单、跑腿单评论、在线留言以及用户在线充值等功能的综合性系统。该系统以提高校园内物品跑腿与配送效率为核心目标&#xff0c;为广大学…

|Python新手小白中级教程|第三十一章:日期与时间(time库使用指令——深化)——time库的9种常见函数【实用干货,一定要收藏!】

文章目录 前言导入一、基础函数&#xff1a;time.time() time.localtime() time.mktime()1.time函数2.localtime函数3.mktime函数 二、更加复杂的函数&#xff1a;gmtime函数,asctime函数,ctime函数4.gmtime函数5.asctime函数6.ctime函数 三、应用型&#xff1a;sleep函数&…

【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析

在Windows系统中&#xff0c;你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效&#xff0c;如图&#xff1a; 你可以使用以下代码&#xff1a; import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …

计算机网络三张表(ARP表、MAC表、路由表)总结

参考&#xff1a; 网络三张表&#xff1a;ARP表, MAC表, 路由表&#xff0c;实现你的网络自由&#xff01;&#xff01;_mac表、arp表、路由表-CSDN博客 网络中的三张表&#xff1a;ARP表、MAC表、路由表 首先要明确一件事&#xff0c;如果一个主机要发送数据&#xff0c;那么必…

C++11 可变参数模版

目录 1.可变参数模版 1.1概念 1.2递归方式展开参数包 1.3逗号表达式展开参数包 1.可变参数模版 1.1概念 C11的新特性可变参数模板&#xff0c;这是一种允许模板函数或模板类接受任意数量参数的特性。可变参数模板极大地增强了模板的灵活性和表达能力&#xff0c;使得编写…

React和Vue有什么区别,如何选择?

React和Vue有什么区别&#xff0c;如何选择&#xff1f; React 和 Vue 是当前最受欢迎的前端框架之一&#xff0c;两者在开发者中都有极高的声誉。它们都旨在帮助开发人员构建用户界面&#xff0c;但在实现方式和适用场景上有所不同。如果你正考虑在项目中选择 React 或 Vue&a…

Yocto项目 - 解读CROss PlatformS (CROPS)

一、概述 Yocto项目是一个用于创建自定义Linux发布版本的工具集成项目&#xff0c;在应对复杂应用场景时能提供高度可自定义性。但是在多端机应用中&#xff0c;如何在不同的平台上可靠地完成构建工作&#xff1f;CROss PlatformS (CROPS)即展示了其重要作用。 CROPS是Yocto项…

Electron学习笔记,安装环境(1)

1、支持win7的Electron 的版本是18&#xff0c;这里node.js用的是14版本&#xff08;node-v14.21.3-x86.msi&#xff09;云盘有安装包 Electron 18.x (截至2023年仍在维护中): Chromium: 96 Node.js: 14.17.0 2、安装node环境&#xff0c;node-v14.21.3-x86.msi双击运行选择安…

如何快速开发LabVIEW项目,成为LabVIEW开发的高手

发现了一篇多年前写的文章&#xff0c;转发到这里 如何快速开发LabVIEW项目&#xff0c;成为LabVIEW开发的高手。 如果您手里有LabVIEW项目&#xff0c;领导催的又很紧&#xff0c;该怎么办&#xff1f; 如果您公司规模小&#xff0c;就想把LabVIEW项目快速搞定&#xff0c;有什…

RTMP|RTSP播放器只解码视频关键帧功能探讨

技术背景 我们在做RTMP|RTSP直播播放器的时候&#xff0c;遇到过这样的技术诉求&#xff0c;在一些特定的应用场景中&#xff0c;可能只需要关键帧的信息&#xff0c;例如视频内容分析系统&#xff0c;可能只对关键帧进行分析&#xff0c;以提取特征、检测对象或场景变化。鉴于…

Lua 环境的安装

1.安装Lua运行环境 本人采用的是在windows系统中使用cmd指令方式进行安装&#xff0c;安装指令如下&#xff1a; winget install "lua for windows" 也曾使用可执行程序安装过&#xff0c;但由于电脑是加密电脑&#xff0c;最后都已失败告终。使用此方式安装可以安…

Prometheus+grafana实践:Doris数据库的监控

文章来源&#xff1a;乐维社区 Doris数据库背景 Doris&#xff08;Apache Doris&#xff09;是一个现代化的MPP&#xff08;Massive Parallel Processing&#xff0c;大规模并行处理&#xff09;数据库&#xff0c;主要用于在线分析处理&#xff08;OLAP&#xff09;场景。 D…

Spring Boot整合JavaMail实现邮件发送

一. 发送邮件原理 发件人【设置授权码】 - SMTP协议【Simple Mail TransferProtocol - 是一种提供可靠且有效的电子邮件传输的协议】 - 收件人 二. 获取授权码 开通POP3/SMTP&#xff0c;获取授权码 授权码是QQ邮箱推出的&#xff0c;用于登录第三方客户端的专用密码。适用…

FPGA实现光纤通信(3)——光纤8b/10b编码数据回环

前言 光纤通信属于高速串行通信,具有较高的数据传输速率,通常用于服务器以及通信设备之间用于高速数据交换,对于xilinx 7系列的FPGA,内部具有集成的高速接口用于实现光纤通信。本次就来实现8b/10b编码数据回环。 测试环境:vivado版本:2020.02 FPGA芯片:XC7K70T 测试说…

Linux网络之TCP

Socket编程--TCP TCP与UDP协议使用的套接字接口比较相似, 但TCP需要使用的接口更多, 细节也会更多. 接口 socket和bind不仅udp需要用到, tcp也需要. 此外还要用到三个函数: 服务端 1. int listen(int sockfd, int backlog); 头文件#include <sys/socket.h> 功能: …

如何设计浪漫风格的壁纸

一、选择浪漫的色彩 柔和色调&#xff1a; 粉色系&#xff1a;粉色是浪漫的经典色彩&#xff0c;包括淡粉色、玫瑰粉、樱花粉等&#xff0c;能够营造出温馨和甜蜜的氛围。 紫色系&#xff1a;紫色带有神秘和高贵的感觉&#xff0c;如薰衣草紫、淡紫色等&#xff0c;适合营造浪…

PBFT算法

在我的博客中对于RAFT算法也有详细的介绍&#xff0c;raft算法包含三种角色&#xff0c;分别是&#xff1a;跟随者&#xff08; follower &#xff09;&#xff0c;候选人&#xff08;candidate &#xff09;和领导者&#xff08; leader &#xff09;。集群中的一个节点在某一…