趣学python编程 (四、数据结构和算法介绍)

数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式,而算法是解决问题的方法和步骤。你要挑战的蓝桥杯,实际也是在设计算法解决问题。其实各种编程语言都只是工具,而程序的核心=数据结构+算法。犹如练武,数据结构和算法是内功,各种编程语言都只是刀枪棍棒,根据需要在不同的场合选用顺手的兵器。

前言

翻遍了各种python书籍,要么是纯粹的知识点灌输,要么是面向小孩儿的图片和游戏任务太多,知识点太琐碎,不能让编程系统起来。(不是说那种方式不好,只是效果有限,可能得学好多年才有所悟)。这也是本系列教程到这里也没开始一行代码的原因。先有知识背景的介绍,后面的学习才能更有效。

鼓励我们的学生善于发问的习惯。学贵有疑,明代教育家朱熹有言:“学贵知疑,小疑则小进,大疑则大进。”,在学习过程中,有疑问、有困惑是正常的,甚至是必要的。不能有觉得自卑或害怕批评的顾虑。因为只有对某个知识点有疑问时,才会去深入研究,去寻找答案,这样才能真正理解和掌握。“读书无疑者须教有疑,有疑者却要无疑,这里方是长进。” ,语出《朱子语类·学五·读书法下》。

学python你不能只学python,你需要首先让了解下全貌,脑补下背景和基础,否则很容易“不识庐山真面目,只缘身在此山中”。(至少得补点计算机的历史和基础,毕竟初学者不像计算机专业的大学生,他们有操作系统,数据结构算法和编程语言等方面的基础课程,可以上来就讲python)。

就像写作文一样,如果才能写好作文?

你要写风,你就不能只写风。要写湖面的波纹,要写云朵向哪走,飞沙往哪飘,要写屋檐边悬挂的铃铛响,要写轻舟与竹筏的轻漾,要写人们不听话的衣角和发梢,写抓不住的气球。

你要写雪,就不能只写雪。要写凛冽,写皎洁,写天下万物的苍茫与凄切。要写北风卷地吹醒夜、寒冬腊月。写原驰蜡象,写山舞银蛇。写桥下冰初结,写陌上人行绝。写一支梅的孤傲与决绝,写千山鸟飞绝,万径人踪灭,直到最后,推敲思量,把你写进词里,白首不分离,相望鬓边初雪。

你要写月,就不能只写月。要写阴晴,写圆缺。写盈满清辉掩盖的疮痕和孤孑。要写林深鹿动,疏影横斜。也要写夜雪呼啸的刚劲哀绝。写一首松风解带、山涧琴声;再写一阙掬水弄香、古刹掩门。至此再搁笔,不提一字,满目皆是。

你要写雨,就不能只写雨。要写芭蕉,写落絮。写世人看不透的别离与相遇。写巴山之夜,写梅子黄时。写一叠纸的相思与残句。写黄昏窗外点滴声,似与梧桐耳语。再写僧庐阶前鬓已星,悲观总无情。直到最后,才陡然折笔,把你写进词的下半阙。已然只剩唏嘘。

你要写云,就不能只写云。要写自然、写随风。写天下人间的漂浮与乘空。要写衣裳花想容,拂槛露华浓。写落日熔金,人在何处。写一番情深不寿的苦留与无凭。写此后锦书休寄,悲痛使人愁。写行也思君,暮也思君。再写众鸟高飞尽,雪落芦烟直。直至终了,朝思西计提笔道是楚山秦山皆白云,白云处处长随君。

你要写夏,就不能只写夏天。要写炽热,要写蝉鸣。写世人看不透的憧憬和遇见。要写橙色黄昏晚风拂,夏夜猖狂。写蝉鸣正响,写晚风不凉。写满架蔷薇的浪漫和肆意。写河畔清风迎面吹,皎洁月色常伴。再写绿树浓荫十里荷花,悠悠夏日长。

你要写秋,就不能只写秋。要写思念和离愁,这人间诉不尽的相思和烦忧。要写寂寞无言独自上西楼,弯月如钩。写有暗香盈袖,写人比黄花瘦。写一轮月的期许与诉求。写濛濛细雨打芭蕉,写一片痴情付水东流。再写姑苏城外清寒古寺,钟声幽幽。

你要学python,就不能只学python,需了解点儿计算机的历史,计算机基础知识。需要有一定的计算机基础,包括数据结构、操作系统、计算机网络、数据库等。只有这样才能更好地掌握Python语言,并将其应用起来,这样学起来才更有效率。

数据结构和算法介绍

在编程中,数据结构和算法是非常重要的。“程序=数据结构+算法”,足见数据结构和算法的重要性。数据结构是程序的基础,它定义了数据的存储方式和操作方式。而算法是程序的逻辑和灵魂,它定义了程序如何处理数据以解决问题。一开始就要有数据结构和算法的概念,这在以后的编程中非常重要。

尽管关于数据结构和算法的知识单独一个拿出来讲,都够写一本书了,但是还是有必要提及一些。俗话说“师父领进门,修行在个人”,数据结构和算法其实一直贯穿在整个编程的过程中,有时你只是使用,不关注而已。

数据结构

数据结构是一种组织数据的方式,以便可以有效地进行访问、搜索和修改。不同的数据结构有不同的性能特点,例如,数组可以随机访问元素,链表可以高效地插入和删除元素,而二叉搜索树可以在log(n)时间内完成搜索。选择正确的数据结构可以极大地影响程序的效率和可读性。

后面要讲到的Python中的数组、字符串、列表、元组和字典其实都属于数据结构,它们可以用来存储和组织数据,并且每种类型都有自己独特的特点和用途。列表和元组属于线性数据结构,而字典则属于非线性数据结构。

线性数据结构是指数据元素之间存在一种线性关系的数据结构,即任意两个数据元素之间存在一对一的关系。

常见的线性数据结构有:线性表、栈、队列、双端队列、串(字符串)和链表。  

非线性数据结构是指数据元素之间不存在线性关系的数据结构,即任意两个数据元素之间可能存在多对一或一对多的关系。常见的非线性数据结构有:树、二叉树、堆、图。

线性数据结构的特点是元素之间存在一种线性关系,可以按照一定的次序访问或操作数据元素,但是插入和删除操作较为困难,效率较低。

非线性数据结构的特点是元素之间不存在明显的线性关系,可以表示一些复杂的层次结构和关系,但是访问和操作数据元素的顺序依赖于具体的操作路径,不够直观。在某些场景下,非线性数据结构的插入和删除操作更加高效。

- 数组(Array):用于存储和访问相同类型的数据元素的集合。

- 字符串(String):用于存储和操作文本数据的一种数据类型。

- 列表(List):用于存储和访问任意类型的数据元素的有序集合。

- 元组(Tuple):用于存储和访问任意类型的数据元素的有序集合,但元组是不可变的。

- 字典(Dictionary):用于存储和访问键值对数据的一种数据类型。

当然可以自定义数据结构啦!Python中可以通过类定义来创建自定义的数据结构。什么是类?什么是对象?这个对初学者可能一下子不容易理解,不过没关系,慢慢的用的多了自然会理解。这里先简单介绍下,有个初步的印象即可,后面用到了再讲解。

什么是类?

类是一种数据结构的抽象,对现实世界的抽象,它是一个模子,用于创建对象,它定义了对象的属性和方法。

什么是对象?

对象是类的实例,具有类定义的属性和方法。类是对象的蓝图,描述了对象的特征和行为。对象是类的具体实例,具有类的特征和行为的具体实现。

类和对象是面向对象编程的重要概念。通过类和对象,可以更好地组织和管理代码,提高代码的可复用性和可维护性。

类的属性是类的成员变量,用于存储类的相关信息,可以在类的任何方法中使用。而类的方法是类的成员函数,用于定义类的行为,可以访问和修改类的属性。类的属性和方法是类的构成要素,用于描述类的特征和行为。

通过汽车举例,讲一下什么是类,什么是对象:

当我们谈论汽车时,汽车就是一个类,它描述了一类具有相同特征和行为的对象(一种交通工具,有轮子、会跑、会鸣笛),但你不知道是哪种汽车,只知道大概它有哪些特征。但是光知道汽车,你肯定不能直接开啊,得具体到某一汽车实体才行。具体的某一辆汽车,比如我的汽车,就是汽车类的一个对象,它具有该类所定义的特征(变量如车速,剩余油量)和行为(函数如启动,停止,转弯)的具体实例。类是抽象的,对象是具体的。类是对象的模板,而对象是类的实例。

当我们谈论动物时,动物就是一个类,它描述了一类具有相同特征和行为的对象。而具体的某一只动物,比如我的宠物狗,就是该类的一个对象,它具有该类所定义的特征和行为的具体实例。类是抽象的,对象是具体的。类是对象的模板,而对象是类的实例。

在编程中,类和对象存在的意义是什么?

类和对象是面向对象编程的重要概念,当然你也可以不用它,直接面向过程编程即可。前面的一些简单编程任务,基本不涉及这一块儿,但是往后深入编程,类和对象是一定会用到的。

但是用他们是有好处的,它们对现实世界很好的模拟,提供了一种组织和管理代码的方法。类和对象的存在具有以下几个意义:

 1. 模块化:类和对象可以将程序划分为模块,每个模块都有自己的类和对象,从而降低程序的复杂性,提高代码的可维护性和可复用性。  

2. 抽象:类和对象可以将具体问题抽象为抽象的数据类型,隐藏内部实现细节,只暴露出必要的接口,从而降低程序的复杂性,提高代码的可读性和可理解性。  

3. 封装:类和对象可以将数据和函数封装在一起,形成一个独立的单位,保护数据不被外部随意访问和修改,从而提高程序的安全性和稳定性。  

4. 继承:类和对象可以通过继承建立类之间的关系,从而实现代码的共享和重用,减少代码的冗余,提高代码的可扩展性和可维护性。

总之,类和对象是面向对象编程的重要概念,它们可以提高代码的可维护性、可复用性、可扩展性、可读性、可理解性、安全性和稳定性,降低程序的复杂性,提高编程效率。

算法

算法也是编程中不可或缺的一部分,只是有时你可能没意识到它的存在。算法是一系列解决问题或完成特定任务的明确指令。你做的各种编程任务,其实都可以算做是在设计算法解决问题。

算法是一系列解决问题的清晰指令,旨在将输入映射为输出。通常算法用于执行计算、数据处理和自动推理等任务。算法可以用各种方式表示,包括自然语言、流程图、伪代码和计算机编程语言。算法的选择取决于问题的性质、所需的计算资源以及目标输出的形式。一些常见的算法示例包括排序算法(如冒泡排序和快速排序)、搜索算法(如线性搜索和二分搜索)以及加密算法(如对称密钥算法和公钥算法)。算法可以脱离代码单独存在,可以用各种方式表示,包括自然语言、流程图、伪代码和计算机编程语言。算法可以不依赖于任何具体的编程语言来存在。

比如给你出道题,从1加到100,你会怎么做?你的实现也可以称之为一个简单的算法。

常见的算法有哪些?

常见的算法包括排序算法(如冒泡排序、插入排序、快速排序)、搜索算法(如线性搜索、二分搜索)、加密算法(如对称密钥算法、公钥算法)、最短路径算法(如Dijkstra算法)、图算法(如深度优先搜索算法、广度优先搜索算法)等。

讲一个故事,斯坦福大学是怎么给学生讲二分查找算法的,上来就表演“撕书”。国外的老讲授讲课就是生动形象,拿查找一本书里的某个字来举例,问如何才能快速的找到想要的字?先把书翻开一半,结果没找到直接撕掉一半,然后再在另一半书中再翻开一半去找,直到找到为止。你猜在几千页厚厚的书中找到某个字仅需要几步?可能十几步就找到了,速度够快吧。采用的这种一次劈开一半,再从一半书中找到某个字的方法,就可以称之为算法。

总结

数据结构和算法是计算机科学的基础。理解数据结构和算法可以帮助程序员更好地理解程序的行为和性能,从而编写更高效、更可维护的代码。此外,数据结构和算法也是计算机科学中的核心概念,对于编写复杂的软件和解决现实世界的问题非常重要。

其他资源

引用链接

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

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

相关文章

深度学习乳腺癌分类 计算机竞赛

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

【iOS】——知乎日报第五周总结

文章目录 一、评论区展开与收缩二、FMDB库实现本地持久化FMDB常用类:FMDB的简单使用: 三、点赞和收藏的持久化 一、评论区展开与收缩 有的评论没有被回复评论或者被回复评论过短,这时就不需要展开全文的按钮,所以首先计算被回复评…

Positive Technologies 利用 PT Cloud Application Firewall 保护中小型企业的网络资源

云产品按月订购,无需购买硬件资源 PT Cloud Application Firewall 是 Positive Technologies 推出的首个用于保护网络应用程序的商用云产品。Web 应用层防火墙 (web application firewall, WAF) 现在可以通过 技术合作伙伴——授权服务商和云提供商以订购方式提供1…

Modbus转Profinet网关在污水处理系统中连接PLC和变频器Modbus通信案例

污水处理系统中使用Modbus转Profinet网关可以连接PLC和变频器,实现二者之间的通信。该网关的作用是将PLC与变频器之间的Modbus协议转换为Profinet协议,使两者可以相互沟通。在污水处理系统中,PLC控制污水处理的各个过程,而变频器则…

测试用例的设计方法(全):正交实验设计方法|功能图分析方法|场景设计方发

正交实验设计方法 一.方法简介 利用因果图来设计测试用例时, 作为输入条件的原因与输出结果之间的因果关系,有时很难从软件需求规格说明中得到。往往因果关系非常庞大,以至于据此因果图而得到的测试用例数目多的惊人,给软件测试带来沉重的负担,为了有效…

vue过渡,vue3组合式API详细介绍

7.过渡效果 vue提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动画 Transition会在一个元素或组件进入和离开DOM时应用动画TransitionGroup会在一个v-for列表中的元素或组件被插入,移动,或移除时应用动画 7-1过渡效果 过渡模式 <Transition mode"out-in&q…

Linux文件目录以及文件类型

文章目录 Home根目录 //bin/sbin/etc/root/lib/dev/proc/sys/tmp/boot/mnt/media/usr 文件类型 Home 当尝试使用gedit等编辑器保存文件时&#xff0c;系统默认通常会先打开个人用户的“家”&#xff08;home&#xff09;目录&#xff0c; 建议在通常情况下个人相关的内容也是保…

使用 VPN ,一定要知道的几个真相!

你们好&#xff0c;我的网工朋友。 今天想和你聊聊VPN。在VPN出现之前&#xff0c;企业分支之间的数据传输只能依靠现有物理网络&#xff08;例如Internet&#xff09;。 但由于Internet中存在多种不安全因素&#xff0c;报文容易被网络中的黑客窃取或篡改&#xff0c;最终造…

requests爬虫IP连接初始化问题及解决方案

问题背景 在使用HTTPS爬虫IP连接时&#xff0c;如果第一次请求是chunked方式&#xff0c;那么HTTPS爬虫IP连接将不会被初始化。这个问题可能会导致403错误&#xff0c;或者在使用HTTPS爬虫IP时出现SSL错误。 解决方案 为了解决这个问题&#xff0c;我们可以在requests库的ada…

多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 …

03-关系和非关系型数据库对比

关系和非关系型数据库对比 关系型数据库(RDBMS)&#xff1a;MySQL、Oracl、DB2、SQLServer 非关系型数据库(NoSql)&#xff1a;Redis、Mongo DB、MemCached 插入数据结构的区别 传统关系型数据库是结构化数据,向表中插入数据时都需要严格的约束信息(如字段名,字段数据类型,字…

Java概述

接触Java后会发现它的体系有一个特点&#xff0c;就是非常喜欢用“J”字母开头的缩写&#xff0c;比如JCP, JSR, JMS, JPA, JSP, JAX-RS......它们有些是规范&#xff0c;有些是组织的名称&#xff0c;表意多样&#xff0c;对第一次接触的人来说很可能会觉得混乱&#xff0c;本…

基于水基湍流算法优化概率神经网络PNN的分类预测 - 附代码

基于水基湍流算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于水基湍流算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于水基湍流优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

Nginx-负载均衡-动静分离-虚拟主机

负载均衡 负载均衡基本使用 1 配置上游服务器 upstream myserver { #是server外层server ip1:8080;server ip1:8080; }2 配置代理 server {location / { proxy_pass http://myserver;#请求转向myserver 定义的服务器列表 注意这个http不能丢 pro…

Git 分支设计规范

开篇 这篇文章分享 Git 分支设计规范&#xff0c;目的是提供给研发人员做参考。 规范是死的&#xff0c;人是活的&#xff0c;希望自己定的规范&#xff0c;不要被打脸。 在说 Git 分支规范之前&#xff0c;先说下在系统开发过程中常用的环境。 DEV 环境&#xff1a;用于开发…

数电实验-----实现74LS153芯片扩展为8选1数据选择器以及应用(Quartus II )

目录 一、74LS153芯片介绍 管脚图 功能表 二、4选1选择器扩展为8选1选择器 1.扩展原理 2.电路图连接&#xff08;Quartus II &#xff09; 3.仿真结果 三、8选1选择器的应用 1.三变量表决器 2.奇偶校验电路 一、74LS153芯片介绍 74ls153芯片是属于四选一选择器的芯片。…

系列五、GC垃圾回收【四大垃圾算法-复制算法】

一、堆的内存组成 二、复制算法 2.1、发生位置 复制算法主要发生在新生代&#xff0c;发生在新生代的垃圾回收也被叫做Minor GC。 2.2、 Minor GC的过程 复制>清空》交换 1、eden、from区中的对象复制到to区&#xff0c;年龄1 首先&#xff0c;当eden区满的时候会触发第一…

【数据结构初阶】双链表

双链表 1.双链表的实现1.1结口实现1.2申请结点1.3初始化双链表1.4打印双链表1.5尾插1.6尾删1.7头插1.8头删1.9计算大小1.10查找1.11pos位置插入1.12删除pos位置1.12删除双链表 全部码源 1.双链表的实现 1.1结口实现 #include<stdio.h> #include<stdlib.h> #inclu…

STM32F4系列单片机GPIO概述和寄存器分析

第2章 STM32-GPIO口 2.1 GPIO口概述 通用输入/输出口 2.1.1 GPIO口作用 GPIO是单片机与外界进行数据交流的窗口。 2.1.2 STM32的GPIO口 在51单片机中&#xff0c;IO口&#xff0c;以数字进行分组&#xff08;P0~P3&#xff09;&#xff0c;每一组里面又有8个IO口。 在ST…

AcWing 717. 简单斐波那契

原题链接 题目 以下数列 0 1 1 2 3 5 8 13 21 … 被称为斐波纳契数列。 这个数列从第 3 项开始&#xff0c;每一项都等于前两项之和。 输入一个整数 N &#xff0c;请你输出这个序列的前 N 项。 输入格式 一个整数 N 。 输出格式 在一行中输出斐波那契数列的前 N 项&…