2007.08.16

算法       线性表的删除

与插入运算类似,在顺序表上实现删除运算也必须移动结点,这样才能反映出结点间的逻辑关系的变化。若i=L->last+1,则移位语句L->elem[k-1]=L->elem[k]不执行,因为循环变量的初值大于终值,此时不需要移动元素,仅将表长度减1即可。显然,删除算法中移位语句L->elem[k-1]=L->elem[k]的执行频度也与删除位置i有关。

在顺序表中插入或删除一个数据元素时,其时间主要耗费在移动数据元素上。对于插入算法而言,设Pi为在第i个元素之前插入元素的概率,并假设在任何位置上插入的概率相等,即Pi=1/n+1),i=12,…,n+1。。设Eins为在长度为n的表中插入一元素所需移动元素的平均次数,则

同理,设Qi为删除第i个元素的概率,并假设在任何位置上删除的概率相等,即Qi=1/ni=12,…,n。删除一个元素所需移动元素的平均次数Edel

由上式分析可知,在顺序表中插入和删除一个元素时,其时间主要耗费在移动数据元素上。 做一次插入或删除平均需要移动表中一般元素,当n加大是效率较低。

2-1     有两个顺序表LALB,其元素均为非递减有序排列,编写一个算法,将它们合并成一个顺序表LC,要求LC也是非递减有序排列。例如LA=223),LB=1334),则LC=1223334)。

算法思想:设表LC是一个空表,卫士LC也是非递减有序排列,可设两个指针ij分别指向表LALB中的元素,若LA.elem[i]>LB.elem[j],则当前先将LB.elem[j]插入到表LC中;若LA.elem[i]LB.elem[j],者当前先将LA.elem[i]插入到表LC中,如此进行下去,直到其中一个表被扫描完毕,然后再将未扫描的表中剩余的所有元素放到表LC中。

void merge(SeqList *LA,SeqList *LB,SeqList *LC)

{

 int i,j,k,l;

 i=0;j=0;k=0;

 while(i<=LA->last&&j<=LB->last)

 if(LA->elem[i]<=LB->elem[j])

    {

     LC->elem[k]=LA-elem[i];

     i++;k++;

    }

 else

    {

     LC->elem[k]=LB->elm[j];

     j++;k++;

    }

 while(i<=LA->last)/*当表LA有剩余元素时,则将表LA余下的元素赋给表LC*/

  {

   LC->elem[k]=LA->elem[i];

   i++;k++;

  }

 while(j<=LB->last)/*当表LB有剩余元素时,则将表LB余下的元素赋给表LC*/

  {

   LC->elem[k]=LB->elem[j];

   j++;k++;

  }

 LC->last=LA->last+LB->last+1;

}

算法       线性表的合并运算

算法分析:由于两个待归并的表LALB本身就是有序表,且表LC的建立采用的是尾插法建表,插入时不需要移动元素,因此算法的时间复杂度为0LA->last+LB->last)。

由上面的讨论可知,线性表顺序表示的优点是:

1)无需为表示结点间的逻辑关系而增加额外的存储空间(因为逻辑上相邻的元素其存储的物理位置也是相邻的);

2)可方便地随机存取表中的任意元素。

其缺点是:

1)插入或删除运算不方便,出表位的位置外,在表的其它位置上进行插入或删除操作都是必须移动大量的元素,其效率较低;

2)由于顺序表要求占用连续的存储空间,存储分配只能预先进行静态分配,因此当表长变化较大时,那一确定合适的存储规模。若按可能达到的最大长度预先分配表空间,则可能造成一部分空间长期闲置而得不到充分利用;若事先对表长估计不足,则插入操作可能是表长超过预先分配的空间而造成溢出。

 
好的,让我来为您解答这个问题。 首先,我们需要将数据整理R可处理的格式。这里,我将数据手动输入到R中,并将其保存为data.frame对象: ```R transportation <- data.frame( year = 2002:2021, railway = c(366.34, 375.14, 401.82, 419.16, 436.38, 447.02, 471.85, 487.8, 503.12, 518.25, 516.16, 522.77, 516.81, 532.08, 531.9, 527, 524.47, 511.09, 492, 476), highway = c(71.31, 67.32, 68.07, 67.88, 67.03, 66.3, 66.35, 63.34, 60.7, 51.92, 51, 49.2, 48.62, 46.52, 56.11, 54.45, 54.74, 54, 53, 45), water = c(20.27, 22.01, 29.42, 28.44, 27.44, 26.56, 27, 28.27, 29.03, 30.09, 30.35, 32.27, 31.09, 29.1, 34.06, 33.38, 33.5, 34.8, 37, 39), air = c(1482.14, 1510.68, 1773.71, 1751.13, 1724.75, 1716.97, 1669.62, 1616.08, 1598.11, 1573.69, 1547.57, 1508.83, 1464.21, 1497.47, 1502.85, 1484.65, 1479, 1470, 1442, 1432) ) ``` 接下来,我们可以使用ggplot2库绘制各种图形来更好地理解数据。 首先,我们可以使用ggplot2库绘制各种运输方式的时间序列折线图,代码如下: ```R library(ggplot2) ggplot(melt(transportation, id.vars = "year"), aes(x = year, y = value, color = variable)) + geom_line() + xlab("Year") + ylab("Passenger Distance") + ggtitle("Passenger Distance by Transportation Type") + theme(legend.position = "bottom") ``` 运行上面的代码,可以得到一个绘制了四种运输方式的时间序列折线图。 接着,我们可以使用ggplot2库绘制各种运输方式的密度图,代码如下: ```R ggplot(melt(transportation, id.vars = "year"), aes(x = value, fill = variable)) + geom_density(alpha = 0.5) + xlab("Passenger Distance") + ylab("Density") + ggtitle("Passenger Distance Density by Transportation Type") ``` 运行上面的代码,可以得到一个绘制了四种运输方式的密度图。 最后,我们可以使用ggplot2库绘制各种运输方式的箱线图,代码如下: ```R ggplot(melt(transportation, id.vars = "year"), aes(x = variable, y = value, fill = variable)) + geom_boxplot() + xlab("Transportation Type") + ylab("Passenger Distance") + ggtitle("Passenger Distance by Transportation Type") ``` 运行上面的代码,可以得到一个绘制了四种运输方式的箱线图。 以上是本次数据分析的R代码和图形,希望能够帮到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值