线性表及其理论实现
- 什么是线性表
“线性表”:由同类型数据元素构成有序序列的线性结构
- 表中元素个数称为线性表的长度
- 线性表没有元素时,称为空表
- 表起始位置称为表头,表结束位置称表尾
方法1:顺序存储结构直接表示
例如:
f
(
x
)
=
4
x
5
−
3
x
2
+
1
f(x) = 4x^5-3x^2+1
f(x)=4x5−3x2+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两个指针域;但包含两个指针域的链表不一定是多重链表,比如双向链表不是多重链表。
-多重链表有广泛的用途,基本上如树、图这样相对复杂的数据结构都可以采用多重链表的方式实现存储。