免费智能真题库 > 历年试卷 > 软件设计师 > 2010年上半年 软件设计师 上午试卷 综合知识
  第65题      
  知识点:   算法分析基础   指针
  关键词:   循环链表   指针   链表        章/节:   计算机软件知识       

 
若对一个链表最常用的操作是在末尾插入结点和删除尾结点,则采用仅设尾指针的单向循环链表(不含头结点)时,(65)。
 
 
  A.  插入和删除操作的时间复杂度都为O(1)
 
  B.  插入和删除操作的时间复杂度都为O(n)
 
  C.  插入操作的时间复杂度为O(1),删除操作的时间复杂度为O(n)
 
  D.  插入操作的时间复杂度为O(n),删除操作的时间复杂度为O(1)
 
 
 

 
  第64题    2018年下半年  
   49%
在一条笔直公路的一边有许多房子,现要安装消防栓,每个消防栓的覆盖范围远大于房子的面积,如下图所示。现求解能覆盖所有房子的..
  第16题    2014年下半年  
   45%
模块A、B和C都包含相同的5个语句,这些语句之间没有联系。为了避免重复把这5个语句抽取出来组成一个模块D,则模块D的内聚类型为(..
  第65题    2010年下半年  
   43%
(65)不能保证求得0-1背包问题的最优解。
  相关试题:链表          更多>  
 
  第59题    2020年下半年  
   28%
在线性表L中进行二分查找,要求L( )。
  第51题    2013年上半年  
   28%
采用顺序表和单链表存储长度为n的线性序列,根据序号查找元素,其时间复杂度分别为 (51)。
  第58题    2020年下半年  
   56%
通过元素在存储空间中的相对位置来表示数据元素之间的逻辑关系,是( )的特点。
   知识点讲解    
   · 算法分析基础    · 指针
 
       算法分析基础
               时间复杂性
               算法的时间复杂度分析主要是分析算法的运行时间,即算法所执行的基本操作数。即使对相同的输入规模,数据分布不相同也决定了算法执行不同的路径,因此所需要的执行时间也不相同。根据不同的输入,将算法的时间复杂度分为3种情况。
               (1)最佳情况。使算法执行时间最少的输入。一般情况下,不进行算法在最佳情况下的时间复杂度分析。应用最佳情况分析的一个例子是已经证明基于比较的排序算法的时间复杂度下限为Ω(nlgn),那么就不需要白费力气去想方设法将该类算法改进为线性时间复杂度。
               (2)最坏情况。使算法执行时间最多的输入。一般会进行算法在最坏时间复杂度的分析,因为最坏情况是在任何输入下运行时间的一个上限,它提供了一个保障,情况不会比这更糟糕。另外,对于某些算法来说,最坏情况还是相当频繁的。而且大致上看,平均情况通常与最坏情况的时间复杂度一样。
               (3)平均情况。算法的平均运行时间。一般来说,这种情况很难分析。举个简单的例子,现要排序10个不同的整数,输入就有10!种不同的情况,平均情况的时间复杂度要考虑每一种输入及其该输入的概率。平均情况分析可以按以下3个步骤进行。
               ①将所有的输入按其执行时间分类。
               ②确定每类输入发生的概率。
               ③确定每类输入的执行时间。
               下式给出了一般算法在平均情况下的复杂度分析,即
               
               式中,pi为第i类输入发生的概率;ti为第i类输入的执行时间,输入分为m类。
               渐进符号
               渐进符号有以下几种。
               (1)Ο记号。给出一个函数的渐进上界。
               (2)Ω记号。给出一个函数的渐进下界。
               (3)Θ记号。给出一个函数的渐进上界和下界,即渐进确界。
               递归式
               从算法的结构上看,算法可以分为非递归形式和递归形式。非递归算法的时间复杂度分析较简单,本小节主要讨论递归算法的时间复杂度分析方法。
               (1)展开法。将递归式中等式右边的项根据递归式进行替换,称为展开。展开后的项被再次展开,如此下去,直至得到一个求和表达式及其结果。
               (2)代换法。这一名称来源于当归纳假设用较小值时,用所猜测的值代替函数的解。用代换法解递归式时需要两个步骤:猜测解的形式;用数学归纳法找出使解真正有效的常数。
               (3)递归树法。递归树法弥补了代换法猜测困难的缺点,它适于提供"好"的猜测,然后用代换法证明。在递归树中,每一个节点都代表递归函数调用集合中每一个子问题的代价。将树中每一层内的代价相加得到一个每层代价的集合,再将每层的代价相加得到递归式所有层次的总代价。当用递归式表示分治算法的时间复杂度时,递归树的方法尤其有用。
               (4)主方法。也称为主定理,给出求解以下形式的递归式的快速方法,即
               T(n)=aT(n/b)+f(n)
               式中,a≥1和b>1是常数;f(n)是一个渐进的正函数。
 
       指针
        指针是C语言中最为重要也是最难的一个关键点,很多数据结构都是基于指针实现的,如链表、链式队列、链栈、二叉树等。
        所谓指针,就是一个用来存储地址的变量。这可谓指针的本质,需要牢记。
        也许你会很纳闷,指针为什么一定要定义成某类型(int、char)呢?指针不能就是"指针类型"吗?接触过汇编的人就很容易理解为什么。存储单元的单位是字节,就是说一般地址是按字节编址的,对一个地址进行操作(读取或赋值)就要指明是对单字节(不用特别声明)、两字节(WORD PTR),还是双字节(四字节,DWORD PTR)进行操作。同样,指针是存储地址的,即指针就是一个地址,自然也要说明其类型;而且,这个类型还关乎指针自加自减时真正加减的字节数。
        顺便说一下,数组名也是指针。数组在申请空间时,数组名存储该存储空间的首地址。注意:数组名存储的是地址,因此也是指针,只是该指针一旦赋值后就不能修改,即所谓常指针。当直接输出数组名时,输出的其实是数组的首地址。这样,当形参声明为指针时,亦可将数组名作为实参进行传递。因此,可以用指针的方式访问数组中的元素,如下例采用指针的方式遍历输出数组。
        
        当指针作为函数参数传递时,需要特别注意C语言中的"值"传递原则。下例中的函数希望为指针p申请空间,但不能达到目的,为什么呢?
        
        归根结底,C函数的形参与实参之间只是"值传递":当形参是普通变量时,传递的是实参的值;当形参是指针时,传递的是指针变量的值,即某变量的地址,这样可以通过指针成功地改变其所指单元的值,但自身的改变不会传回给实参。上例可改为:
        
        注意:这样修改后,调用时实参应该是指针的"地址"(或指向指针的指针)。这样即上面所说的可以改变指针所指单元的值,因此可达到预期目的。
   题号导航      2010年上半年 软件设计师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第65题    在手机中做本题