第十章 基本数据结构

一、栈与队列

10.1-2 说明如何在一个数组A[1..n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。要求PUSH和POP操作的运行时间为O(1)。

把数组的两端作为栈底,在入栈时向中间靠近。


10.1-6 如何用两个栈实现一个队列。

两个栈:S1,S2。

入队:向A栈入栈。

出队:若S2栈不为空,则从S2栈中出栈;

            若S2栈为空,S1栈不空,则从S1栈中把元素全部倒入S2栈(即S1栈元素依次出栈,并入S2栈)。

            若S2栈为空,S1栈为空,则栈空。

出队与入队的时间复杂度为O(1)。


10.1-7 如何用两个队列实现一个栈。

两个队列:Q1,Q2。

入栈:向Q1,Q2中非空的一方入队;若都为空则Q1,Q2都可。

出栈:若Q1非空,将Q1中元素(除队尾元素)依次出队,并入Q2。将Q1中队尾元素出队即出栈元素。

    若Q2非空,操作反向。

入栈O(1),出栈O(n)。


二、链表

10.2-1 单链表上的动态集合操作INSERT与DELETE操作能否在O(1)时间内实现。

若指定插入位置:O(n),若指定删除的值:O(n),因为需要遍历查询操作。

若指定在节点node后插入:O(1)。在指定节点node前插入:O(1),在node后插入,然后交换node与插入节点的key。

若删除指定节点node的后继O(1)。

若指定删除节点node:O(1),交换node与其后继的key,然后删除后继。

若删除指定节点node的前驱O(n),需要遍历。


10.2-2 用单链表L实现一个栈,要求PUSH与POP时间为O(1)。

入栈时,从表头插入。

出栈时,第一个元素出栈。


10.2-3 用单链表L实现一个队列,ENQUEUE和DEQUEUE时间为O(1)。

入栈时,从表尾插入。

出栈时,第一个元素出栈。


10.2-4 链表的查找过程每次循环需要两个测试:一是检查x!=NULL,二是检查x.key!=k。如何省略x!=NULL。

将哨兵的key置为x,在循环结束以后验证x是否是哨兵。


10.2-7 给出一个O(n)的非递归,实现对n个元素的单链表逆转,只能使用固定大小的存储空间。

定义一个新的头节点head‘,指向第一个元素。

将原头结点的后继置为NULL。

将新的链表head',从表头插入head。

一次循环O(n),一个头节点O(1)。


10.2-8 如何在每个元素仅使用一个指针x.np(而不是通常的两个指针next和prev)的情况下实现双向链表。

假设所有指针的值都可视为k位的整型数,且定义x.np = x.next XOR x.prev,即x.next和x.prev的k位异或。(NIL的值用0表示)

头节点head.next = head.prev(NIL) XOR head.np,因为head.prev=NIL为零,且head.np已知,因此可以得到head.next,

则可以依次得到1...n节点的信息: x.next = x.np XOR x.prev

x.prev = x.np XOR x.next

Search操作:需要遍历:依次计算x.next并比较x.key

Insert操作:...

Delete:...

如何在O(1)时间内实现逆转


三、指针和对象的实现

对象的多重数组表示:


对象的单数组表示:


<pre name="code" class="cpp">ALLOCATE-OBJECT()
if free == NIL
    error "out of space"
else x = free
    free = x.next
    return x

FREE-OBJECT(x)
    x.next=free
    free=x




10.3-4  紧凑的多重数组。

过程类似于一个数组实现两个栈。

假设表本身是紧凑的,有n个元素。

ALLOCATE-OBJECT()

栈顶元素加1,并把第n+1个空间拿出来。

FREE-OBJECT

若删除的是第n个元素,栈顶元素减1即可。

若删除的是[1..n-1]元素,假设是第k个,则在删除该元素后,将栈顶元素置于之前的空位。

然后修改k-1的next与k+1的prev,并且修改n-1的next。

( L[k-1].next = k+1;

     L[k+1].prev = k-1;

     L[n-1].next = k; )


10.3-5 设L是一长度为n的双链表,存储在长度为m的数组key、next和prev中。假设这些数组由维护双链自由表F的两个过程ALLOCATE-OBJECT和FREE-OBJECT来操纵。进一步假设在数组的m个元素中,有n个在表L上和有m-n个在自由表F上,移动L中的元素,使他们占有数组中的1, 2, ..., n位置,同时调节自由表F使之保持正确,并占有数组位置n+1, n+2, ..., m。所给出的运行时间应该是Θ(n),且只能使用固定量的额外空间。

依次交换L与数组M。假设数组为M。

</pre><pre name="code" class="cpp"><pre name="code" class="cpp">if v1.prev != null
    v1.prev.next = v2; 
  if v2.prev != null
    v2.prev.next = v1;
  if v2.next != null
    v2.next.prev = v1;
  temp = v1.key;
  v1.key = v2.key;
  v2.key = temp;
}



排序作业 选择题(每题2分,共22分)。 1.若表R在排序前已按键值递增顺序排列,则(   )算法的比较次数最少。 A.直接插入排序            B.快速排序     C.归并排序                D.选择排序 2.对各种内部排序方法来说,(   )。 A.快速排序时间性能最佳                             B.归并排序是稳定的排序方法 C.快速排序是一种选择排序                          D.堆排序所用的辅助空间比较大 3.  排序算法的稳定性是指(   )。 A.经过排序之后,能使值相同的数据保持原顺序中的相对位置不变。 B.经过排序之后,能使值相同的数据保持原顺序中的绝对位置不变。 C.排序算法的性能与被排序元素的数量关系不大 D.排序算法的性能与被排序元素的数量关系密切 4. 如下序列中,(   )序列是大顶堆。 A.  {4,5,3,2,1}               B.  {5,3,4,1,2}        C.  {1,2,3,4,5}               D.  {1,2,3,5,4} 5. 若将{3,2,5,4,1}排为升序,则实施快速排序一趟后的结果是(   )(其中,枢轴记录取首记录)。 A.  {1,2,3,4,5}                  B.  {1,2,4,5,3}        C.  {1,3,5,4,2}                  D.  {2,5,4,1,3} . 若将{1,2,3,4,5,6,7,9,8}排为升序,则(   )排序方法的“比较记录”次数最少。 A.  快速排序                   B.  简单选择排序     C.  直接插入排序               D.  冒泡排序 7. 若将{5,4,3,2,1}排为升序,则(   )排序方法的“移动记录”次数最多。 A.  快速排序                                B.  冒泡排序 C.  直接插入排序                       D.  简单选择排序 8. 用简单选择排序将顺序表{2,3,1 ,3′,2′}排为升序,实施排序1趟后结果是{1 ,3,2 ,3′,2′},则排序3趟后的结果是(   )。 A.  {1 ,2,3 ,3′,2′}                       B.  {1 ,2 ,2′,3 ,3′} C.  {1 ,2′,2 ,3 ,3′}                      D.  {1 ,2 ,2′,3′,3 } 9.下列排序算法中,(    )排序在某趟结束后不一定选出一个元素放到其最终的位置上。 A.选择             B.冒泡           C.归并           D.堆 10.下列排序算法中,稳定的排序算法是(  )。 A.堆排序                B.直接插入排序   C.快速排序              D.希尔排序 11.堆排序的时间复杂度是(    )。 A.O(n*n)                 B.O(n*log n)       C.O(n)                   D.O(log n) 填空题(每空4分,共4分)。 对n个元素进行归并排序,空间复杂度为         。 综合题(共24分)。 1. (共12分)有一组待排序的关键字如下: (54,38,96,23,15,72,60,45,83) 分别写出希尔排序(d=5)、快速排序、堆排序、归并排序第一趟升序排序后的结果(其中堆排序的第一趟指序列完成初始建堆、将堆顶元素置为最末位置后其余元素调整为堆的结果)(每个3分)。 希尔排序:   快速排序: 堆排序: 归并排序:  2. (共12分)已知数据序列为(12,5,9,20,6,31,24),对该项数据序列进行排序,分别写出直接插入排序、简单选择排序、快速排序、堆排序、二路归并排序及基数排序第一趟升序排序结果(其中堆排序的第一趟指序列完成初始建堆、将堆顶元素置为最末位置后其余元素调整为堆的结果)(每个2分)。 直接插入排序: 简单选择排序: 快速排序: 堆排序: 二路归并排序: 基数排序:    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值