常见的数据结构

链表

链表:适用于插入删除多、读少的场景。

链表在新增、删除数据都比较容易,可以在 O(1) 的时间复杂度内完成。
但对于查找,不管是按照位置的查找还是按照数值条件的查找,都需要对全部数据进行遍历。这显然就是 O(n) 的时间复杂度

定一个奇数个元素的链表,查找出这个链表中间位置的结点的数值———
一个巧妙的办法,就是利用快慢指针进行处理。其中快指针每次循环向后跳转两次,而慢指针每次向后跳转一次

链表的基本操作?读取O(n)、更新O(1)、插入O(1)、删除O(1)

栈——特殊的线性表——高频使用新增、删除操作,且新增和删除操作的数据执行顺序具备后来居上的相反关系时

后进先出(一个杯子)——浏览器都有页面前进和后退功能,这就是个很典型的后进先出的场景
表尾用来输入数据,通常也叫作栈顶(top);相应地,表头就是栈底(bottom)。栈顶和栈底是用来表示这个栈的两个指针
对于栈的新增操作,通常也叫作 push 或压栈。对于栈的删除操作,通常也叫作 pop 或出栈

一个 top 指针来指示栈顶元素在数组中的位置。假设栈中只有一个数据元素,则 top = 0。一般以 top 是否为 -1 来判定是否为空栈。
当定义了栈的最大容量为 StackSize 时,则栈顶 top 必须小于 StackSize。

删除数据元素,即出栈操作,只需要 top - 1 就可以了。

对于查找操作,栈没有额外的改变,跟线性表一样,它也需要遍历整个栈来完成基于某些条件的数值查找。

对于链栈来说,是不需要头指针的。相反,它需要增加指向栈顶的 top 指针,这是压栈和出栈操作的重要支持

新增操作和删除操作:时间复杂度都是 O(1)。
查找操作:栈和线性表一样只能通过全局遍历的方式进行,也就是需要 O(n) 的时间复杂度。

在这里插入图片描述

队列

队列 先进先出(平行线)–特殊的线性表——队列的增和删的操作只能分别在这个队列的队尾和队头进行——对处理顺序敏感的前提

一个队列都依赖队头(front)和队尾(rear)两个指针进行唯一确定

当队列为空时,front 和 rear 都指向头结点

循环队列解决数组越界的问题

链式队列进行删除数据操作时,实际删除的是头结点的后继结点。这是因为头结点仅仅用来标识队列,并不存储数据

为了防止删除最后一个有效数据结点后, front 指针和 rear 指针变成野指针,导致队列没有意义

在可以确定队列长度最大值时,建议使用循环队列。无法确定队列长度时,应考虑使用链式队列

数组

数组 : 增删困难、查找容易的特点

增加:若插入数据在最后,则时间复杂度为 O(1);如果中间某处插入数据,则时间复杂度为 O(n)。
删除:对应位置的删除,扫描全数组,时间复杂度为 O(n)。
查找:如果只需根据索引值进行一次查找,时间复杂度是 O(1)。但是要在数组中查找一个数值满足指定条件的数据,则时间复杂度是 O(n)

数组更适合在数据数量确定,即较少使用新增数据、删除数据操作的场景下使用
在数据对位置敏感的场景下,比如需要高频根据索引位置查找数据时,数组就是个很好的选择

数组:适合多读、插入删除少的场景。

比较:
链表的长度是可变的,数组的长度是固定的

链表优势是增删,劣势是查(但是增删必须先查)
数组优势是查,劣势是增删

如果数据的元素个数不确定,且需要经常进行数据的新增和删除时——链表
如果数据元素大小确定,删除插入的操作并不多,根据索引位置查找数据——数组

数组的基本操作?读取O(1)、更新O(1)、插入O(n)、删除O(n)、扩容O(n)

增删操作的时间复杂度都是 O(1)。
对于查找操作,如果是普通二叉树,则查找的时间复杂度和遍历一样,都是 O(n)。
如果是二叉查找树,则可以在 O(logn) 的时间复杂度内完成查找动作。
树结构在存在“一对多”的数据关系中,可被高频使用,这也是它区别于链表系列数据结构的关键点。

哈希表

哈希表的基本操作?写入:O(1)、读取:O(1)、扩容O(n)
通过哈希函数,我们可以把字符串或其他类型的key,转化成数组的下标index

python中的数据结构

list

  • list对应数据结构的线性表,列表长度在初始状态时无需指定,当插入元素超过初始长度后再启动动态扩容,删除时尤其位于列表开始处元素,时间复杂度为O(n)

  • Python的list当做栈用,完全没有问题,push 和 pop 操作的时间复杂度都为 O(1)–增删

  • 插入元素的时间复杂为O(n),所以凡是涉及频繁插入删除元素的操作,都不太适合用list.

  • list 使用在需要查询、修改的场景,极不擅长需要频繁插入、删除元素的场景。

tuple

元组是一类不允许添加删除元素的特殊列表,也就是一旦创建后续决不允许增加、删除、修改

如果非常确定你的对象后面不会被修改,则可以大胆使用元组。相比于list, tuple实例更加节省内存,这点尤其重要

set

去重:如果想缓存某些元素值,且要求元素值不能重复时,适合选用此结构。并且set内允许增删元素,且效率很高。
set在内部将值哈希为索引,然后按照索引去获取数据,因此删除、增加、查询元素效果都很高

dict

dict字典尤其适合在查询多的场景,时间复杂度为O(1). 字典是一种哈希表,同时保存了键值对
如leetcode第一题求解两数之和时,就会使用到dict的O(1)查询时间复杂度
dict占用字节数是list、tuple的3、4倍,因此对内存要求苛刻的场景要慎重考虑

deque

deque 双端队列,基于list优化了列表两端的增删数据操作
from collections import deque
d = deque([3,2,4,0])
d.popleft() # 左侧移除元素,O(1)时间复杂度
d.appendleft(3) # 左侧添加元素,O(1)时间复杂度

Counter

Counter一种继承于dict用于统计元素个数的数据结构,也称为bag 或 multiset. 基本用法:
from collections import Counter
c = Counter([1,3,2,3,4,2,2]) # 统计每个元素的出现次数
In [17]: c
Out[17]: Counter({1: 1, 3: 2, 2: 3, 4: 1})

heapq

heapq基于list优化的一个数据结构:堆队列,也称为优先队列。堆队列特点在于最小的元素总是在根结点:heap[0]

heapq.heapify(a) # 对a建堆,建堆后完成对a的就地排序
a[0] # a[0]一定是最小元素
heapq.nlargest(3,a) # a的前3个最大元素

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

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

相关文章

爱奇艺APP Android低端机性能优化

01 背景介绍 在智能手机市场上,高端机型经常备受瞩目,但低端机型亦占据了不可忽视的份额。众多厂商为满足低端市场的需求,不断推出低配系列手机。另外过去几年的中高端机型,随着系统硬件的快速迭代,现已经被归类为低端…

【大语言模型】轻松本地部署Stable Diffusion

硬件要求: 配备至少8GB VRAM的GPU,如果你的电脑只有CPU,请看到最后。根据部署规模,需要足够的CPU和RAM。 软件要求: Python 3.7或更高版本。支持NVIDIA GPU的PyTorch。Hugging Face的Diffusers库。Hugging Face的Tr…

4.2 面向对象程序设计-类的继承实验

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系将于24小时内删除 目录 1.实验内容 2.实验原理 2.1类的继承 2.2 继承的优点和缺点 2.3 继承的方式 3.实验代码 1.实验内容 创建一个父类CalcTime,在父类中依次定义用于保存…

Pods/Nodes

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看 📙Jav…

初步学习node.js文件模块

环境已安装好; 写一个read1.js如下; var fs require("fs"); var data ;// 创建一个流 var stream1 fs.createReadStream(test1.jsp); stream1.setEncoding(UTF8);// 绑定data事件 stream1.on(data, function(mydata) {data mydata; });/…

程序员Java.vue,python前端后端爬虫开发资源分享

bat面试资料 bat面试题汇总 提取码:724z 更多资料

项目总体测试计划书

目的:编写此测试方案的目的在于明确测试内容、测试环境、测试人员、测试工作进度计划等,以保证测试工作能够在有序的计划安排进行。 测试目标:确保XXX项目的需求分析说明书中的所有功能需求都已实现,且能正常运行;确保…

【Web】DASCTF 2023 0X401七月暑期挑战赛题解

目录 EzFlask MyPicDisk ez_cms ez_py 让俺看看401web题 EzFlask 进来直接给了源码 import uuidfrom flask import Flask, request, session from secret import black_list import jsonapp Flask(__name__) app.secret_key str(uuid.uuid4())def check(data):for i i…

React ant 点击导航条闪烁

问题 : 点击当前位置会出现闪一下的效果 另一种点击方式 , 不会闪 原因 : 没有传递具体的参数给点击事件 , 导致在函数内部无法准确判断要展示哪个子菜单,可能导致页面状态的短暂变化,出现闪烁效果 代码 : // 左侧子菜单弹出const showSonMenu routeK…

【数据挖掘】实验7:高级绘图(上)

实验7:高级绘图(上) 一:实验目的与要求 1:了解R语言中各种图形元素的添加方法,并能够灵活应用这些元素。 2:了解R语言中的各种图形函数,掌握常见图形的绘制方法。 二:实…

python-study-day1

ps:前言 可做毕设,html,web,app,小程序,bug修改,可加急 作者自述 作为一名前端开发工程师,这个大环境不好的情况下,我试过我前端接单子但是没有后端&#xff0c…

用java实现单链表的头插,尾插和反转

今天来练习以下单链表的一些操作,以下的操作都是带有头节点的链表。 定义链表节点类 定义了节点中的值,节点的下一个节点,和一些基本的方法。 public static class ListNode{int val;ListNode next;public ListNode() {}public ListNode(in…

NPM 命令备忘单

NPM 简介 Node Package Manager (NPM) 是 Node.js 环境中不可或缺的命令行工具,充当包管理器来安装、更新和管理 Node.js 应用程序的库、包和模块。对于每个 Node.js 开发人员来说,无论他们的经验水平如何,它都是一个关键工具。 NPM 的主要…

pom.xml显示灰色并被划线

在使用 IDEA 进行开发的过程中,有时候会遇到 pom.xml 显示灰色并被划线的情况,如下图: 这一般是因为该文件被 Maven 忽略导致的,可以进行如下操作恢复: 设置保存后,可以看到 pom.xml 恢复了正常&#xff1a…

计算机网络书籍--《网络是怎样连接的》阅读笔记

第一章 浏览器生成信息 1.1 生成HTTP请求信息 1.1.1 URL Uniform Resource Locator, 统一资源定位符。就是网址。 不同的URL能够用来判断使用哪种功能来访问相应的数据,比如访问Web服务器就要用”http:”,而访问FTP服务器用”ftp:”。 FTP&#xff…

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念:FSM(有限状态机),模式之间转换 状态机,也叫有限状态机&#xff08…

基于OptiTrack跟踪系统和Turtlebot机器人的视觉SLAM定位评估

本文旨在介绍使用OptiTrack光学跟踪系统和Turtlebot机器人进行视觉SLAM定位实验的详细流程,包括实验平台搭建过程、数据处理过程以及SLAM估计评估方法。由于涉及知识较多,部分内容只给出了相关参考博文链接。 1 实验平台搭建 实验平台包括OptiTrack光学…

Golang | Leetcode Golang题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; func removeDuplicates(nums []int) int {n : len(nums)if n 0 {return 0}slow : 1for fast : 1; fast < n; fast {if nums[fast] ! nums[fast-1] {nums[slow] nums[fast]slow}}return slow }

window10轻松使用k8s

Docker Desktop安装篇 1、win10安装 1、下载安装包 https://www.docker.com/products/docker-desktop/ 官网下载安装包 2、配置win10支持虚拟化 不勾选Hyper-V&#xff0c;容易出错 3、安装WSL配置window支持linux Windows Subsystem for Linux (WSL) 安装 Linux 子系统&am…

嵌入式sqlite3交叉编译移植

操作系统:Ubuntu20.04 下载sqlite3代码,下载版本3.30.00 wget https://www.sqlite.org/2019/sqlite-amalgamation-3300000.zip 或者https://download.csdn.net/download/benico/89127678 为什么下载amalgamation版本,不下载autoconf版本? 根据我的编译实验,同版本sql…