PHPer学数据结构与算法(二)-- 链表-基本存储

数据结构最简单就是链表,

基本解释

形如f(x)=anxn + an-1xn-1 …+a2x2+a1x+a0的函数,叫做多项式函数,也称n次多项式函数、n次函数。
显然,当n=1时,其为一次函数y=kx+b,当n=2时,其为二次函数。
其中其中an≠0,n∈N+

关键数据:

  • 多项式的关键数据
  • 多项式项数n
  • 各项系数ai及指数i。

如何用程序来表示,并执行相应操作

  1. 顺序存储结构直接表示,即简单索引数组表示
    项xi的系数ai用如下代码表示
$a =array();
$a[$i]; 

例: f(x) = 4x5-3x2+1中,各项存储为:

//索引为下标
$a =array();
$a=[
	0=>1, //表示x^0的系数为1
	1=>0, //表示x的系数为0,题目中没有x项,故为0
	2=>-3  //表示x^2的系数为-x,及表示-3x^2
	4=>0,
	5=>4,
	//....
]

缺点: x+3x2000 表示,必须用数组大小为2001以上表示,多余0浪费空间和时间。

  1. 顺序存储结构表示非零项
    分析: 每个非0项aixi涉及两个信息: 系数ai和指数i;因此,可以将一个多项式看成一个(ai,i)的二元组集合。C中用结构数组表示,PHP可以用二维数据。
    例:
    P1(x) = 9x12 +15x8 + 3x2
    P2(x) = 26x19 -4x8 -13x6 + 82
//p1:
$a1= [
	[9,12], //表示第0项,系数为9.指数为12,即9x^12
	[15,8],  //第1项,系数14,指数为8,即15x^8
	[3,2]
];
//p2
$a2 = [
	[26,19],
	[-4,8],
	[-13,6],
	[82,0] //第3项,系数为82,指数为0,即82x^0,也就是常数82
];

为方便计算,需要按指数大小有序存储,过程如下
上面两个相加,即P3=P1+P2,求P3
相加过程:从头开始,比较两个多项式当前对应项的指数。
基本计算逻辑,指数从大到小排出,若相同,则相加,过程如下:
P1:(9,12),(15,8),(3,2)
P2:(26,19),(-13,6),(82,0)
P3:(26,19),(9,12),(11,8),(-13,6),(3,2),(82,0)

P3(x) = 26x19 +9x12 +11x8-13x6 +3x2 +82

  1. 链表结构存储非0项
    列表中每个节点存储多项式中的一个非0项,包括系数和指数俩个数据域,以及一个指针域。C语言通过truct实现,php可以定义一个节点类来存储节点数据与节点指针
指数系数指针域
coefexponlink

php代码实现

//节点类
class Node{
    public $coef; //项系数
    public $expon; //指数
    public $next;
    public function __construct($coef,$expon,$next=null){
        $this->coef  = $coef;
        $this->expon = $expon; 
        $this->next = $next; //指针
    }
}

链表存储结构

线性表

  1. 同一个问题可以有不同表示方法
  2. 有一类共性问题:有序线性的组织和管理

“线性表(Linear List)”:由同类型数据元素构成有序序列的线性结构

  • 表中元素个数称为线性表长度
  • 线性表没有元素时,称为空表
  • 表起始位置称表头,表示结束位置称表尾

利用数组的连续存储空间顺序存放线性表的各元素

//链表类
class LinkList{
    public  $head; //头结点
    public  $size; //长度

    public function __construct()
    {
        $this->head = new Node();
        $this->size = 0;
    }
	/**
     * @param $index 添加索引位置
     * @param $coef
     * @param $expon
     * @throws Exception
     */
    public function add($index,$coef,$expon){
        if ($index>$this->size){
            throw new Exception("超出链表长度");
        }
        $prev = $this->head; //默认是第一个节点
        for ($i =0;$i<$index;$i++)
        {
            $prev = $prev->next; 
        }
        $prev->next = new Node($coef,$expon,$prev->next);
        $this->size++;
    }
}

下一篇: PHPer学数据结构与算法(二)-- 链表-线性表操作与PHP代码实现

https://www.cnblogs.com/qixingzhi/p/11169739.html
PHP实现链表 https://www.cnblogs.com/tongcharge/p/12106480.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值