线性表的顺序存储和链式存储—Python数据结构(二)

news2024/11/22 18:20:08

线性表

定义:
线性表的定义是描述其逻辑结构,而通常会在线性表上进行的查找、插入、删除等操作。

线性表作为一种基本的数据结构类型,在计算机存储器中映象(表示)一般有两种形式,一种是顺序映象,一种是链式映象。

线性表的顺序存储

若将线性表L=(a0,a1,…an+1)中的各个元素一次存储于计算机一片连续的存储空间,这种机制表示为线性表的顺序存储结构。

特点:

逻辑上相邻的元素 ai,ai+1,其存储位置也是相邻的;

存储密度高,方便对数据遍历查找。

对表的插入和删除等运算的效率较差。

程序实现

在Python中,list存放于一片单一连续的内存块,故可借助于列表类型来描述线性表的顺序存储结构,而且列表本身就提供了丰富的接口满足这种数据结构的运算。

线性表链式存储

在这里插入图片描述

特点:

  • 逻辑上相邻的元素 ai,ai+1,其存储位置也不一定相邻。

  • 存储稀疏,必须开辟整块存储空间。

  • 对表的插入和删除等运算的效率较高。

  • 逻辑结构复杂。

程序实现:

创建明为link_list.py的脚本,主要用于编写链式结构的线性表,并将其接口也做好封装

#创建节点类
class Node:
  """
  思路:将自定义的类视为节点的生成的类,实例对象中包含数据部分和指向下一个节点的next
  """

  def __init__(self, val, next=None):
      self.val = val
      self.next = next


class LinkList():
  """
  思路:单链表类,生成对象可以进行增删改查操作
  具体操作通过调用具体方法完成。
  """

  def __init__(self):
      """
      初始化链表,标记一个链表的开端,以便于获取后续的节点。
      """
      self.head = Node(None)

  # 通过list_为来拿表添加一组节点
  def init_list(self, list_):
      p = self.head  # p作为移动变量
      for item in list_:
          p.next = Node(item)
          p = p.next

  # 遍历链表
  def show(self):
      p = self.head.next
      while p is not None:
          print(p.val)
          p = p.next  # 向后移动一个

  # 判断链表为空
  def is_empty(self):
      if self.head.next is None:
          return True
      else:
          return False

  # 清空链表
  def clear(self):
      self.head.next = None

  # 尾部插入
  def append(self, val):
      p = self.head
      while p.next is not None:
          p = p.next
      p.next = Node(val)

  # 头部插入
  def head_insert(self, val):
      node = Node(val)
      node.next = self.head.next
      self.head.next = node

  # 插入指定位置
  def insert(self, index, val):
      p = self.head
      for i in range(index):
          if p.next is None:
              break
          p = p.next
      node = Node(val)
      node.next = p.next
      p.next = node

  # 删除节点
  def delete(self, x):
      p = self.head
      while p.next and p.next.val != x:
          p = p.next
      if p.next is None:
          raise ValueError(" x is not in linklist")
      else:
          p.next = p.next.next

  # 获取某个索引的值,传入节点位置,获取节点值
  def get_index(self, index):
      p = self.head.next
      for i in range(index):
          if p.next is None:
              raise IndexError("index out of range")
          p = p.next
      return p.val



测试

from link_list import *
import time

# l = range(999999)
l = [i for i in range(999999)]
# 链表初始化
link = LinkList()
# 链表插入
link.init_list(l)
# 开始计时
tm = time.time()
# for i in l:
#     print(i)  #  3.307s 列表
# link.show()  # 4.61s  单链表
# l.append(8899)  # 列表尾部插入 2.86* 10-6

# link.append(8899)  # 链表尾部插入  0.0534

# l.insert(0, 8899)   # 列表头部插入,0.00392
# link.head_insert(8899)  # 链表头部插入 4.76*10-6
# l.insert(100, 2344)  # 列表插入到指定位置数据, 0.0037
# link.insert(300000, 2344)  # 0.021

# l.remove(200)  # 按照值进行删除 0.0058
# link.delete(850218)  # 按照值进行删除 0.085
# print(l[10])  # 按照索引获取值,1.88
# print(link.get_index(10))  # 按照索引获取值,2.69*10-5
# 计时结束
print("time:", time.time() - tm)

'''
总结:
1. 数据初始化输出,列表的速度最快,即线性表的顺序结构查询速度高。
2. 数据尾部插入,列表速度最快,即线性表的顺序结构。
3. 数据头部插入,链表的插入最快,不需要遍历,列表插入时,需要把后续数据全部重构。
4. 插入到指定指定位置时,只有特殊的头部或尾部才有明显的时间差,其他位置时间差相差不大。
'''

练习题

'''
现有两个有序的列表,请使用单链表方式将其进行合并,合并后的数据仍然是有序数据.
'''
from link_list import *

l1 = LinkList()
l2 = LinkList()

l1.init_list([2, 3, 5, 9, 13, 15])
l2.init_list([1, 4, 6, 7, 8, 10, 11, 12, 14])


def merge(l1, l2):
    p = l1.head
    q = l2.head.next
    while p.next is not None:
        if p.next.val < q.val:
            p = p.next
        else:
            tmp = p.next
            p.next = q
            p = p.next
            q = tmp
    p.next = q


merge(l1, l2)
l1.show()


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

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

相关文章

接口漏洞-WebService-wsdl+SOAP-Swagger+HTTP-WebPack

什么是接口&#xff1f; 接口就是位于复杂系统之上并且能简化你的任务&#xff0c;它就像一个中间人让你不需要了解详细的所有细节。像谷歌搜索系统&#xff0c;它提供了搜索接口&#xff0c;简化了你的搜索任务。再像用户登录页面&#xff0c;我们只需要调用我们的登录接口&am…

Jupyter 安装和使用

安装Jupyter 使用pip工具进行安装&#xff0c;在命令提示窗口输入命令如下&#xff1a; pip install jupyter notebook 使用Jupyter 在命令提示窗口输入如下命令&#xff0c;启动浏览器页面&#xff1a; jupyter notebook 修改jupyter的工作路径/存储路径 由于默认工作路…

去括号问题(C++处理)

继http://t.csdn.cn/kIcUT后的文章 题目描述 当老师不容易&#xff0c;尤其是当小学的老师更难:现在的小朋友做作业喜欢滥用括号。 虽然不影响计算结果&#xff0c;但不够美观&#xff0c;容易出错&#xff0c;而且可读性差。但又不能一棒子打死&#xff0c;也许他们就是将来的…

【Linux从入门到精通】进程的控制(进程退出+进程等待)

本篇文章主要讲述的是进程的退出和进程等待。希望本篇文章的内容会对你有所帮助。 文章目录 一、fork创建子进程 1、1 在创建子进程中操作系统的作用 1、2 写时拷贝 二、进程终止 2、1 常见的进程退出 2、2 进程的退出码 2、2、1 运行结果正确实例 2、2、2 运行结果不正确实例…

防御第二天-防火墙演示实验

1.上课思维导图 2.防火墙演示实验 防火墙FW1&#xff1a;原用户名&#xff1a;admin 原密码&#xff1a;Admin123 配地址&#xff1a;<USG6000V1>sy [USG6000V1]int g0/0/0 [USG6000V1-GigabitEthernet0/0/0]ip add 192.168.18.2 24 打开所有权限[USG6000V1-Gig…

C++(一):基本数据类型

基本数据类型 基本内置类型定义变量type field value;type field(value);type field{value};type field {value}; 数学常量及函数静态类型转换 static_cast格式化字符串std::stringstreamstd::string引入三方库 fmt/core.h 字符运算auto 关键字枚举类型数据类型定义别名判断是…

牛客网刷题之链表(一)

链表 NB1 删除链表峰值NB2 牛群排列去重NB3 调整牛群顺序NB4 牛群的重新分组NB5 牛群的重新排列NB6 合并两群能量值&#xff08;合并有序单链表&#xff09;NB7 牛群的能量值&#xff08;单链表相加&#xff09; 以下题全部出自牛客网。 题目题目考察的知识点链表&#xff1a; …

Element Plus 日期选择器

计算开始日期到结束日期的总天数 结构 <el-form-item label"计划开始时间" required prop"StartTime"><el-date-pickertype"date"v-model"ruleForm.StartTime":disabled-date"StartTime"placeholder"计划开始…

pytorch工具——使用pytorch构建一个分类器

目录 分类器任务和数据介绍训练分类器的步骤在GPU上训练模型 分类器任务和数据介绍 训练分类器的步骤 #1 import torch import torchvision import torchvision.transforms as transformstransformtransforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.…

SpringCloud学习路线(8)—— Docker

一、Docker的开始 &#xff08;一&#xff09;项目部署问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 &#xff08;二&#xff09;Docker如何解决问题&#xff1f; 1、依赖兼容问题 &#xff08;1&#xff09;将应用的Libs&…

垃圾回收之三色标记法(Tri-color Marking)

关于垃圾回收算法&#xff0c;基本就是那么几种&#xff1a;标记-清除、标记-复制、标记-整理。在此基础上可以增加分代&#xff08;新生代/老年代&#xff09;&#xff0c;每代采取不同的回收算法&#xff0c;以提高整体的分配和回收效率。 无论使用哪种算法&#xff0c;标记…

(已解决)RuntimeError: Java gateway process exited before sending its port number

今天用Pycharm远程使用pysaprk解释器时&#xff0c;跑代码出现了这个错误&#xff1a; RuntimeError: Java gateway process exited before sending its port number 找了好多博客都没解决问题&#xff0c;有说重装spark的&#xff0c;有说本地配Java_home的&#xff0c;后面我…

[C语言刷题]杨氏矩阵、返回型参数

本文包含知识点 杨氏矩阵极其解法函数return多个值的四种方法 题目&#xff1a; 杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于…

js 在浏览器窗口关闭后还可以不中断网络请求

有个需求&#xff0c;我们需要在用户发送数据过程中&#xff0c;如果用户关闭了网页(包括整个浏览器关闭)&#xff0c;不要中断数据传递 目前XMLHttpRequest对象是不支持的 http服务器 为了测试效果我们用nodejs写了个http服务器代码 文件名为httpServer.js如下&#xff0c;…

获取大疆无人机的飞控记录数据并绘制曲线

机型M350RTK&#xff0c;其飞行记录文件为加密的&#xff0c;我的完善代码如下 gitgithub.com:huashu996/DJFlightRecordParsing2TXT.git 一、下载安装官方的DJIFlightRecord git clone gitgithub.com:dji-sdk/FlightRecordParsingLib.git飞行记录文件在打开【我的电脑】&am…

Windows nvm 安装后webstrom vue项目编译报错,无法识别node

1 nvm安装流程 卸载原先nodejs用管理员权限打开exe安装nvmnvm文件夹和nodejs文件夹 都授权Authenticated Users 完全控制nvm list availablenvm install 16.20.1nvm use 16.20.1输入node和npm检查版本命令&#xff0c;正常显示确认系统变量和用户变量都有nvm 和nodejs 2 bug情…

数学建模-聚类算法 系统(层次)聚类

绝对值距离:网状道路 一般用组间和组内距离 聚类的距离计算如何选取&#xff1a;看结果是否解释的通&#xff0c;选择一种结果解释的通的方法。

【数据挖掘】将NLP技术引入到股市分析

一、说明 在交易中实施的机器学习模型通常根据历史股票价格和其他定量数据进行训练&#xff0c;以预测未来的股票价格。但是&#xff0c;自然语言处理&#xff08;NLP&#xff09;使我们能够分析财务文档&#xff0c;例如10-k表格&#xff0c;以预测股票走势。 二、对自然语言处…

【转载+修改】pytorch中backward求梯度方法的具体解析

原则上&#xff0c;pytorch不支持张量对张量的求导&#xff0c;它只支持标量对张量的求导 我们先看标量对张量求导的情况 import torch xtorch.ones(2,2,requires_gradTrue) print(x) print(x.grad_fn)输出&#xff0c;由于x是被直接创建的&#xff0c;也就是说它是一个叶子节…

Vue.js uni-app 混合模式原生App webview与H5的交互

在现代移动应用开发中&#xff0c;原生App与H5页面之间的交互已经成为一个常见的需求。本文将介绍如何在Vue.js框架中实现原生App与H5页面之间的数据传递和方法调用。我们将通过一个简单的示例来展示如何实现这一功能。附完整源码下载地址:https://ext.dcloud.net.cn/plugin?i…