数据结构与算法引入(Python)

news2024/11/26 4:47:01

华子目录

  • 引入
    • 第一次尝试
    • 第二次尝试
  • 算法的概念
    • 算法的五大特性
  • 算法效率衡量
    • 执行时间
      • 单靠时间值绝对可信吗?
    • 时间复杂度与 "大O记法"
      • 如何理解 “大O记法”
    • 最坏时间复杂度
    • 时间复杂度的几条基本计算规则
  • 算法分析
  • 常见的时间复杂度
  • 常见时间复杂度之间的关系
  • 数据结构与算法的关系
  • 常见的数据运算
  • `leetcode`简单题-`两数之和`
  • `leetcode`简单题-`回文数`

引入

我们先来看一道题:

  • 如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?

第一次尝试

  • 使用三重循环
import time

start_time = time.time()  #记录开始的时间戳(单位:秒)

for a in range(0, 1001):
    for b in range(0, 1001):
        for c in range(0, 1001):
            if a + b + c == 1000 and a * a + b * b == c * c:
                print(f"组合:{a} {b} {c}")

end_time = time.time()  #记录结束的时间戳(单位:秒)
print(f"运行总时间:{end_time-start_time}")
  • 运行结果

在这里插入图片描述

第二次尝试

  • 使用二重循环
import time

start_time = time.time()

for a in range(0,1001):
    for b in range(0,1001):
        c = 1000-a-b
        if a*a + b*b==c*c:
            print(f"组合:{a} {b} {c}")

end_time = time.time()
print(f"运行时间:{end_time-start_time}")
  • 运行结果

在这里插入图片描述

  • 我们可以很清楚的看到:第二次的执行效率更好

算法的概念

  • 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备数据的存储地址读取数据,把结果写入输出设备某个存储地址供以后再调用。
  • 对于算法而言,实现的语言并不重要,重要的是思想。

算法的五大特性

  • 输入:算法具有0个或多个输入
  • 输出: 算法至少有1个或多个输出
  • 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
  • 确定性:算法中的每一步都有确定的含义,不会出现二义性
  • 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成

算法效率衡量

执行时间

  • 对于同一问题,我们给出了两种解决算法,在两种算法的实现中,我们对程序执行的时间进行了测算,发现两段程序执行的时间相差悬殊(52秒相比于0.12秒),由此我们可以得出结论:实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。

单靠时间值绝对可信吗?

  • 假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何?很可能运行的时间并不会比在我们的电脑中运行算法一的52秒快多少。
  • 单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的!
  • 程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢?

时间复杂度与 “大O记法”

  • 对于算法的时间效率,我们可以用“大O记法”来表示。
  • “大O记法”:对于单调的整数函数f,如果存在一个整数函数g实常数c>0,使得对于充分大的n总有f(n)<=c*g(n),就说函数g是f的一个渐近函数忽略常数),记为f(n)=O(g(n))。也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。
  • 时间复杂度:假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))算法A渐近时间复杂度,简称时间复杂度记为T(n)

如何理解 “大O记法”

  • 对于算法进行特别具体的细致分析虽然很好,但在实践中的实际价值有限。对于算法的时间性质和空间性质,最重要的是其数量级和趋势,这些是分析算法效率的主要部分。而计量算法基本操作数量的规模函数中那些常量因子可以忽略不计。例如,可以认为3n2100n2 属于同一个量级,如果两个算法处理同样规模实例的代价分别为这两个函数,就认为它们的效率“差不多”,都为 n2 级。

最坏时间复杂度

  • 分析算法时,存在几种可能的考虑:
    • 算法完成工作最少需要多少基本操作,即最优时间复杂度
    • 算法完成工作最多需要多少基本操作,即最坏时间复杂度
    • 算法完成工作平均需要多少基本操作,即平均时间复杂度
  • 对于最坏时间复杂度,提供了一种保证,表明算法在此种程度的基本操作中一定能完成工作。
  • 我们主要关注算法的最坏情况,亦即最坏时间复杂度。

时间复杂度的几条基本计算规则

  • 基本操作,即只有常数项,认为其时间复杂度为O(1)
  • 顺序结构,时间复杂度按加法进行计算
  • 循环结构,时间复杂度按乘法进行计算
  • 分支结构,时间复杂度取最大值
  • 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项常数项可以忽略
  • 没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度

算法分析

  • 第一次尝试的算法核心部分
for a in range(0, 1001):
    for b in range(0, 1001):
        for c in range(0, 1001):
            if a + b + c == 1000 and a * a + b * b == c * c:
                print(f"组合:{a} {b} {c}")
  • 时间复杂度T(n) = O(n*n*n) = O(n3)

  • 第二次尝试的算法核心部分

for a in range(0,1001):
    for b in range(0,1001):
        c = 1000-a-b
        if a*a + b*b==c*c:
            print(f"组合:{a} {b} {c}")
  • 时间复杂度T(n) = O(n*n*(1+1)) = O(n*n) = O(n2)
  • 由此可见,我们尝试的第二种算法要比第一种算法的时间复杂度好多的。

常见的时间复杂度

在这里插入图片描述

常见时间复杂度之间的关系

在这里插入图片描述

  • 所消耗时间从小到大

在这里插入图片描述
在这里插入图片描述

数据结构与算法的关系

  • 程序 = 数据结构 + 算法
  • 总结算法是为了解决实际问题而设计的,数据结构算法需要处理的问题载体

常见的数据运算

  • 插入
  • 删除
  • 修改
  • 查找
  • 排序

leetcode简单题-两数之和

在这里插入图片描述

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap={}    #使用字典记录已经遍历过的值(值为键,下标为字典的值)
        for i,v1 in enumerate(nums):    #enumerate会返回下标和值
            v2 = target-v1              
            if  v2 in hashmap:     #如果目标值减去当前元素的差值在字典中存在
                return [hashmap[v2],i]
            hashmap[v1] = i    #将当前元素存入字典中,key为元素值,value为索引
        return []

leetcode简单题-回文数

在这里插入图片描述

class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x) == str(x)[::-1]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两种单例模式(保证线程安全)

开始前&#xff0c;球球各位读者给个三连吧&#xff0c;有错误感谢指出&#xff0c;谢谢 单例模式也叫单个实例&#xff0c;也就是这个类只有且只能有一个实例对象&#xff0c;这样一个类就叫做“单例”&#xff1b;单例模式有很多种&#xff0c;这里只介绍“饿汉模式”和“懒…

vscode+picgo+gitee实现Markdown图床

vscode中编辑Markdown文件&#xff0c;复制的图片默认是保存在本地的。当文档上传csdn时&#xff0c;会提示图片无法识别 可以在gitee上创建图床仓库&#xff0c;使用picgo工具上传图片&#xff0c;在Markdown中插入gitee链接的方式来解决该问题。 一、 安装picgo工具 1.1 v…

1-Wire的使用

代码&#xff1a; ds18b20.c /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;1-Wire 单总线的使用文件&#xff1a;ds1820.c说明&#xff1a;DS18B20驱动文件。为了简单&#xff0c;没有读取芯片地址&#xff0c;也没有计算校验作者&#xff1a;邵子扬时间&…

Golang | Leetcode Golang题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; func twoSum(numbers []int, target int) []int {low, high : 0, len(numbers) - 1for low < high {sum : numbers[low] numbers[high]if sum target {return []int{low 1, high 1}} else if sum < target {low} else {high--}}r…

http1.x和http2.0的一些区别

1、http2.0采用多路复用技术&#xff0c;可以同时发送多个请求或回应 2、http2.0可以由服务器主动向客户端推送数据 3、http2.0对头信息进行压缩&#xff0c;并维护一张信息表&#xff0c;生成头信息索引号&#xff0c;发送时只发送索引号

使用普通定时器产生半双工软件串口

代码&#xff1a; /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;使用普通定时器和外中断实现半双工软件串口文件&#xff1a;softuart.c说明&#xff1a;软件串口驱动文件作者&#xff1a;邵子扬时间&#xff1a;2012年12月16日*/ #include "softuart.h&…

YOLOv9基础 | 实时目标检测新SOTA,手把手带你深度解析yolov9论文!

前言:Hello大家好,我是小哥谈。YOLOv9是Chien-Yao Wang等人提出的YOLO系列的最新版本之一(截止到目前,YOLOv10已发布),于2024年2月21日发布。它是 YOLOv7的改进版本,两者均由Chien-Yao Wang及其同事开发。本节课就以YOLOv9论文为基础带大家深入解析YOLOv9算法。🌈 …

web基础学习

1、安装 1.1、创建一个 React 新项目 如果你正在学习 React 或者考虑将其应用到现有的项目中&#xff0c;你可以 利用 script 标签将 React 添加到任何 HTML 页面 来快速开启学习之旅。如果你的项目需要许多组件和许多文件&#xff0c;那就需要考虑以下方式了&#xff01; 1…

WinMerge v2 (开源的文件比较/合并工具)

前言 WinMerge 是一款运行于Windows系统下的免费开源的文件比较/合并工具&#xff0c;使用它可以非常方便地比较多个文档内容甚至是文件夹与文件夹之间的文件差异。适合程序员或者经常需要撰写文稿的朋友使用。 一、下载地址 下载链接&#xff1a;http://dygod/source 点击搜…

【干货】Android中高级开发进阶必备资料(附:PDF+视频+源码笔记)

4、数据传输与序列化 5、Java虚拟机原理 6、高效IO 设计思想解读开源框架 随着互联网企业的不断发展&#xff0c;产品项目中的模块越来越多&#xff0c;用户体验要求也越来越高&#xff0c;想实现小步快跑、快速迭代的目的越来越难&#xff0c;插件化技术应用而生。如果没有…

Python: HexBinDecOct

因为&#xff1a; f0b1001110# 十进制 int()a0*2**01*2**11*2**21*2**30*2**40*2**51*2**6print(a)# 八进制 oct()print(78/8,78%8)# 110 001 001 8 116print(1*2**00*2**10*2**2,1*2**00*2**10*2**2,0*2**01*2**11*2**2)#十六进制 hex()#0 100 1110 16 4Eprint(sixteenFoo(0*…

leetcode 二分查找·系统掌握 第一个错误版本

题意&#xff1a; 题解&#xff1a; 就是经典的~01~泛型查找&#xff0c;而且一定存在这样错误的版本所以查找不会"失败"&#xff0c;返回每次查找结果即可。 int firstBadVersion(int n) {long l1,rn,mid;while(l<r){mid(lr)>>1;if(isBadVersion(mid))r…

wordpress教程自动采集并发布工具

随着互联网的快速发展&#xff0c;越来越多的人开始关注网络赚钱。而对于许多人来说&#xff0c;拥有一个自己的个人网站是一个不错的选择。然而&#xff0c;要让自己的个人网站内容丰富多样&#xff0c;就需要不断地进行更新。那么&#xff0c;有没有一种方法可以让我们轻松地…

【大数据 复习】第7章 MapReduce(重中之重)

一、概念 1.MapReduce 设计就是“计算向数据靠拢”&#xff0c;而不是“数据向计算靠拢”&#xff0c;因为移动&#xff0c;数据需要大量的网络传输开销。 2.Hadoop MapReduce是分布式并行编程模型MapReduce的开源实现。 3.特点 &#xff08;1&#xff09;非共享式&#xff0c;…

Java学习 - 网络IP协议簇 讲解

IP协议 IP协议全称 Internet Protocol互联网互连协议 IP协议作用 实现数据在网络节点上互相传输 IP协议特点 不面向连接不保证可靠 IP协议数据报结构 组成说明版本目前有IPv4和IPv6两种版本首部长度单位4字节&#xff0c;所以首部长度最大为 15 * 4 60字节区分服务不同…

深度学习windows环境配置

1 下载CUDA和cudnn 详见文章 CUDA与CUDNN在Windows下的安装与配置&#xff08;超级详细版&#xff09;_windows cudnn安装-CSDN博客 我电脑的CUDA下载链接如下 ​​​​​https://developer.nvidia.com/cuda-12-1-0-download-archive?target_osWindows&target_archx86…

第10章 启动过程组 (制定项目章程)

第10章 启动过程组 9.1制定项目章程&#xff0c;在第三版教材第356~360页&#xff1b; 文字图片音频方式 视频12 第一个知识点&#xff1a;主要输出 1、项目章程&#xff08;重要知识点&#xff09; 项目目的 为了稳定与发展公司的客户群(抽象&#xff0c;非具体) 可测量的项目…

Pytho字符串的定义与操作

一、字符串的定义 Python 字符串是字符的序列&#xff0c;用于存储文本数据。字符串可以包括字母、数字、符号和空格。在 Python 中&#xff0c;字符串是不可变的&#xff0c;这意味着一旦创建了一个字符串&#xff0c;就不能更改其中的字符。但是&#xff0c;你可以创建新的字…

头歌资源库(15)活动安排问题

一、 问题描述 二、算法思想 这是一个经典的贪心算法问题&#xff0c;可以使用贪心算法进行求解。 首先&#xff0c;将所有活动按照结束时间从小到大进行排序。假设已经排好序的活动列表为S。 然后&#xff0c;选择第一个活动&#xff0c;将其加入到安排列表中。 接下来&…

mysql中返回日期格式带有T、Java解决返回日期格式带 ‘T‘ 问题、MySQL查询日期为什么带T、java.util.Date()类型为什么有T

文章目录 一、场景描述&#xff1a;Mysql返回日期格式带有T二、解决方法2.1、方法一&#xff1a;通过注解格式化2.2、方法二&#xff1a;通过全局配置2.3、方法三&#xff1a;查询时手动转换时间格式 三、mysql 数据库时间类型数据为什么有T3.1、什么是ISO 8601格式 四、java中…