python算法与数据结构1-算法、数据结构、链表

news2024/12/23 9:52:43

目录

    • 1、算法的概念
      • 1.1 举例:
      • 1.2 算法的五大特性:
      • 1.3 时间复杂度
      • 1.4 空间复杂度
    • 2、数据结构
      • 2.1 内存的存储结构
      • 2.2 数据结构的分类
      • 2.3 顺序表存储方式
    • 3、链表
      • 3.1链表实现
      • 3.2链表的方法
      • 3.3链表增加节点
      • 3.4链表删除节点
      • 3.5链表总结

1、算法的概念

算法与数据结构作用:大大提升程序的性能。(战役中的兵法)

数据结构:存储、组织数据的方式
相同的数据不同的组织方式就是数据结构。([老王,18,男]或者{name:‘老王’,age:18,sex:‘男’})

算法:为了实习业务目的的各种方法和思路
算法独立存在,代码只是实现算法思想的方式而已。(例如穷举法,可以C语言实现也可以python代码实现)

算法概念:

1.1 举例:

若a+b+c =1000,且a^2+b ^2 =c ^2,如何求出所有abc的可能组合

#穷举法
#1,列举所有可能取值,2,判断是否满足条件
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**2+b**2 == c**2 and a+b+c==1000:
				print('a b c:',a,b,c)
			
end_time = time.time()
cost_time = end_time-start_time
print(cost_time)

统计运行的时间:time.time()

1.2 算法的五大特性:

  1. 输入。0个或多个输入
  2. 输出。算法至少有1个或者多个输出
  3. 有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
  4. 确定性:算法中的每一步都有确定的含义,不会出现二义性
  5. 可行性:算法的每一步都是可行的,即每一步都能够执行有限次数完成
#方法二:在知道abc关系了,所以不用再对c遍历
import time
start_time = time.time()
for a in range(0,1001):
	for b in range(0,1001):
		c= 1000-a-b
		if a**2+b**2 == c**2 :
			print('a b c:',a,b,c)
			
end_time = time.time()
cost_time = end_time-start_time
print(cost_time)

实现算法程序的执行时间可以反应出算法的优劣

代码执行总时间 = 操作步骤数量*操作步骤执行时间

1.3 时间复杂度

在这里插入图片描述
在这里插入图片描述
时间复杂度可以表示一个算法随着问题规模不断变化的最主要趋势
衡量到算法的量级即可。大O记法
方法一的时间复杂度:T(n) = O(n^3)
方法二的时间复杂度:T(n) = O(n^2)

在这里插入图片描述

最优时间复杂度:算法完成工作最少需要多少基本操作。价值不大
最坏时间复杂度:算法完成工作最多需要多少基本操作。一种保证
平均时间复杂度:算法完成工作平均需要多少基本操作。一种全面评价
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4 空间复杂度

空间复杂度:一个算法在运行过程中临时占用存储空间大小的度量
算法的时间复杂度和空间复杂度合称为算法的复杂度

2、数据结构

数据结构作用:数据结构是存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

数据结构:静态的描述了数据元素之间的关系
高效的程序需要需要在数据结构的基础上设计和选择算法

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

2.1 内存的存储结构

内存是以字节为基本存储单位的(1024b=1kb),每个基本存储空间都有自己的地址。内存地址是连续的
整型:占4个字节
字符:1个字节

2.2 数据结构的分类

线性结构和非线性结构

线性结构:表中各个结点具有线性关系。(栈,队列等)
在这里插入图片描述
线性结构:表中各个结点具有多个对应关系。(树结构,图结构等)
在这里插入图片描述

2.3 顺序表存储方式

线性结构的实际存储方式,分为:顺序表和链表
顺序表:将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由他们的存储顺序自然表示
链表:通过链接构造起来的一系列存储块中,存储区是非连续的。

在这里插入图片描述
顺序表存储数据的两种情况:一体式结构、分离式结构

顺序表的完整信息:数据区与信息区(元素存储区的容量和当前表中已有的元素个数)
顺序表删除元素:
在这里插入图片描述

3、链表

3.1链表实现

链表:不需要连续的存储空间
存储地址,保证了能找到下一个存储地址
顺序表是一个连续的存储空间
在这里插入图片描述

#链表结点实现
class SingleNode(object):
	def __init__(self,item):
		#item:存放元素   next:标识下一个结点
		self.item = item
		self.next = None

#结点
node1 = SingleNode(10)
print(node1.item)
print(node1.next)

#单链表的实现
class SingleLinkList(object):
	def __init__(self,node=None):
		#head:首节点
		self.head=node
#链表
link1 = SingleLinkList()
print(link1.head)
link2 = SingleLinkList(node1)
print(link2.head.item) #输出10

链表:不需要连续的存储空间
实现链表:结点类;单链表类(由多个节点组成)
在这里插入图片描述

3.2链表的方法

链表的判空:看head是否为空
链表的长度测量:增加一个游标cur和一个计数count
链表的遍历:游标cur经过的每个元素都打印出来

#链表结点实现
class SingleNode(object):
	def __init__(self,item):
		#item:存放元素   next:标识下一个结点
		self.item = item
		self.next = None
#单链表的实现
class SingleLinkList(object):
	def __init__(self,node=None):
		#head:首节点
		self.head=node
#判断链表是否为空		
def is_empty(self):
	if self.head is None:
		return True
	else:
		return False

#获取链表长度
def length(self):
	cur = self.head #游标记录当前所在位置
	count = 0 #记录链表长度
	while cur is not None:
		cur = cur.next
		count+=1
	return count

#遍历链表
def travel(self):
	cur = self.head
	while cur is not None:
		print(cur.item)
		cur = cur.next
		
if __name__ =='__main__':
	node1 = SingleNode(10)
	#链表
	link1 = SingleLinkList()
	#判空
	print(link1.is_empty())
	#长度
	print(link1.length())
	#遍历
	link1.travel()

3.3链表增加节点

三种情况:链表头部增加结点add(item)、尾部增加结点append(item)、指定位置增加结点insert(item)
1,链表头部增加结点add(item)
先新结点指向原头部
再头部head指向新结点

2,尾部增加结点append(item)
找到尾结点,让尾结点指向新结点
while cur.next is not None
cur = cur.next
cur.next = new_node

3,指定位置增加结点insert(item)
第一步:找到插入位置的前一个结点,
while count <pos:
cur = cur.next
count +=1
第二步:插入新结点
node.next = cur.next
cur.next = node

#链表结点实现
class SingleNode(object):
	def __init__(self,item):
		#item:存放元素   next:标识下一个结点
		self.item = item
		self.next = None
#单链表的实现
class SingleLinkList(object):
	def __init__(self,node=None):
		#head:首节点
		self.head=node
#头部增加结点	
def add(self,item):
	#新结点存储数据
	node = SingleNode(item)
	node.next = self.head
	self.head = node
		
#尾部增加结点
def append(self,item):
	node = SingleNode(item)
	#判断是否为空链表
	if self.is_empty():
		self.head = node
	else:	
		cur = self.head
		while cur.next is not None:
			cur = cur.next
		cur.next = node
#指定位置增加结点
def insert(self,pos,item):
	#新结点
	node = SingleNode(item)
	
	if pos <=0:  #头部增加新结点
		self.add(item)
	elif pos>=self.length(): #尾部增加新结点
		self.append(item)
	else:
		#游标
		cur = self.head
		#计数
		count = 0
		#找到插入位置的前一个结点,
		while count <pos-1:
			cur = cur.next
			count +=1
		#插入新结点
		node.next = cur.next
		cur.next = node
	
if __name__ =='__main__':
	node1 = SingleNode(10)
	#链表
	link1 = SingleLinkList()
	#头部增加节点
	link1.add(9)
	#尾部增加结点
	link1.append(11)
	#指定位置增加结点
	link1.insert(100,0)
	link1.travel()

3.4链表删除节点

remove(item)删除节点
search(item)查找结点是否存在

remove()在头部找到要删除的元素:
cur = head
pre = None
while cur is not None:
if cur.item == item:
#要删除元素在头部
if cur ==head:
head = cur.next
#要删除元素不在头部
else:
pre.next = cur.next
return

#链表结点实现
class SingleNode(object):
	def __init__(self,item):
		#item:存放元素   next:标识下一个结点
		self.item = item
		self.next = None
#单链表的实现
class SingleLinkList(object):
	def __init__(self,node=None):
		#head:首节点
		self.head=node
#删除节点
def remove(self,item):
	cur = self.head #游标
	while cur is not None:
		if cur.item ==item: #找到了删除元素
			if cur == self.head: #要删除的在头部
				self.head = cur.next
			else:   #要删除的不在头部
				pre.next = cur.next
			return
		else:  #没找到要删除元素
			pre = cur
			cur = cur.next
	
#查找结点是否存在
def search(self,item):
	cur = self.head
	while cur is not None:
		if cur.item ==item:
			return True
		cur= cur.next
	return False
	
if __name__ =='__main__':
	node1 = SingleNode(10)
	#链表
	link1 = SingleLinkList()
	#头部增加节点
	link1.add(9)
	#尾部增加结点
	link1.append(11)
	#指定位置增加结点
	link1.insert(100,0)
	link1.travel()
	#删除元素
	link1.remove(9)
	link1.travel()
	#查找结点是否存在
	print(link1.search(11))
	print(link1.search(9))

3.5链表总结

线性结构:最多只能有一个前驱结点和一个后继结点
非线性结构:可以有多个前驱结点和一个后继结点

线性结构:顺序表、链表
顺序表:元素顺序地存放在一块连续的存储区里,元素间的顺序关系由他们的存储顺序自然表示
链表:将元素存放在通过链接构造起来的一系列存储块中,存储空间非连续
在这里插入图片描述

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

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

相关文章

(Java高级教程)第三章Java网络编程-第三节:UDP数据报套接字(DatagramSocket)编程

文章目录一&#xff1a;Java数据报套接字通信模型二&#xff1a;相关API详解&#xff08;1&#xff09;DatagramSocket&#xff08;2&#xff09;DatagramPacket三&#xff1a;UDP通信示例一&#xff1a;客户端发送什么服务端就返回什么&#xff08;1&#xff09;代码&#xff…

k8s之ConfigMap和secret

写在前面 我们知道k8s的数据都是存储到kv数据库etcd中的&#xff0c;那么我们程序中使用到各种配置信息是否可以也存储到etcd&#xff0c;然后在pod中使用呢&#xff1f;是可以的&#xff0c;k8s为了实现将自定义的数据存储到etcd&#xff0c;定义了ConfigMap 和secret两种API…

《后端技术面试 38 讲》学习笔记 Day 01

《后端技术面试 38 讲》学习笔记 Day 01 学习目标 在2022年春节将至&#xff08;半个月&#xff09;&#xff0c;适合在这个冬天里&#xff0c;温故知新。通过学习一门覆盖面较广的课程&#xff0c;来夯实基础&#xff0c;完善自己的知识体系&#xff0c;是一个很棒的选择。 …

LCHub:未来,低代码产品矩阵是500强企业的绝佳选择

近日,国内知名咨询机LCHub发布2022《中国大型企业数字化升级路径研究》。 报告认为由于大型企业的数字化需求旺盛、购买力充足,因此国内成熟的数字化服务商普遍以大型企业为核心客户。大型企业与数字化服务商的供需磨合决定了我国数字化市场的形态,造就了我国数字化市场与海…

go map 源码逐行阅读

map粗略介绍 源码开头注释&#xff1a; A map is just a hash table. The data is arranged into an array of buckets. Each bucket contains up to 8 key/elem pairs. The low-order bits of the hash are used to select a bucket. Each bucket contains a few high-order…

Linux学习笔记——RabbitMQ安装部署

5.4、RabbitMQ安装部署 5.4.1、简介 RabbitMQ是一款知名的开源消息列队系统&#xff0c;为企业提供消息的发布、订阅、点对点传输等消息服务。 RabbitMQ在企业开发中十分常见&#xff0c;课程为大家演示快速搭建RabbitMQ环境。 5.4.2、安装 RabbitMQ在yum仓库中的版本比较老…

用于从单细胞FRET数据中提取灵敏度分布的Matlab代码

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 对于分子生物学来讲&#xff0c;生物分析手段的发展&#xff0c;是阐明机理的必要条件。在研究分子间相互作用的道路上&#xf…

Leetcode - 106 - 相交链表

160. 相交链表 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&am…

【阶段三】Python机器学习04篇:机器学习项目实战:多元线性回归模型、岭回归模型与套索回归模型

本篇的思维导图: 一元线性回归的数学原理 一元线性回归模型又称为简单线性回归模型,其形式可以表示为如下所示的公式。 y=ax+b 其中,y为因变量,x为自变量,a为回归系数,b为截距。 如下图所示,其中y(i)为实际值,y(i)为预测值,一元线性回归的目的就是拟合出一…

Vision-Only Robot Navigation in a Neural Radiance World

Paper name Vision-Only Robot Navigation in a Neural Radiance World Paper Reading Note URL: https://arxiv.org/abs/2110.00168 TL;DR RA-L 2022 文章&#xff0c;提出在 NeRF 表达的环境中进行机器人导航及循迹任务的方法 Introduction 背景 基于 on-board 传感器…

HTML与CSS基础(五)—— CSS布局(盒子模型)、PxCook使用

目标能够认识 盒子模型 的组成部分 能够掌握盒子模型的 边框、内边距、外边距 的作用及简写形式能够计算盒子的 实际大小 能够了解 外边距折叠现象&#xff0c;并知道如何解决 盒子塌陷问题一、PxCook的基本使用1. 通过软件打开设计图① 打开软件 ② 拖拽入设计图 ③ 新建项目2…

Acwing---99.激光炸弹

激光炸弹1.题目2.基本思想3.代码实现1.题目 地图上有 NNN 个目标&#xff0c;用整数 Xi,YiXi,YiXi,Yi 表示目标在地图上的位置&#xff0c;每个目标都有一个价值 WiWiWi。 注意&#xff1a;不同目标可能在同一位置。 现在有一种新型的激光炸弹&#xff0c;可以摧毁一个包含 …

Java中常用API总结(4)—— Object类(含实例解读和源码阅读)

Object类一、前言二、概述1.API帮助文档2.使用方法三、常用方法1.toString方法1️⃣格式2️⃣实例3️⃣源码阅读4️⃣快捷键重写方法2.equals方法1️⃣格式2️⃣实例3️⃣源码阅读4️⃣重写方法3.对象克隆四、结语一、前言 本文将讲述有关于Object类相关知识点 二、概述 1.A…

C语言文件操作的细节

目录 文本文件和二进制文件 概念 一个数据在内存中是怎么存储的呢&#xff1f; 通过VS2013可以查看二进制数值 文件读取结束的判定 文件缓冲区 文本文件和二进制文件 概念 根据数据的组织形式&#xff0c;数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的…

YOLOv5 以txt 或json格式输出预测结果

YOLOv5 以txt 或json格式输出预测结果1.YOLOv5源码以多种格式输出预测结果1.run函数——传入参数2.run函数——保存打印2.YOLOv5以.txt格式输出预测结果1.执行以下代码就可以得到以.txt格式输出预测结果2.输出格式&#xff1a;3.YOLOv5以.json格式输出预测结果1.需要在源码中加…

零售行业交易数据分析(3)——群组/同期群分析(留存率分析)

内容简介 本文介绍了群组分析&#xff08;同期群分析&#xff09;的方法以及Python实现过程&#xff0c;并继续对一家零售公司的交易数据进行用户留存分析和可视化。 本系列的文章&#xff1a; 《零售行业交易数据分析&#xff08;1&#xff09;——客户终身价值(CLTV)计算和…

Qt扫盲-QSplitter理论总结

QSplitter理论总结一、概述二、使用说明1. 添加子控件2. 内部控件大小和位置一、概述 QSplitter允许用户通过拖动子部件之间的边界来控制子部件的大小。这个经常在我们使用的一些工具软件中最常使用 比如就像 QAssistant 里面的索引栏和内容直间&#xff0c;鼠标放在那个分界区…

3dMax中的两足动物及动画制作方法

3dMax的两足动物简介 3DMax是一款专业的3D电脑设计软件&#xff0c;用于制作3D动画、游戏、模型、图像等&#xff0c;在视频游戏开发商、影视工作室的工作中发挥着重要作用。Biped 是3D max 软件中动画的基本部分。3dMax中的Biped为角色建模中的角色部分提供运动并将其连接到现…

基于Java+SpringMvc+vue+element实现驾校管理系统详细设计

基于JavaSpringMvcvueelement实现驾校管理系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

PPI网络的构建与美化(String+Cytoscape)

目录写在前面一、使用string分析数据二、使用Cytoscape构建网络1. 导入TSV文件2. Analyze Network3. Generate Style4. CytoNCA计算Betweenness三、美化网络1. 根据Betweenness调整网络2. 选择你需要的蛋白&#xff0c;做个双环网络图3. 调整字体大小颜色、气泡大小等4. 保存图…