时间复杂度分析与递归,以新南UNSW的COMP2521作业题为例
作者:Smooth(连接教育高级讲师)
首发于:UNSW学习知识库(UNSW Study Wiki)
创作时间:2025年3月5日
如何测度算法的时间性能?理论分析Theoretical Analysis
测度算法时间性能的两种方式:实证分析Empirical Analysis、理论分析Theoretical Analysis
for (int i = 0; i < n; i++)
每一个算法都由一些核心的原始操作(primitive operations)组成:赋值、函数调用、计算表达式、递增和递减
我们可以假设执行任意一个原始操作花费的时间都差不多
得到上面的代码一共执行了1+(n+1)+n次原子操作
如果一次原始操作耗时c,则整个算法花费时间为c(2n+2)
算法运行的时间与输入数据的规模呈正相关
当输入数据的规模越大时,越能反映算法之间的性能差距

一般只考虑在最坏情况时(Worst case)算法的性能(如必须跑完整个for循环才找到你想要的值)
时间复杂度(Time complexity):算法运行所需要的时间,它是一个关于输入数据量的函数

渐进行为(Asymptotic Behaviour):当输入规模n趋近于无穷大的时候,算法的复杂度的增长趋势
-
去除低阶项
-
去除常数系数
渐进符号:O、Ω、Θ
大O表示法(Big-Oh notation):用于对算法的渐进行为进行分类,这也是通常表达时间复杂度的方式
Lab题目任务1:GCD(计算最大公约数)


这道题目的翻译是:
两个整数a和b的最大公约数(GCD)是能同时整除a和b的最大整数。例如,16和28的GCD是4,因为16=4×4且28=4×7,没有比4更大的整数能同时整除两者。
虽然可以通过完全分解两个数并寻找公共因数来计算GCD,但这里有一个更快速简便的方法。
当我们用a除以b得到余数r时,a和b的公约数完全等同于b和r的公约数。因此,以下等式成立:
gcd(a, b) = gcd(b, r)
如果我们从任意两个正整数开始,并重复应用此等式,最终余数r会变为0,此时这对数中的另一个数即为最大公约数。
这种神奇的方法被称为欧几里得算法,可能是已知最古老的非平凡算法,最早记载于公元前300年左右的《几何原本》。
你的任务是在gcd.c中实现以下函数:
int gcd(int a, int b);
该函数需使用上述欧几里得算法计算两个整数的GCD。你可以假设a和b是非负数,且最多其中一个为0。
要求
-
禁止使用循环:不得使用
while、for、do循环或goto语句。使用这些结构的答案将不得分。 -
禁止辅助函数:不得使用辅助函数。若使用,本题最多只能获得一半分数。(为什么?如果需要辅助函数,可能表明未完全理解递归,建议向导师寻求反馈!)
-
测试用例:
gcd.c包含一个main函数用于测试。程序通过命令行参数接收两个整数,例如:./gcd 16 28 # 输出:The GCD of 16 and 28 is 4 ./gcd 0 42 # 输出:The GCD of 0 and 42 is 42
解题思路:
-
递归终止条件:当第二个数
b为零时,返回第一个数a作为结果。 -
递归步骤:如果
b不为零,递归调用gcd(b, a % b)。这里a % b是a除以b的余数。
这种方法避免了显式的循环结构,完全依赖递归调用来不断减少问题规模,直到满足终止条件。
解决代码
int gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}
}
该算法的时间复杂度是 O(log(min(a, b))),因为每次递归调用都会将问题规模至少减少一半。这种方法高效且简洁,完全符合题目要求,不使用任何循环结构或辅助函数。
如果需要COMP2521更多的资料:UNSW学习知识库(UNSW Study Wiki)
相关文章:
时间复杂度分析与递归,以新南UNSW的COMP2521作业题为例
作者:Smooth(连接教育高级讲师) 首发于:UNSW学习知识库(UNSW Study Wiki) 创作时间:2025年3月5日 如何测度算法的时间性能?理论分析Theoretical Analysis 测度算法时…...
RxJS与Redux革命性协同:打造高效、解耦的前端状态管理方案
摘要 本文探讨RxJS与Redux的融合应用,通过真实用户场景揭示其必要性,系统讲解整合策略,从基础到高级涵盖响应式编程优化、异步操作处理、状态流控制等核心主题。提供可落地的架构方案与性能优化技巧,包含10可复用代码示例和20实战…...
蓝桥杯P1259-奇怪的馈赠 (贪心题解)
题目:奇怪的捐赠 题目来源:1.奇怪的捐赠 - 蓝桥云课 题目描述 需要将 100 万(1,000,000)正好分成若干个 7 的次方形式的数(如 7^01, 7^17, 7^249 等),且每种金额(即每个 7 的次方…...
todo: 使用融云imserve做登录(android)
使用融云做登录注册思路 注册界面需要name, email, password考虑到融云注册用户的post格式 POST http://api.rong-api.com/user/getToken.json?userId1690544550qqcom&nameIronman这里的userId可以使用用户的email,但是要截断和 . 符号,即1690544…...
如何设置爬虫的User-Agent?
在爬虫开发中,设置合适的 User-Agent 是非常重要的一步。User-Agent 是 HTTP 请求头中的一个字段,用于标识客户端(通常是浏览器)的类型、版本、操作系统等信息。通过设置 User-Agent,可以模拟正常的浏览器访问行为&…...
C++ 二叉搜索树代码
C 二叉搜索树代码 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL){}TreeNode(T x):val(x), left(NULL), right(NULL){} };template<typena…...
OpenAI Whisper:开启语音转文本的智能时代
在人工智能技术飞速发展的今天,OpenAI推出的Whisper语音识别系统正悄然改变着人类与机器的交互方式。作为一款开源的AI驱动语音转文本工具,Whisper凭借其跨语言能力、高精度识别和灵活的生态系统,成为开发者和普通用户共同追捧的技术标杆。 核心技术与突破 Whisper基于深度…...
基于CSDN资源,搭建AI赋能农业典型场景落地方案
农业场景,不但是信息化、自动化等薄弱的产业,更是AI落地困难的场景。基于此,想通过这篇文章查找一个CSDN相关资源,论证一下AI赋能农业三个典型场景的实现思路。 场景1:水质-土壤智能调控 **痛点:**水质恶…...
python量化交易——金融数据管理最佳实践——使用qteasy大批量自动拉取金融数据
文章目录 使用数据获取渠道自动填充数据QTEASY数据拉取功能数据拉取接口refill_data_source()数据拉取API的功能特性多渠道拉取数据实现下载流量控制实现错误重试日志记录其他功能 qteasy是一个功能全面且易用的量化交易策略框架, Github地址在这里。使用它&#x…...
RoboBrain:从抽象到具体的机器人操作统一大脑模型
25年2月来自北大、北京智源、中科院自动化所等的论文“RoboBrain: A Unified Brain Model for Robotic Manipulation from Abstract to Concrete”。 目前的多模态大语言模型(MLLM) 缺少三项必备的机器人大脑能力:规划能力,将复杂…...
DeepSeek本地接口调用(Ollama)
前言 上篇博文,我们通过Ollama搭建了本地的DeepSeek模型,本文主要是方便开发人员,如何通过代码或工具,通过API接口调用本地deepSeek模型 前文:DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注:本文不仅…...
数据库索引的作用:提升数据检索效率的关键
在数据库管理系统中,数据如同浩瀚海洋中的宝藏,如何快速准确地找到所需信息,成为了一个关键问题。这时候,数据库索引就如同一张精确的航海图,指引着我们高效地定位数据。那么,数据库索引究竟是什么…...
高效便捷的 Spring Boot 通用控制器框架
✨高效便捷的 Spring Boot 通用控制器框架✨ 一、简介 在 Java 开发中,重复性的基础接口编写工作常令人头疼。本框架基于 Spring Boot 与 MyBatis-Plus,精心构建通用控制器类BaseController,旨在为开发者排忧解难,极大减少繁琐的…...
SQL_语法
1 数据库 1.1 新增 create database [if not exists] 数据库名; 1.2 删除 drop database [if exists] 数据库名; 1.3 查询 (1) 查看所有数据库 show databases; (2) 查看当前数据库下的所有表 show tables; 2 数据表 2.1 新增 (1) 创建表 create table [if not exists…...
在 CentOS 上,常用几种方法来确保 Python 脚本在断开终端后继续运行
在 CentOS 上,你可以使用以下几种方法来确保 Python 脚本在断开终端后继续运行: 1. 使用 nohup 命令 nohup 命令可以让进程在终端关闭后继续运行。 nohup python main.py > output.log 2>&1 &nohup:忽略挂断信号,…...
全面回顾复习——C++语法篇1(基于牛客网C++题库)
注:牛客网允许使用万能头文件#include<bits/stdc.h> 1、求类型长度——sizeof()函数 2、将浮点数四舍五入——round()函数——前面如果加上static_cast会更安全一些 在C语言中可以使用printf(“.0l…...
一、数据库 MySQL 基础学习 (上)
一、数据库的概念 DB 数据库(database):存储数据的“仓库”,保存一系列有组织的数据 DBMS:数据库管理系统(Database Management System)。数据库是通过 DBMS 创建和操作的容器 创建的 DBMS: MySQL、Oracl…...
基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程
一、Django项目初始化 1.创建Django项目 Django-admin startproject 项目名 2.安装 djangorestframework pip install djangorestframework 解释: Django REST Framework (DRF) 是基于 Django 框架的一个强大的 Web API 框架,提供了多种工具和库来构建 RESTf…...
AutoGen学习笔记系列(七)Tutorial - Managing State
这篇文章瞄准的是AutoGen框架官方教程中的 Tutorial 章节中的 Managing State 小节,主要介绍了如何对Team内的状态管理,特别是如何 保存 与 加载 状态,这对于Agent系统而言非常重要。 官网链接:https://microsoft.github.io/auto…...
Redis渐进式遍历数据库
目录 渐进式遍历 数据库 渐进式遍历 keys*可以一次性的把整个redis中所有key都获取到,这个操作是非常危险的,因为可能一下获取到太多的key,阻塞redis服务器。要想很好的获取到所有的key,又不想出现卡死的情况,就可以…...
机器学习中的线性代数:奇异值分解 SVD
线性代数 奇异值分解(SVD) 参考资料: 超详细!彻底搞懂矩阵奇异值分解(SVD)本质计算应用!_哔哩哔哩_bilibili 非常好的视频,本文内容主要来自于该视频,在此表示感谢&#…...
【每日八股】计算机网络篇(三):IP
目录 DNS 查询服务器的基本流程DNS 采用 TCP 还是 UDP,为什么?默认使用 UDP 的原因需要使用 TCP 的场景?总结 DNS 劫持是什么?解决办法?浏览器输入一个 URL 到显示器显示的过程?URL 解析TCP 连接HTTP 请求页…...
6. PromQL的metric name(在node exporter复制下来交给AI解释的)
目录 前言: Go 运行时指标: Go 内存统计指标: CPU 指标: 内存指标: 磁盘指标: 网络指标: 系统指标: 前言: 写这个得目的是为了后续方便查询,因为在pro…...
基于单片机的速度里程表设计(论文+源码)
1 系统方案 本次智能速度里程表的总体架构如图2-1所示,在硬件上包括了STC89C52单片机,电机,显示模块,报警模块,DS1302时钟模块,超速检测模块,按键等等。在软件设计功能的功能上,按下…...
计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
nvidia驱动升级-ubuntu 1804
升级 1.从官网下载*.run驱动文件 2.卸载原始驱动 sudo /usr/bin/nvidia-uninstall sudo apt-get --purge remove nvidia-\* # 可能不需要加-\ sudo apt-get purge nvidia-\* # 可能不需要加-\ sudo apt-get purge libnvidia-\* # 可能不需要…...
如何使用SSH命令安全连接并转发端口到远程服务器
ssh -p 22546 rootconnect.westc.gpuhub.com d6IS/mQKq/iG ssh -CNgv -L 6006:127.0.0.1:6006 rootconnect.westc.gpuhub.com -p 22546 第一条命令:用于登录远程服务器,进行交互式操作。第二条命令:用于建立 SSH 隧道,进行端口转…...
2025年天梯赛第1场选拔赛
目录 A:徐老师的积木山峰 B:徐老师的最长上升子序列 C:徐老师的机器命令 D:徐老师的地下堡 E:徐老师的新鲜羊腿 F:徐老师的黄金矿工 G:徐老师的成绩统计 H:春节糖果 I:幸运函数 J:好坏钥匙 A:徐老师的积木山峰 徐老师有 n 块积木排成一排,从左往右数编号依次为 1∼…...
06实现相册小项目
一、涉及的知识点: 1、bmp的显示 2、双向循环链表实现图片的轮播 3、触摸屏的滑动算法实现图片的切换 4、目录操作用以检索bmp图片文件 5、项目的优化方向 (1)可以实现不同图片大小的显示 (2)图片轮播的时候可以…...
Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)
Dify部署参考:Dify Rag部署并集成在线Deepseek教程(Windows、部署Rag、安装Ragan安装、安装Dify安装、安装ollama安装) DifyDeepSeek - Excel数据一键可视化(创建步骤案例)-DSL工程文件(可直接导入&#x…...
