数据结构(三)

本文详细探讨了线性表的理论实现,从顺序存储的直接表示到非零项高效存储的链表结构,涵盖了多项式表示、广义表与多重链表的应用。重点介绍了如何通过结构数组和链表优化存储非零项,以及多重链表在复杂数据结构中的运用。
摘要由CSDN通过智能技术生成

线性表及其理论实现

  • 什么是线性表
    ​ “线性表”:由同类型数据元素构成有序序列的线性结构
  1. 表中元素个数称为线性表的长度
  2. 线性表没有元素时,称为空表
  3. 表起始位置称为表头,表结束位置称表尾
方法1:顺序存储结构直接表示

例如: f ( x ) = 4 x 5 − 3 x 2 + 1 f(x) = 4x^5-3x^2+1 f(x)=4x53x2+1
表示成:
在这里插入图片描述
这样两个多项式相加就变成两个数组对应分量相加.
缺点: 过于稀疏,存在浪费, 假如有 x 2000 x^{2000} x2000还得有2000那么大的数组, 那么一个改进的思路就是能不能只保留非零项.

方法2:顺序存储结构表示非零项

每个非零项 a i x i a_ix^i aixi涉及两个信息:系数 a i a_i ai和指数 i i i
可以将一个多项式看成是一个 ( a i a_i ai, i i i) 二元组的集合。可以用结构数组来表示.

  • 结构数组是对某个对象,不同属性的数据,用一组数据来表示,称为结构数组。结构数组中的元素可以是数值也可以是字符串。
    在这里插入图片描述

在这里插入图片描述
按指数大小有序存储, 因为这样运算方便, 举上面两个多项式加法的例子:

在这里插入图片描述
指数项相比较, 然后大的排前面, 指数相同的系数相加.

方法3:链表结构存储非零项
  • python链表的定义
  • 链表中每个结点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域
    关于__slots__详细的解释
class Node():
  __slots__=['_item','_next']  #限定Node实例的属性
  def __init__(self,item):
    self._item=item
    self._next=None   #Node的指针部分默认指向None
  def getItem(self):
    return self._item
  def getNext(self):
    return self._next
  def setItem(self,newitem):
    self._item=newitem
  def setNext(self,newnext):
    self._next=newnext

在这里插入图片描述
在这里插入图片描述

广义表与多重链表

  • 我们知道了一元多项式的表示,那么二元多项式又该如何表示?
    比如,给定二元多项式:
    在这里插入图片描述

  • 方法一: 可以将上述二元多项式看成关于x 的一元多项式
    在这里插入图片描述
    在这里插入图片描述
    上面广义表(Generalized List)是线性表的推广, 属于多重链表中的一种.

多重链表
  • 链表中结点可能同时隶属于多个链;
  • 多重链表中结点指针域会有多个,如前面例子包含了Next和SubList两个指针域;但包含两个指针域的链表不一定是多重链表,比如双向链表不是多重链表。
    -多重链表有广泛的用途,基本上如树、图这样相对复杂的数据结构都可以采用多重链表的方式实现存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

live_for_myself

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值