趣学python编程 (四、数据结构和算法介绍)
数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式,而算法是解决问题的方法和步骤。你要挑战的蓝桥杯,实际也是在设计算法解决问题。其实各种编程语言都只是工具,而程序的核心=数据结构+算法。犹如练武,数据结构和算法是内功,各种编程语言都只是刀枪棍棒,根据需要在不同的场合选用顺手的兵器。
前言
翻遍了各种python书籍,要么是纯粹的知识点灌输,要么是面向小孩儿的图片和游戏任务太多,知识点太琐碎,不能让编程系统起来。(不是说那种方式不好,只是效果有限,可能得学好多年才有所悟)。这也是本系列教程到这里也没开始一行代码的原因。先有知识背景的介绍,后面的学习才能更有效。
鼓励我们的学生善于发问的习惯。学贵有疑,明代教育家朱熹有言:“学贵知疑,小疑则小进,大疑则大进。”,在学习过程中,有疑问、有困惑是正常的,甚至是必要的。不能有觉得自卑或害怕批评的顾虑。因为只有对某个知识点有疑问时,才会去深入研究,去寻找答案,这样才能真正理解和掌握。“读书无疑者须教有疑,有疑者却要无疑,这里方是长进。” ,语出《朱子语类·学五·读书法下》。
学python你不能只学python,你需要首先让了解下全貌,脑补下背景和基础,否则很容易“不识庐山真面目,只缘身在此山中”。(至少得补点计算机的历史和基础,毕竟初学者不像计算机专业的大学生,他们有操作系统,数据结构算法和编程语言等方面的基础课程,可以上来就讲python)。
就像写作文一样,如果才能写好作文?
你要写风,你就不能只写风。要写湖面的波纹,要写云朵向哪走,飞沙往哪飘,要写屋檐边悬挂的铃铛响,要写轻舟与竹筏的轻漾,要写人们不听话的衣角和发梢,写抓不住的气球。
你要写雪,就不能只写雪。要写凛冽,写皎洁,写天下万物的苍茫与凄切。要写北风卷地吹醒夜、寒冬腊月。写原驰蜡象,写山舞银蛇。写桥下冰初结,写陌上人行绝。写一支梅的孤傲与决绝,写千山鸟飞绝,万径人踪灭,直到最后,推敲思量,把你写进词里,白首不分离,相望鬓边初雪。
你要写月,就不能只写月。要写阴晴,写圆缺。写盈满清辉掩盖的疮痕和孤孑。要写林深鹿动,疏影横斜。也要写夜雪呼啸的刚劲哀绝。写一首松风解带、山涧琴声;再写一阙掬水弄香、古刹掩门。至此再搁笔,不提一字,满目皆是。
你要写雨,就不能只写雨。要写芭蕉,写落絮。写世人看不透的别离与相遇。写巴山之夜,写梅子黄时。写一叠纸的相思与残句。写黄昏窗外点滴声,似与梧桐耳语。再写僧庐阶前鬓已星,悲观总无情。直到最后,才陡然折笔,把你写进词的下半阙。已然只剩唏嘘。
你要写云,就不能只写云。要写自然、写随风。写天下人间的漂浮与乘空。要写衣裳花想容,拂槛露华浓。写落日熔金,人在何处。写一番情深不寿的苦留与无凭。写此后锦书休寄,悲痛使人愁。写行也思君,暮也思君。再写众鸟高飞尽,雪落芦烟直。直至终了,朝思西计提笔道是楚山秦山皆白云,白云处处长随君。
你要写夏,就不能只写夏天。要写炽热,要写蝉鸣。写世人看不透的憧憬和遇见。要写橙色黄昏晚风拂,夏夜猖狂。写蝉鸣正响,写晚风不凉。写满架蔷薇的浪漫和肆意。写河畔清风迎面吹,皎洁月色常伴。再写绿树浓荫十里荷花,悠悠夏日长。
你要写秋,就不能只写秋。要写思念和离愁,这人间诉不尽的相思和烦忧。要写寂寞无言独自上西楼,弯月如钩。写有暗香盈袖,写人比黄花瘦。写一轮月的期许与诉求。写濛濛细雨打芭蕉,写一片痴情付水东流。再写姑苏城外清寒古寺,钟声幽幽。
你要学python,就不能只学python,需了解点儿计算机的历史,计算机基础知识。需要有一定的计算机基础,包括数据结构、操作系统、计算机网络、数据库等。只有这样才能更好地掌握Python语言,并将其应用起来,这样学起来才更有效率。
数据结构和算法介绍
在编程中,数据结构和算法是非常重要的。“程序=数据结构+算法”,足见数据结构和算法的重要性。数据结构是程序的基础,它定义了数据的存储方式和操作方式。而算法是程序的逻辑和灵魂,它定义了程序如何处理数据以解决问题。一开始就要有数据结构和算法的概念,这在以后的编程中非常重要。
尽管关于数据结构和算法的知识单独一个拿出来讲,都够写一本书了,但是还是有必要提及一些。俗话说“师父领进门,修行在个人”,数据结构和算法其实一直贯穿在整个编程的过程中,有时你只是使用,不关注而已。
数据结构
数据结构是一种组织数据的方式,以便可以有效地进行访问、搜索和修改。不同的数据结构有不同的性能特点,例如,数组可以随机访问元素,链表可以高效地插入和删除元素,而二叉搜索树可以在log(n)时间内完成搜索。选择正确的数据结构可以极大地影响程序的效率和可读性。
后面要讲到的Python中的数组、字符串、列表、元组和字典其实都属于数据结构,它们可以用来存储和组织数据,并且每种类型都有自己独特的特点和用途。列表和元组属于线性数据结构,而字典则属于非线性数据结构。
线性数据结构是指数据元素之间存在一种线性关系的数据结构,即任意两个数据元素之间存在一对一的关系。
常见的线性数据结构有:线性表、栈、队列、双端队列、串(字符串)和链表。
非线性数据结构是指数据元素之间不存在线性关系的数据结构,即任意两个数据元素之间可能存在多对一或一对多的关系。常见的非线性数据结构有:树、二叉树、堆、图。
线性数据结构的特点是元素之间存在一种线性关系,可以按照一定的次序访问或操作数据元素,但是插入和删除操作较为困难,效率较低。
非线性数据结构的特点是元素之间不存在明显的线性关系,可以表示一些复杂的层次结构和关系,但是访问和操作数据元素的顺序依赖于具体的操作路径,不够直观。在某些场景下,非线性数据结构的插入和删除操作更加高效。
- 数组(Array):用于存储和访问相同类型的数据元素的集合。
- 字符串(String):用于存储和操作文本数据的一种数据类型。
- 列表(List):用于存储和访问任意类型的数据元素的有序集合。
- 元组(Tuple):用于存储和访问任意类型的数据元素的有序集合,但元组是不可变的。
- 字典(Dictionary):用于存储和访问键值对数据的一种数据类型。
当然可以自定义数据结构啦!Python中可以通过类定义来创建自定义的数据结构。什么是类?什么是对象?这个对初学者可能一下子不容易理解,不过没关系,慢慢的用的多了自然会理解。这里先简单介绍下,有个初步的印象即可,后面用到了再讲解。
什么是类?
类是一种数据结构的抽象,对现实世界的抽象,它是一个模子,用于创建对象,它定义了对象的属性和方法。
什么是对象?
对象是类的实例,具有类定义的属性和方法。类是对象的蓝图,描述了对象的特征和行为。对象是类的具体实例,具有类的特征和行为的具体实现。
类和对象是面向对象编程的重要概念。通过类和对象,可以更好地组织和管理代码,提高代码的可复用性和可维护性。
类的属性是类的成员变量,用于存储类的相关信息,可以在类的任何方法中使用。而类的方法是类的成员函数,用于定义类的行为,可以访问和修改类的属性。类的属性和方法是类的构成要素,用于描述类的特征和行为。
通过汽车举例,讲一下什么是类,什么是对象:
当我们谈论汽车时,汽车就是一个类,它描述了一类具有相同特征和行为的对象(一种交通工具,有轮子、会跑、会鸣笛),但你不知道是哪种汽车,只知道大概它有哪些特征。但是光知道汽车,你肯定不能直接开啊,得具体到某一汽车实体才行。具体的某一辆汽车,比如我的汽车,就是汽车类的一个对象,它具有该类所定义的特征(变量如车速,剩余油量)和行为(函数如启动,停止,转弯)的具体实例。类是抽象的,对象是具体的。类是对象的模板,而对象是类的实例。
当我们谈论动物时,动物就是一个类,它描述了一类具有相同特征和行为的对象。而具体的某一只动物,比如我的宠物狗,就是该类的一个对象,它具有该类所定义的特征和行为的具体实例。类是抽象的,对象是具体的。类是对象的模板,而对象是类的实例。
在编程中,类和对象存在的意义是什么?
类和对象是面向对象编程的重要概念,当然你也可以不用它,直接面向过程编程即可。前面的一些简单编程任务,基本不涉及这一块儿,但是往后深入编程,类和对象是一定会用到的。
但是用他们是有好处的,它们对现实世界很好的模拟,提供了一种组织和管理代码的方法。类和对象的存在具有以下几个意义:
1. 模块化:类和对象可以将程序划分为模块,每个模块都有自己的类和对象,从而降低程序的复杂性,提高代码的可维护性和可复用性。
2. 抽象:类和对象可以将具体问题抽象为抽象的数据类型,隐藏内部实现细节,只暴露出必要的接口,从而降低程序的复杂性,提高代码的可读性和可理解性。
3. 封装:类和对象可以将数据和函数封装在一起,形成一个独立的单位,保护数据不被外部随意访问和修改,从而提高程序的安全性和稳定性。
4. 继承:类和对象可以通过继承建立类之间的关系,从而实现代码的共享和重用,减少代码的冗余,提高代码的可扩展性和可维护性。
总之,类和对象是面向对象编程的重要概念,它们可以提高代码的可维护性、可复用性、可扩展性、可读性、可理解性、安全性和稳定性,降低程序的复杂性,提高编程效率。
算法
算法也是编程中不可或缺的一部分,只是有时你可能没意识到它的存在。算法是一系列解决问题或完成特定任务的明确指令。你做的各种编程任务,其实都可以算做是在设计算法解决问题。
算法是一系列解决问题的清晰指令,旨在将输入映射为输出。通常算法用于执行计算、数据处理和自动推理等任务。算法可以用各种方式表示,包括自然语言、流程图、伪代码和计算机编程语言。算法的选择取决于问题的性质、所需的计算资源以及目标输出的形式。一些常见的算法示例包括排序算法(如冒泡排序和快速排序)、搜索算法(如线性搜索和二分搜索)以及加密算法(如对称密钥算法和公钥算法)。算法可以脱离代码单独存在,可以用各种方式表示,包括自然语言、流程图、伪代码和计算机编程语言。算法可以不依赖于任何具体的编程语言来存在。
比如给你出道题,从1加到100,你会怎么做?你的实现也可以称之为一个简单的算法。
常见的算法有哪些?
常见的算法包括排序算法(如冒泡排序、插入排序、快速排序)、搜索算法(如线性搜索、二分搜索)、加密算法(如对称密钥算法、公钥算法)、最短路径算法(如Dijkstra算法)、图算法(如深度优先搜索算法、广度优先搜索算法)等。
讲一个故事,斯坦福大学是怎么给学生讲二分查找算法的,上来就表演“撕书”。国外的老讲授讲课就是生动形象,拿查找一本书里的某个字来举例,问如何才能快速的找到想要的字?先把书翻开一半,结果没找到直接撕掉一半,然后再在另一半书中再翻开一半去找,直到找到为止。你猜在几千页厚厚的书中找到某个字仅需要几步?可能十几步就找到了,速度够快吧。采用的这种一次劈开一半,再从一半书中找到某个字的方法,就可以称之为算法。
总结
数据结构和算法是计算机科学的基础。理解数据结构和算法可以帮助程序员更好地理解程序的行为和性能,从而编写更高效、更可维护的代码。此外,数据结构和算法也是计算机科学中的核心概念,对于编写复杂的软件和解决现实世界的问题非常重要。
其他资源
引用链接
相关文章:

趣学python编程 (四、数据结构和算法介绍)
数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式,而算法是解决问题的方法和步骤。你要挑战的蓝桥杯,实际也是在设计算法解决问题。其实各种编程语言都只是工具,而程序的核心数据结构算法。犹如练武,数据结构和算…...

使用Pandas进行时间重采样,充分挖掘数据价值
大家好,时间序列数据蕴含着很大价值,通过重采样技术可以提升原始数据的表现形式。本文将介绍数据重采样方法和工具,提升数据可视化技巧。 在进行时间数据可视化时,数据重采样是至关重要且非常有用的,它支持控制数据的…...

Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)
文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数 在没有用到choices参数之前,我们在D…...
德语B级SampleAcademy
德语B级 一, 反身代词(1)A 主语和宾语一致(2)D 双宾语,主语与直接宾语不一致(3), 补充单词(4)真反身代词(5)假反身代词(6)真假反身代词(7)相互反身(8)非反身#反身#相互反身 二,Nomen…...
vue3自定义hooks
获取dom的id属性 index.ts import { onMounted } from "vue" type option {el: string }export default function(option:option):Promise<{name: string}> {return new Promise((resolve)>{onMounted(()>{const dom:HTMLElement document.querySele…...

Consistency Models 阅读笔记
简介 Diffusion models需要多步迭代采样才能生成一张图片,这导致生成速度很慢。一致性模型(Consistency models)的提出是为了加速生成过程。 Consistency models可以直接一步采样就生成图片,但是也允许进行多步采样来提高生成的质…...
杭电oj 2034 人见人爱A-B C语言
此处的c和a指向同一块内存空间,改变c就是改变a,反之亦然,此处是为了方便看这么写的,如果不想c和a指向同一空间请分别开辟空间(即不如此写camalloc) #include<stdio.h> #include<stdlib.h>int …...
springboot(ssm大学生成绩管理系统 成绩管理平台Java(codeLW)
springboot(ssm大学生成绩管理系统 成绩管理平台Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&…...

SOME/IP 协议介绍(五)指南
指南(信息性) 选择传输协议 SOME/IP直接支持互联网上使用最广泛的两种传输协议:用户数据报协议(UDP)和传输控制协议(TCP)。UDP是一种非常简洁的传输协议,仅支持最重要的功能&#…...

Python调用企微机器人: 发送常用格式汇总
企微接口文档 发送应用消息 - 接口文档 - 企业微信开发者中心 发送格式 应用支持推送文本、图片、视频、文件、图文等类型。 ~~~以下列举常用格式 示例~~~ 1.发送文本 代码如下: def sendtxt_robotmsg(self):# 正式keywx_key "xx"wx_webhookurl htt…...

论文阅读——DiffusionDet
在目标检测上使用扩散模型 前向过程:真实框-->随机框 后向过程:随机框-->真实框 前向过程: 一般一张图片真实框的数目不同,填补到同一的N个框,填补方法可以是重复真实框,填补和图片大小一样的框&a…...
elmenetui表格二次封装包含查询框和分页
<!--dataList: 表格数据columnList: 表头字段 宽度minWidth使用slotName字段: 需要对列数据进行处理,不写prop字段,使用slotName字段btnText<String>: 按钮字段btnIcon<String>: 按钮的iconbtnEvent: 按钮事件btnType: 按钮类型getHeigh…...

【机器学习Python实战】线性回归
🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习python实战 欢迎订阅!后面的内容会越来越有意思~ ⭐内容说明:本专栏主要针对机器学习专栏的基础内容进行python的实现,部分…...
做外贸这么久,为什么一直做不好?
很多外贸业务员在开发客户过程中,总感觉自己做了很多事情,聊了很多客户,但却总是拿不到单子。 其实,这是由于缺乏对采购商心理的认识程度,没有换位思考,该做的事没做,不该做的事却忙得忘乎所以&…...

IPv4数据报格式
IPv4是IP协议的第四个版本(版本1-3和版本5都未曾使用过)IP地址不能反映任何有关主机位置的地理信息以前还有个逆地址解析协议RAPR(Reverse APR),它的作用是使只知道自己MAC地址的主机能通过RAPR找到其IP地址,而现在的DHCP(Dynamic Host Configuration Pr…...

搭建网关服务器实现DHCP自动分配、HTTP服务和免密登录
目录 一. 实验要求 二. 实验准备 三. 实验过程 1. 网关服务器新建网卡并改为仅主机模式 2. 修改新建网卡IP配置文件并重启服务 3. 搭建网关服务器的dhcp服务 4. 修改server2网卡配置文件重启服务并效验 5. 设置主机1的网络连接为仅主机模式 6. 给server2和网关服务器之…...

【18年扬大真题】给定有m个整数的递增有序数组a和有n个整数的递减有序数组b,将a数组和b数组归并为递增有序的数组c
【18年扬大真题】 给定有m个整数的递增有序数组a和有n个整数的递减有序数组b, 将a数组和b数组归并为递增有序的数组c。 void Merge(int arr[],int m ,int brr[],int n,int crr[]) {int i 0;int j n-1;int k 0;while(i < m&&j > 0) {if (arr[i] &l…...

图片叠加_图片压缩
图片叠加 try {/* 1 读取第一张图片*/File fileOne new File("1.png");BufferedImage imageFirst ImageIO.read(fileOne);/* 2读取第二张图片 */File fileTwo new File("2.png");BufferedImage imageSecond ImageIO.read(fileTwo);//创建一个最底层画…...

Mybatis-Plus《学习笔记 22版尚硅谷 》——感谢【尚硅谷】官方文档
Mybatis-Plus《学习笔记 22版尚硅谷 》 一、MyBatis-Plus1.简介2.特性3.支持数据库4.框架结构5.官方地址 二、入门案例1.开发环境2.建库建表3.创建工程4.配置编码5.测试查询 三、增删改查1.BaseMapper<T>2.调用Mapper层实现CRUD2.1 插入2.2 删除a、根据ID删除数据b、根据…...
git安装后报git: ‘remote-https‘ is not a git command. See ‘git --help‘.
1. 问题说明 使用的是linux系统,采用编译安装的方式进行安装,安装完成clone项目后提示“git: ‘remote-https’ is not a git command. See ‘git --help’.” 2. 问题解决 需要安装1个额外的库:libcurl4-openssl-de sudo apt-get install …...
SpringBoot自动化部署实战技术文章大纲
技术背景与目标 介绍SpringBoot在现代开发中的重要性自动化部署的价值:提升效率、减少人为错误、实现CI/CD适用场景:中小型Web应用、微服务架构 自动化部署核心方案 基于Docker的容器化部署 SpringBoot应用打包为Docker镜像使用Docker Compose编排多容…...
微服务常用日志追踪方案:Sleuth + Zipkin + ELK
在微服务架构中,一个用户请求往往需要经过多个服务的协同处理。为了有效追踪请求的完整调用链路,需要一套完整的日志追踪方案。Sleuth Zipkin ELK 组合提供了完整的解决方案 Sleuth:生成和传播追踪IDZipkin:收集、存储和可视化…...
C++编程——关于比较器的使用
注: 简单记录一下C里比较器的构建,常用于自定义 sort() 函数和优先队列的改写优先级。 简单构建比较器: sort() 函数: vector<int> arr;//(a, b) -> true : a < b //升序排列 bool compare(int a, int b) {retur…...
Python打卡训练营day46——2025.06.06
知识点回顾: 不同CNN层的特征图:不同通道的特征图什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。通道注意力:模型的定义和插入的位置通道注意力后的特征图和热力图 …...

行业赋能篇-2-能源行业安全运维升级
在能源行业,尤其是风电领域,运维作业往往面临“三高”挑战——高风险环境、高异构数据量)、高合规要求。以海上风电场为例,传统运维依赖卫星电话沟通,数据记录碎片化,故障因信息传递延迟导致损失扩大。如何…...

Java网络编程API 1
Java中的网络编程API一共有两套:一套是UDP协议使用的API;另一套是TCP协议使用的API。这篇文章我们先来介绍UDP版本的API,并尝试来写一个回显服务器(接收到的请求是什么,返回的响应就是什么)。 UDP数据报套…...

Dify源码教程:账户和密码传递分析
概述 Dify系统中账户创建过程中的密码处理是Web应用安全的重要环节。本教程详细分析了从前端表单到后端存储的完整流程,展示了Dify如何安全地处理用户凭据。 前端部分 在 dify/web/app/install/installForm.tsx 文件中,当用户填写完表单并点击安装按钮…...
Monorepo架构: Lerna、NX、Turbo等对比与应用分析
概述 对于大型的 Monorepo 项目来说,Nx 绝对算是神器,在包管理和版本控制部分有优势对于大型 Monorepo 项目,Nx 是非常实用的工具,在包管理、版本控制以及构建、测试优化等方面都有一定作用下面我们来对比一下这几种工具 NPM 包…...
大模型微调技术全景图:从全量更新到参数高效适配
在预训练大语言模型(LLM)展现出惊人能力之后,如何让这些“通才”模型蜕变为特定领域的“专家”?微调(Fine-Tuning)正是解锁这一潜力的核心技术。本文将深入解析主流微调技术,助你找到最适合任务…...

NLP学习路线图(十七):主题模型(LDA)
在浩瀚的文本海洋中航行,人类大脑天然具备发现主题的能力——翻阅几份报纸,我们迅速辨别出"政治"、"体育"、"科技"等板块;浏览社交媒体,我们下意识区分出美食分享、旅行见闻或科技测评。但机器如何…...