《数据结构与算法 Python精品课程》第二章:算法分析

《数据结构与算法 Python精品课程》第二章:算法分析
《数据结构与算法 Python精品课程》第二章:算法分析

?.算法分析

2.1.?标

·了解为何算法分析的重要性

·能够??“O ”表?法来描述算法执?时间

·了解在Python 列表和字典类型中通?操作??“O ”表?法表?的执?时间

·了解Python 数据类型的具体实现对算法分析的影响

·了解如何对简单的Python 程序进?执?时间检测

2.2.什么是算法分析

计算机初学者经常将??的程序与他?的?较。你也可能注意到了电脑程序常常看起来很相似,尤其是那些简单的程序。?个有趣的问题出现了,当两个看起来不同的程序解决相同的问题时,?个程序会优于另?个吗?

为了回答这个问题,我们需要记住的是,程序和它所代表的基本算法有着重要差别。在第?章中我们说到,算法是问题解决的通?的分步的指令的聚合。这是?种能解决任何问题实例的?法,?如给定?个特定的输?,算法能产?期望的结果。从另???看,?个程序是?某种编程语?编码后的算法。同?算法通过不同的程序员采?不同的编程语?能产?很多程序。

为进?步探究这种差异,请阅读接下来展?的函数。这个函数解决了?个我们熟知的问题,计算前n 个整数的和。其中的算法使?了?个初始值为0的累加变量的概念。解决?案是遍历这n 个整数,逐个累加到累加变量。

代码2.1前n 个正整数求和(active1

现在看下?的foo函数。可能第?眼看上去?较奇怪,但是进?步观察你会发现,这个函数所实现的功能与之前代码2.1中的函数基本相同。看不太懂的原因是糟糕的编码。我们没有使?好的变量命名来增加可读性,并且在累加过程中使?了多余的赋值语句。

回到前?我们提出的问题:是否?个程序会优于另?个?答案取决于你??的标准。如果你关?可读性,那么sum_of_n函数肯定?foo函数更好。实际上,在你的编程?门课程上你可能见过很多这样的例?,因为这些课程的?标之?就是帮助你编写更具可读性的程

代码2.2 另?种前n个正整数求和(ac ve2)

def foo(tom):

fred=0

for bill in range(1,tom+1):

barney = bill

fred = fred + barney

return fred

print (foo(10))

序。然?,在这门课程中,我们主要感兴趣的是算法本?的特性。(我们当然希望你可以继续努?写出更具可读性的代码。)

算法分析主要就是从计算资源的消耗的?度来评判和?较算法。我们想要分析两种算法并且指出哪种更好,主要考虑的是哪?种可以更?效地利?计算资源。或者占?更少的资源。从这个?度,上述两个函数实际上是基本相同的,它们都采?了?样的算法来解决累加求和问题。

从这点上看,思考我们通过计算资源这个概念真正想表达的是什么是?常重要的。有两种?法来看待它。?种是考虑算法解决问题过程中需要的存储空间或内存。问题解决?案所需的存储空间通常是由问题本?情况影响的,然?,算法常常有本?特定的空间需求,在这种情况下,我们需要很??地解释这种变化。

作为空间需求的?个可替代物,我们可以?算法执?所需时间来分析和?较算法。这种?法有时被称为算法的“执?时间”或“运?时间”。我们可以检测sum_of_n函数的运?时间的?种?法是做基准分析。这意味着我们将监测程序运?出结果所需要的时间。在Python中,我们可以考虑我们使?的系统通过标定开始时间和结束时间来作为标准衡量?个函数。在 me模块有?个叫 me的函数,它能返回在某些任意起点以秒为单位的系统当前时间。通过在开始和结束时两次调?这个函数,然后计算两次时间之差,我们就可以得到精确到秒(?多数情况为分数)的运?时间。

这个编码展?了在原始sum_of_n函数的求和前后插?时间调?的情况。这个函数返回?个元组,包括累加和及计算所需时间(以秒为单位)。如果我们连续运?这个函数5次,每次都完成1到10,000的累加,我们得到的结果如下:

>>>for i in range(5):

Print(“Sum is %d required %10.7f seconds”% sum_of_n_2(10000))

Sum is 50005000 required 0.0018950 seconds

Sum is 50005000 required 0.0018620 seconds

Sum is 50005000 required 0.0019171 seconds

Sum is 50005000 required 0.0019162 seconds

Sum is 50005000 required 0.0019360 seconds

>>>

我们发现这个时间是相当?致的,执?这段代码平均需要0.0019秒。那么如果我们累加到100,000会怎么样呢?

?是这样,每次运?所需时间虽然更长,但?常?致,平均约为之前的10倍,进?步累加到1,000,000我们得到:

在这种情况下,平均时间再次约为之前的10倍。

现在考虑接下来的编码,它展?了?种解决求和问题的不同的?法。这个函数,sum_of_n_3,利??个封闭?程去完成?迭代的累加到n 的计算。

代码2.3 ?迭代求和 >>>for i in range(5):

Print(“Sum is %d required %10.7f seconds”% sum_of_n_2(100000))

Sum is 5000050000 required 0.0199420 seconds

Sum is 5000050000 required 0.0180972 seconds

Sum is 5000050000 required 0.0194821 seconds

Sum is 5000050000 required 0.0178988 seconds

Sum is 5000050000 required 0.0188949 seconds

>>> >>>for i in range(5):

Print(“Sum is %d required %10.7f seconds”% sum_of_n_2(1000000)) Sum is 500000500000 required 0.1948988 seconds

Sum is 500000500000 required 0.1850290 seconds

Sum is 500000500000 required 0.1809771 seconds

Sum is 500000500000 required 0.1729250 seconds Sum is 500000500000 required 0.1646299 seconds

>>>

def sum_of_n_3(n):

return (n * (n +1)) / 2

print (sum_of_n_3(10))

如果我们对sum_of_n_3做同样的基准检测,n赋5个不同的值(10000,100000,1000000,10000,000和100000000),我们得到的结果如下:

Sum is 50005000 required 0.00000095 seconds

Sum is 5000050000 required 0.00000191 seconds

Sum is 500000500000 required 0.00000095 seconds

Sum is 50000005000000 required 0.00000095 seconds

Sum is 5000000050000000 required 0.00000119 seconds

对于输出我们需要关注两个关键点。第?,这种算法的运?时间?之前任何例?都短很多。第?,不管n取值多少运?时间都?常?致。看上去sum_of_n_3的运?时间?乎不受需要累计的数?的影响。

但是这个基准测试真正告诉了我们什么?直观上,我们可以看到迭代算法似乎做了更多的?作,因为?些程序步骤被重复执?,这可能就是它需要更长时间的原因。此外,迭代算法所需要的运?时间似乎会随着n值的增??增?。然?,还有?个问题。如果我们在不同的计算机上运?相同的函数,或者使?不同的编程语?,我们可能会得到不同的结果。如果计算机?较?旧,运?sum_of_n_3可能还需要更长的时间。

我们需要更好的?法来衡量算法运?的时间。基准测试技术可以计算世界运?时间,然?它并没有真的为我们提供?个有?的度量指标。因为这个指标依赖于特定的机器、程序、运?时段、编译器和编程语?。相反,我们需要?个不依赖程序或者使?的机器的指标。这种度量指标将有助于判断算法优劣,并且可以?来?较算法的具体实现。

2.2.1. ?“O”表?法

当我们试图?执?时间作为独?于具体程序或计算机的度量指标去描述?个算法的效率时,确定这个算法所需要的操作数或步骤数显得尤为重要。如果把每??步看作?个基本计量单位,那么?个算法的执?时间就可以表达为它解决?个问题所需的步骤数。制定?个合适的基本计量单位是?个很复杂的问题,并且还要依赖于算法具体是怎样执?的。

当我们?较上述?个求和算法时,统计执?求和的赋值语句的次数可能是?个好的基本计量单位。在sum_of_n函数中,赋值语句的数量是1(the_sum=0)加上n(我们执?the_sum=the_sum+i 的次数)。

我们可以??个叫T的函数来表?赋值语句数量,如上例中T(n) = 1 + n。变量n?般指“问题的规模”,可以理解为当要解决?个规模为n,对应n+1步操作步数的问题,所需要的时间为T(n)。

在前?节给出的求和函数中,?求和的项数来代表问题的规模是合理的。可以认为求前100000项整数的问题规模?于求前1000项整数。因此,求解?规模问题所需时间显然?求解?规模要多?些。那么我们的?标就是寻找程序的运?时间如何随着问题规模变化。

计算机科学家对这种算法分析技术进?了更为深远的思考。有限的操作次数对于T(n)函数的影响,并不如某些占据主要地位的操作部分重要。换?之,当问题规模越来越?时,T(n)函数中的?部分?乎

掩盖了其他部分对于函数的影响。最终,这种起主导作?的部分?来对函数进??较。数量级函数?来描述当规模n增加时,T(n)函数中增长最快的部分。这种数量级函数?般被称为?“O”表?法,记作O(f(n))。它提供了计算过程中实际步数的近似值。函数f(n)是原始函数T(n)中主导部分的简化表?。

在上?的例?中,T(n) = 1 + n。当n增?时,常数1对于最后的结果来说越来越不重要。如果我们需要T(n)的近似值,我们可以忽略常数1,直接认为T(n)的运?时间就是O(n)。值得明?的是,1对T(n)固然重要,但是当n增加到很?时,忽略1得到的近似值同样精确。

另?个例?,假设某个算法程序实际步骤的精确值是T(n) = 5n2+27n+1005。当n很?时,?如为1或2时,常数1005似乎对函数起到主要作?。但是当n越来越?时,n2项则起到最主要的作?。实际上,当n?常?时,其余两项对于最终的结果已经??轻重了。与上个例?相似,当n越来越?时,我们就可以忽略其余项,只关注?5n2来代表T(n)的近似值了。同样,系数5的作?也会越来越?,也可以忽略。我们就会说函数T(n)的数量级f(n) = n2,即O(n2)。

尽管前?求和函数的例?没有体现,但我们还是注意到有时算法的运?时间还取决于具体数据?不仅仅是问题规模。对于这种算法,我们把它们的执?情况分为最好的情况,最坏的情况和平均情况。某个特定的数据集会使算法程序执?情况极差,这就是最坏的情况。然?另?个不同的数据集却能使这个算法程序执?情况极佳。不过,?多数情况下,算法程序的执?情况都介于这两种极端情况之间,也就是平均情况。因此要理解不同情况之间的差别,不被某些特殊情况所误导。

在你之后的算法学习中,你会不断见到表2.1所?的常见数量级函数。为了确定这些函数中哪些在T(n)占主导作?,就要在n增?时对它们进??较。

表格2.1常见函数的?“O”表?法

图2.1 常见?“O”函数的图像

图2.1是表2.1中常见函数的图像。注意到当n很?时,函数之间不易区分,很难说谁占主导。然?,当n增?时,就能观察到明显的区别,很容易进??较。

最后再举?个例?,假如我们有如下所?的?个Python代码?段,。尽管这个程序实现不了什么功能,但能指导我们如何对代码进?执?分析。

代码2.8

我们发现,任务操作总数分为四项。第?项是常数3,代表程序开头的三个赋值语句。第?项是3n2,因为嵌套迭代(循环结构)中有三个赋值语句分别被重复执?了n2次。第三项是2n,表?两个赋值语句被重复执?了n次。最后?项是常数1,代表最后的赋值语句。我们得到T(n) = 3+3n2

+2n+1 = 3n2+2n+ 4。看到指数项,我们?然地发现n2项占主导,当n增?时,其他项和主导项的系数都可以忽略,所以这个代码?段的数量级就是O(n2)。

图2.2 常见的?“O”函数与T(n)函数对?

表2.2表?常见的?“O”函数与前?讨论到的T(n)进??较。起初T(n)函数?三次函数??些。但是,当n增?时,三次函数很快超过了T(n)。不难发现,随着n增?,T(n)函数越来越接近?次函数。

?试??

1.编写两个Python函数来寻找?个列表中的最?值。函数?将列表中的每个数都与其他数作?较,数量级是O(n2).函数?的数量级是O(n)。

2.2.2变位词检测

经典的字符串变位词检测问题是?较不同数量级函数算法的?个典型例?。如果?个字符串是另?个字符串的重新排列组合,那么这两个字符串互为变位词。?如,”heart”与”earth”互为变位词,”python”与”typhon”也互为变位词。为了简化问题,我们设定问题中的字符串长度相同,都是由26个?写字母组成。我们需要编写?个接受两个字符串,返回真假,代表是否是?对变位词的布尔函数。

解法1:检查标记

变位词问题的第?种解法是检查第?个字符串中的所有字符是不是都在第?个字符串中出现。如果能够把每?个字符都“检查标记”?遍,那么这两个字符串就互为变位词。检查标记?个字符要?特定值None来代替,作为标记。然?,由于字符串不可变,?先要把第?个字符串转化成?个

列表。第?个字符串中的每?个字符都可以在列表的字符中去检查,如果找到,就?None代替以?标记。

代码2.9

为了分析这个算法,我们要注意到s1中n个字符的每?个都会引起?个最多迭代到s2列表中第n个字符的循环。(考虑最坏的情况)列表中的n个位置各会被寻找?次去匹配s1中的某个字符,那么执?总数就是从1到n的代数和。我们之前提到过它可以这样表?:

当n变?时,n2相对于n将占主要部分,并且1/2可以忽略。因此,这个算法的复杂度是O(n 2)。

Def anagram_solu on2(s1,s2):

A_list1=list(s1)

A_list2=list(s2)

A_list1.sort()

A_list2.sort()

Pos=0

Matches=True

While pos < len(s1) and matches:

If a_list1[pos] == a_list2[pos]:

Pos=pos + 1

Else:

Matches=False

Return matches

Print(anagram_solu on2(‘abcde’,’edcba’))

代码xxx 解法?

解法?:排序?较法

尽管s1和s2并不相同,但若为变位词它们?定包含完全?样的字符,利?这?特点,我们可以采?另?种?法。我们?先从a到z给每?个字符串按字母顺序进?排序,如果它们是变位词,那么我们将得到两个完全?样的字符串。此外,我们可以先将字符串转化为列表,再利?Python中内建的sort?法对列表进?排序。下?代码展?了这种?法。

第?眼看上去你可能会认为这个算法的复杂度是O(n),毕竟排序后只需要?个简单的循环去?较n 个字符。然?对Python内建的sort?法的两次使?并?毫?消耗。事实上,正如我们在后?的章节中将要看到的,排序?法的复杂度往往都是O(n2)或者O(n㏒n),所以排序贡献了这个函数主要的循环操作。最终,这个算法和排序的复杂度相同。

解法三:暴?匹配算法

解决这个问题的典型暴??法是尝试所有的可能。为了解决变位词检测问题,我们可以简单地构造?个由s1中所有字符组成的所有可能的字符串的列表,并检查s2是否在列表中。然?这个?法有?个困难之处。当我们构造由s1中字符组成的所有可能字符串时,第?个字符有n个可能,第?个字符有n-1种可能,第三个则是n-2种,以此类推。所有可能字符串的总数是n*(n-1)*(n-

2)*...*3*2*1。也就是n!。尽管这些字符串中的?些可能是重复的,但程序不能提前预见到,所以还是会产?n!个字符串。

事实上当n变?时,n!增长的?2?还要快。如果s1有20个字符,将会有

20!=2,432,902,008,176,640,000个可能的字符串。如果我们每秒进??个尝试,这将会花费我们

77,146,816,596年去尝试所有列表。这?概不是?个好?法。

解法四:计数?较法

解决变位词问题的最后?个?法利?了任何变位词都有相同数量的a,相同数量的b,相同数量的c等等。为判断两个字符串是否为变位词,我们?先计算每?个字符在字符串中出现的次数。由于共有26个可能的字符,我们可以利?有26个计数器的列表,每个计数器对应?个字符。每当我们看到?个字符,就在相对应的计数器上加?。最终,如果这两个计数器列表相同,则这两个字符串是变位词。下?展?了这种?法:

代码xxx 计数?较法

Def anagram_solu on4(s1,s2):

C1 = [0] * 26

C2 = [0] * 26

For i in range(len(s1)):

Pos = ord(s1[i]) - ord(‘a’)

C1[pos] = c1[pos] + 1

For i in range(len(s2)):

Pos = ord(s2[i]) - ord(‘a’)

C2[pos] = c2[pos] + 1

J = 0

S ll_ok = True

Wile j < 26 and s ll_ok:

If c1[j] == c2[j]:

J = j+1

Else:

S ll_ok=False

Return s ll_ok

Print(anagram_solu on4(‘apple’,’pleap’))

同样,这个?法有?些循环操作。然?不同于第?个?法,所有循环都不是嵌套的。前两个计数字符数的循环都是n重。?因为字符串中总共有26种可能的字符,第三个?较两个计数列表的循环总是执?26步。把它们全部加起来就得到T(n)=2n+26,也就是O(n)。这样,我们就找到了?个解决这个问题的线性复杂度的算法。

在结束这个问题之前,我们需要讨论?些关于空间需求的事情,尽管最后?个?法可以以线性的时间复杂度来运?,但是这是以使?了额外的空间来存储两个计数器列表为代价的。换句话说,这个算法牺牲了空间来换取时间。

这是?个常见的现象。很多情况下你需要在时间和空间的权衡中做出选择。在这个例?中,额外的空间消耗并不?道。但是如果可能的字母多达?百万种,这将是?个问题。作为?个计算机科学家,当要做出算法选择时,需要你根据具体问题来决定利?计算资源的最好?式。

???试

Q-1:判断下列代码段的?O级别

Q-2:判断下列代码段的?O级别

Q-3:判断下列代码段的?O级别

2.3 PYTHON 数据结构的性能

既然?家已经?体了解了?O表?法以及不同算法间复杂度的差异,在这?节我们的?标是来讲授?些关于Python中列表和字典操作的?O复杂度的知识。然后我们将展??些计时操作,以此来阐明在各种数据结构上使?某个操作的优缺点。这对你去理解这些Python 数据结构的性能是?常重要的,因为随着我们在本书接下来的部分学习其他数据结构,它们将是我们需要使?到的构件。在本节中,我们不打算去解释这些性能为什么是这样的问题,不过在接下来的章节中,我们将看到?些列表和字典的实现?式以及它们的操作是如何依赖于这些实现?式的。

2.3.1 列表LIST

当要执?列表数据结构时,Python 的编写者有多种?式去实现这个?的。这些?式中的每?个都对列表运?的速度产?影响。为了做出正确的选择,他们着眼于?们最经常使?的列表数据结构的?式,然后完善他们的列表操作?段,所以常?的操作是?常快的。当然,他们也会尽?提?那些不常?操作的速度。但是当不得不去做?个权衡处理时,不常?操作常常被牺牲?来?持那些更常?操作。

索引和分派到?个索引位置是两个常见操作,它们?论列表多?,操作花费的时间都相同。当?个操作的速度像这样不依赖于列表的??,那么这个操作就是O(1)。

另?个?常常?的程序操作是去扩充?个列表。这有两种?式去?成?个更长的列表。你可以?“append”操作或者串联运算符。这个“append”操作是O(1)。然?,串联运算符是O(k),这?k 是指正在被连接的列表的??。了解它对你?常重要,因为通过选择?作的正确?具可以使你的程序更加有效。

让我们来看?下四种不同的?法来?成从0到n的列表。?先,我们尝试?for 循环体通过串联?成?个列表,然后我们可以?“append”代替串联操作。接下来,我们可以使?列表解析来?成?个列表。最后,也许是最明显的?法,通过列表结构体的访问来使?“range”的功能。下?展?了?成列表四种?法的代码。

为了获取我们程序运?所需要的时间,我们需要引?Python中的 meit模块。这个 meit模块是被设计成在?个持续稳定的环境中,尽可能使?与计算机操作系统相似的计时机制,让Python的开发者实现跨平台运?时间的测量。

为使? meit模块,你需要创建?个Timer对象,这个对象的参数是两个Python语句。第?个参数是你想进?计时的Python语句;第?个参数是建?这次测试你将要运?的语句。 meit模块就将测量运?这个语句?定次数多花费的时间。如果不加要求, meit模块的默认运?次数是?百万次。运?结束后,它将以浮点数的形式返回运?的总时间(单位:秒)。但是,由于它默认运?语句?百万次,当你执?程序?次时,它返回的结果是以微秒为单位的。你也可以在 meit中附上?个名叫number的参数,这样你就可以指定程序被执?的次数。下图将展?对我们的每?个程序执?1000次,分别需要花费的时间。

在上?的实验中,我们进?测试的语句是调?函数到test1(),test2(),等等。这个设置语句可能会让你感觉到?分奇怪,所以让我们更加细致的考虑它。你可能对from,import语句?分熟悉,但这个语句常常被运?在Python程序?本的开头。在这种情况下,from __main__ import test1这个语句将来?__main__命名空间的函数test1调?到为进?时间测量?建?的 meit命名空间中去。Timeit模块这样做是以为它需要在某中特定的环境中运?,这种环境要求将你可能已经?成的,或已经偏离的,或可能以某种不可预测的?式对你程序的运?产??扰的变量进?整理。

从上?的实验中,我们可以清楚的看到,运?时间为0.30毫秒的append操作明显快于运?时间为6.54毫秒的串联操作。在上?的实验中,我们还展?了创建?个列表(list)的两种额外的?式:调?range进?列表创建和列表推导。我们惊喜的发现列表推导的速度??是在for循环中逐个append操作的两倍。

关于这个?实验的最后?个结论是,上?我们所看到的所有运?时间,都包括了进?访问测试所耗费的时间。但我们可以认定,在这四种情形中,访问操作所耗费的时间是完全相同的,所以我们对这四种操作运?时间的?较是有意义的。它不能准确的说串联操作耗时6.54毫秒,应该说串联操作测试函数耗时6.54毫秒。作为练习,你可以测试调??个空函数所耗费的时间,并把这个时间从上?测试得出的结果中减去。

既然我们已经了解了如何对操作进?具体的测量,那么你可以看图表2.2,了解所有列表基本操作的?O效率。在你对图表2.2进?仔细思考后,可能会对pop操作的两个不同的时间感到疑惑。当pop操作每次从列表的最后?位删除元素时复杂度为O(1),?将列表的第?个元素或中间任意?个位置的元素删除时,复杂度则为O(n)。这样迥然不同的结果是由Python对列表的执??式造成的。在Python的执?过程中,当从列表的第?位删除?个元素,其后的每?位元素都将向前挪动?位。你可能觉得这种操作很愚蠢,但当你仔细看完图表2.2后会发现这种执??式会让index索引操作的复杂度降为O(1)。这种运?时间的权衡是Python执?者认为正确?效的。

为进?步论证这些操作表现的差异性,让我们? meit模块进?另?个实验。我们的?标是能够核实以下两种pop操作的表现,第?种是在?个已知长度的列表中从列表的末端删除元素,?第?种则是从这个列表的开头删除元素。我们还想测量出对不同长度的列表进?pop操作的时间。我们想要看到的是,随着列表长度的增加,从列表末端删除元素的pop操作时间保持稳定,?从列表开头删除元素的pop操作则随着长度的增加?增加。

下?的代码展?了对这两种pop操作的区别进?测量的?个尝试。正如你从第?个例?中看见的那样,从列表末尾删除的pop操作耗时0.0003毫秒,然?从列表开头删除则耗时4.82毫秒。对于?个有2百万个元素的列表,两种操作耗费的时间相差16000倍。

对于这个代码,我们有很多地?值得去注意。第?点就是from __main__ import x语句。尽管我么并没有定义?个函数,但我们仍然想在测试中可以使?列表对象x。这种?式使我们可以对单个pop操作进?计时,并且使我们得到对单个操作最准确的测量时间。因为计时操作执?1000次,所以必须指出的是在循环过程中每进??次操作,列表都将缩短?位。但是由于起始列表有两百万个元素,进?1000次操作仅减少了0.05%,这种改变是很微?的,?乎?影响。

尽管第?个测试证明了pop(0)操作确实?pop()操作要慢,但并不能确切的说明pop(0)复杂度为O(n)?pop()的复杂度为O(1)。为了证实这个结果,我们需要综合不同列表长度的测试结果。

图2.3 pop 与 pop(0) 操作性能的?较

图 2.3展?了我们实验的结果。可以看到,随着列表的逐渐变长,pop(0)所需要的时间也同样增加。但是pop() 的时间却始终保持基本不变。不出所料,这正是O(n)与O(1) 算法的?为。

我们?实验的误差可能来源于我们计算机上同时运?的其他进程。当我们测量时间时,这些进程可能使我们的代码运?变慢。即使我们试图最?化计算机上其他事情的影响,?时上也总是存在着?定的不确定度。这就是为什么我们要将测试循环上千次——为了获得?够的信息以使结果具有?够的可信度。

2.3.2字典

Python中第?个主要的数据结构是字典。回想?下,字典与列表的不同之处在于你需要通过?个键(key)来访问条?,?不是通过?个坐标。在本书的后?我们会介绍多种字典的实现?式,不过现在我们要说的重点是,字典条?的访问和赋值都是O(1)的时间复杂度。字典的另?个重要的操作是所谓的“包含”。检查?个键是否存在于字典中也只需O(1)的时间。其他字典操作的时间效率都已经在表2.3中列出。需要注意的是,这?所列出的都是平均时间复杂度。在?些罕见的情况下,包含、访问和赋值都可能退化为O(n),不过这将是我们之后研究字典的实现时才会讨论的内容。

表格2.2字典操作效率表(?O表?法)

我们的最后?个性能实验将会对?列表和字典的包含操作的效率。在这?过程中我们将会验证列表的包含操作是O(n),为字典的是O(1)。这个实验很简单,我们将?成?个?然数(range)的列表,然后随机地选取?个数字,检查其是否在列表中。如果我们之前的效率表是正确的话,列表越?,所?的时间也就越长。

然后我们将在?个以数字为键的字典上重复这个实验。这次我们会发现检查?个数字是否在字典中要快得多,?且即使字典变?,检查所?的时间也保持不变。

下?的代码实现了这个?较。请注意我们实际上是在做完全相同的操作。区别仅仅在于在第7?,x是?个列表,?在第9?的x是?个字典。

代码xxx对?列表和字典的包含操作的效率

图2.4总结了我们的结果。可以看到,字典始终?列表快,对于最?的只包含10, 000个元素的情况,字典?列表快89.4倍,?在最?的990, 000个元素时,字典要快11603倍!另外可以注意到,随着列表的增?,其包含操作所需要的时间是线性增长的,这证实了我们之前关于其时间复杂度是O(n)的论断。与此同时,字典的包含操作?时保持不变,即使字典的??不断变?也是如此。实际上,10,000个元素的字典的包含操作?了0.004毫秒,?990,000个元素的字典同样也?了0.004毫秒。

图2.4对?列表和字典的包含操作的效率

因为Python是?门仍在发展中的语?,其幕后总在进?着各种改进。关于Python的数据结构性能的最新信息可以在Python?站上找到。对于这部分,Pythonwiki上有?页关于时间复杂度的很好的介绍,可以在Time Complexity Wiki上找到。

???试

1. 下?的列表操作中哪?个是O(1)的?

A. list.pop(0)

B. list.pop()

C. list.append()

D. list[10]

E.以上全是

2.下?的字典操作中哪?个是O(1)的?

算法分析与设计复习题及参考答案

网络教育课程考试复习题及参考答案算法分析与设计一、名词解释:1.算法 2.程序 3.递归函数 4.子问题的重叠性质 5.队列式分支限界法 6.多机调度问题7.最小生成树二、简答题: 1.备忘录方法和动态规划算法相 比有何异同?简述之。 2.简述回溯法解题的主要步骤。 3.简述动态规划算法求解的基本要素。 4.简述回溯法的基本思想。 5.简要分析在递归算法中消除递归调用,将递归算法转化为非递归算法的方法。 6.简要分析分支限界法与回溯法的异同。7.简述算法复杂性的概念,算法复杂性度量主要指哪两个方面?8.贪心算法求解的问题主要具有哪些性质?简述之。9.分治法的基本思想是什么?合并排序的基本思想是什么?请分别简述之。10.简述分析贪心算法与动态规划 算法的异同。三、算法编写及算法应用分析题: 1.已知有3个物品: (w1,w2,w3)=(12,10,6),(p1,p2,p3)=(15,13,10),背包的容积M=20,根据0-1背包动态规划的递推式求出最优解。 2.按要求完成以下关于排序和查找的问题。①对数组A={15,29,135,18,32,1,27,25,5},用快速排序方法将其排成递减序。②请描述递减数组进行二分搜索的基本思想,并给出非递归算法。③给出上述算法的递归算法。④使用上述算法对①所得到的结果搜索如下元素,并给出搜索过程:18,31,135。已知,=1,2,3,4,5,6,=5,=10,=3,=12,=5,=50,=6,kijr*r1234567ii1求矩阵链积A×A×A×A×A×A的最佳求积顺序(要求给出计算步骤)。1234564.根据分枝限界算法基本过程,求解0-1背包问题。已知n=3,M=20,(w1,w2,w3)=(12,10,6),(p1,p2,p3)=(15,13,10)。 5.试用贪心算法求解汽车加油问题:已知一辆汽车加满油后可行驶n公里,而旅途中有若干个加油站。试设计一个有效算法,指出应在哪些加油站停靠加油,使加油次数最少,请写出该算法。6.试用动态规划算法实现下列问题:设A和B是两个字符串。我们要用最少的字符操作,将字符串A转换为字符串B,这里所说的字符操作包括:①删除一个字符。②插入一个字符。③将一个字符改为另一个字符。请写出该算法。7.对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。be2g212ad323182cf2h 8.试写出用分治法对数组A[n]实现快速排序的算法。9.有n个活动争用一个活动室。已知活动i占用的时间区域为[s,f ],活动i,j相容的条件是:sj≥f ii,问题的解表示为(x| x =1,2…,n,),x表示顺序为i的活动编号活动,求一个相容的活动子集,iiii且安排的活动数目最多。xxx10.设、、是一个三角形的三条边,而且x+x+x=14。请问有多少种不同的三角形?给出解答过程。12312311.

数据结构与算法分析习题与参考答案

大学 《数据结构与算法分析》课程 习题及参考答案 模拟试卷一 一、单选题(每题 2 分,共20分) 1.以下数据结构中哪一个是线性结构?( ) A. 有向图 B. 队列 C. 线索二叉树 D. B树 2.在一个单链表HL中,若要在当前由指针p指向的结点后面插入一个由q指向的结点, 则执行如下( )语句序列。 A. p=q; p->next=q; B. p->next=q; q->next=p; C. p->next=q->next; p=q; D. q->next=p->next; p->next=q; 3.以下哪一个不是队列的基本运算?() A. 在队列第i个元素之后插入一个元素 B. 从队头删除一个元素 C. 判断一个队列是否为空 D.读取队头元素的值 4.字符A、B、C依次进入一个栈,按出栈的先后顺序组成不同的字符串,至多可以组成( ) 个不同的字符串? A.14 B.5 C.6 D.8 5.由权值分别为3,8,6,2的叶子生成一棵哈夫曼树,它的带权路径长度为( )。 以下6-8题基于图1。 6.该二叉树结点的前序遍历的序列为( )。 A.E、G、F、A、C、D、B B.E、A、G、C、F、B、D C.E、A、C、B、D、G、F D.E、G、A、C、D、F、B 7.该二叉树结点的中序遍历的序列为( )。 A. A、B、C、D、E、G、F B. E、A、G、C、F、B、D C. E、A、C、B、D、G、F E.B、D、C、A、F、G、E 8.该二叉树的按层遍历的序列为( )。

A.E、G、F、A、C、D、B B. E、A、C、B、D、G、F C. E、A、G、C、F、B、D D. E、G、A、C、D、F、B 9.下面关于图的存储的叙述中正确的是( )。 A.用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 B.用邻接表法存储图,占用的存储空间大小与图中边数和结点个数都有关 C. 用邻接矩阵法存储图,占用的存储空间大小与图中结点个数和边数都有关 D.用邻接矩阵法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 10.设有关键码序列(q,g,m,z,a,n,p,x,h),下面哪一个序列是从上述序列出发建 堆的结果?( ) A. a,g,h,m,n,p,q,x,z B. a,g,m,h,q,n,p,x,z C. g,m,q,a,n,p,x,h,z D. h,g,m,p,a,n,q,x,z 二、填空题(每空1分,共26分) 1.数据的物理结构被分为_________、________、__________和___________四种。 2.对于一个长度为n的顺序存储的线性表,在表头插入元素的时间复杂度为_________, 在表尾插入元素的时间复杂度为____________。 3.向一个由HS指向的链栈中插入一个结点时p时,需要执行的操作是________________; 删除一个结点时,需要执行的操作是______________________________(假设栈不空而 且无需回收被删除结点)。 4.对于一棵具有n个结点的二叉树,一个结点的编号为i(1≤i≤n),若它有左孩子则左 孩子结点的编号为________,若它有右孩子,则右孩子结点的编号为________,若它有 双亲,则双亲结点的编号为________。 5.当向一个大根堆插入一个具有最大值的元素时,需要逐层_________调整,直到被调整 到____________位置为止。 6.以二分查找方法从长度为10的有序表中查找一个元素时,平均查找长度为________。 7.表示图的三种常用的存储结构为_____________、____________和_______________。 8.对于线性表(70,34,55,23,65,41,20)进行散列存储时,若选用H(K)=K %7 作为散列函数,则散列地址为0的元素有________个,散列地址为6的有_______个。 9.在归并排序中,进行每趟归并的时间复杂度为______,整个排序过程的时间复杂度为 ____________,空间复杂度为___________。 10.在一棵m阶B_树上,每个非树根结点的关键字数目最少为________个,最多为________ 个,其子树数目最少为________,最多为________。 三、运算题(每题 6 分,共24分) 1.写出下列中缀表达式的后缀形式: (1)3X/(Y-2)+1 (2)2+X*(Y+3) 2.试对图2中的二叉树画出其: (1)顺序存储表示的示意图; (2)二叉链表存储表示的示意图。 3.判断以下序列是否是小根堆? 如果不是, 将它调 图2 整为小根堆。 (1){ 12, 70, 33, 65, 24, 56, 48, 92, 86, 33 } (2){ 05, 23, 20, 28, 40, 38, 29, 61, 35, 76, 47, 100 } 4.已知一个图的顶点集V和边集E分别为: V={1,2,3,4,5,6,7};

《公共关系学》第二章习题答案

第二章公共关系的发展 一、名词解释 1.冯谖市义:据《战国策.齐策四》载,冯谖为孟尝君收债于薛,问:"责(债)毕收,以何市而反?"孟尝君曰:"视吾家所寡有者."冯谖至薛召民合券,因悉焚之,民称万岁;回齐后告孟尝君曰:"君家所寡有者以义耳,窃以为君市义."后因以"市义"谓邀买人心,博取正义的名声. 孟尝君虽然心中不悦,认为无此必要,倒也没有责怪他.事情过去不久,齐王听信谗言,让孟尝君交出相印,退隐薛城.孟尝君离京去薛时,百姓出城十里远迎.消息传回京城,齐王深悔自己不察,迎回孟尝君当面致歉.由于冯谖的远见,使孟尝君避免一场政治波折,并得以巩固自己的地位.这叫做‘未雨而绸缪’,留了条后路. 2.徙木立信:商鞅在咸阳南门竖起一根木杆,宣布谁把它搬到北门,就奖赏十两金子,围观者很多,但都不相信;商鞅又把赏金提高到五十两黄金,于是便有一人半信半疑地将它搬到北门,商鞅果真给付了五十两黄金。由于商鞅言而有信,说话算数,因此很快在群众中树立起了自己的威信,为他以后在秦国成功变法奠定了基础。 3.扒粪运动:19世纪末,美国进入垄断资本主义时代,垄断财团占有着社会的绝大部分财富。他们不择手段地榨取剩余价值,肆无忌惮地搜刮民脂民膏。 为了攫取最大利益,他们全然不顾广大民众、广大劳动人民的利益和最起码的社会道德准则。由于经济危机的爆发,不仅广大劳动人民的生活极度艰难,一大批中小企业和资本家也在垄断财团的疯狂兼并活动中惶惶不可终日。 于是,整个社会的阶级矛盾日益激化,各个阶层和集团之间的利益冲突也日益尖锐,整个社会都对工商寡头产生了敌意。在此情况下,终于爆发了以揭露工商业丑恶和阴暗为主题的新闻揭丑运动,史称“扒粪运动”。 二、问答题 1.答:(1)“和为贵”是公共关系管理的总原则和总目标;

算法设计与分析复习题目及答案

一。选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( B )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4、在下列算法中有时找不到问题解的是( B )。 A、蒙特卡罗算法 B、拉斯维加斯算法 C、舍伍德算法 D、数值概率算法 5. 回溯法解旅行售货员问题时的解空间树是( B )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树6.下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 7、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 8、以下不可以使用分治法求解的是(D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 9. 实现循环赛日程表利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 10、下列随机算法中运行时有时候成功有时候失败的是(C ) A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法 11.下面不是分支界限法搜索方式的是( D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先12.下列算法中通常以深度优先方式系统搜索问题解的是( D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 13.备忘录方法是那种算法的变形。( B )

数据结构与算法分析 C++版答案

Data Structures and Algorithm 习题答案 Preface ii 1 Data Structures and Algorithms 1 2 Mathematical Preliminaries 5 3 Algorithm Analysis 17 4 Lists, Stacks, and Queues 23 5 Binary Trees 32 6 General Trees 40 7 Internal Sorting 46 8 File Processing and External Sorting 54 9Searching 58 10 Indexing 64 11 Graphs 69 12 Lists and Arrays Revisited 76 13 Advanced Tree Structures 82 i

ii Contents 14 Analysis Techniques 88 15 Limits to Computation 94

Preface Contained herein are the solutions to all exercises from the textbook A Practical Introduction to Data Structures and Algorithm Analysis, 2nd edition. For most of the problems requiring an algorithm I have given actual code. In a few cases I have presented pseudocode. Please be aware that the code presented in this manual has not actually been compiled and tested. While I believe the algorithms to be essentially correct, there may be errors in syntax as well as semantics. Most importantly, these solutions provide a guide to the instructor as to the intended answer, rather than usable programs.

北航数值分析大作业第一题幂法与反幂法

《数值分析》计算实习题目 第一题: 1. 算法设计方案 (1)1λ,501λ和s λ的值。 1)首先通过幂法求出按模最大的特征值λt1,然后根据λt1进行原点平移求出另一特征值λt2,比较两值大小,数值小的为所求最小特征值λ1,数值大的为是所求最大特征值λ501。 2)使用反幂法求λs ,其中需要解线性方程组。因为A 为带状线性方程组,此处采用LU 分解法解带状方程组。 (2)与140k λλμλ-5011=+k 最接近的特征值λik 。 通过带有原点平移的反幂法求出与数k μ最接近的特征值 λik 。 (3)2cond(A)和det A 。 1)1=n λλ2cond(A),其中1λ和n λ分别是按模最大和最小特征值。 2)利用步骤(1)中分解矩阵A 得出的LU 矩阵,L 为单位下三角阵,U 为上三角阵,其中U 矩阵的主对角线元素之积即为det A 。 由于A 的元素零元素较多,为节省储存量,将A 的元素存为6×501的数组中,程序中采用get_an_element()函数来从小数组中取出A 中的元素。 2.全部源程序 #include #include void init_a();//初始化A double get_an_element(int,int);//取A 中的元素函数 double powermethod(double);//原点平移的幂法 double inversepowermethod(double);//原点平移的反幂法 int presolve(double);//三角LU 分解 int solve(double [],double []);//解方程组 int max(int,int); int min(int,int); double (*u)[502]=new double[502][502];//上三角U 数组 double (*l)[502]=new double[502][502];//单位下三角L 数组 double a[6][502];//矩阵A int main() { int i,k; double lambdat1,lambdat2,lambda1,lambda501,lambdas,mu[40],det;

大数据分析技术与应用_实验2指导

目录 1实验主题 (1) 2实验目的 (1) 3实验性质 (1) 4实验考核方法 (1) 5实验报告提交日期与方式 (1) 6实验平台 (1) 7实验内容和要求 (1) 8实验指导 (2) 8.2 开启Hadoop所有守护进程 (2) 8.2 搭建Eclipse环境编程实现Wordcount程序 (3) 1.安装Eclipse (3) 2.配置Hadoop-Eclipse-Plugin (3) 3.在Eclipse 中操作HDFS 中的文件 (7) 4.在Eclipse 中创建MapReduce 项目 (8) 5.通过Eclipse 运行MapReduce (13) 6.在Eclipse 中运行MapReduce 程序会遇到的问题 (16)

1实验主题 1、搭建Hadoop、Eclipse编程环境 2、在Eclipse中操作HDFS 3、在Eclipse中运行Wordcount程序 4、参照Wordcount程序,自己编程实现数据去重程序 2实验目的 (1)理解Hadoop、Eclipse编程流程; (2)理解MapReduce架构,以及分布式编程思想; 3实验性质 实验上机内容,必做,作为课堂平时成绩。 4实验考核方法 提交上机实验报告,纸质版。 要求实验报告内容结构清晰、图文并茂。 同学之间实验报告不得相互抄袭。 5实验报告提交日期与方式 要求提交打印版,4月19日(第10周)之前交到软件学院412。 6实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 JDK版本:1.6或以上版本 Java IDE:Eclipse 7实验内容和要求 (1)搭建Hadoop、Eclipse编程环境; (2)运行实验指导上提供的Wordcount程序; (3)在Eclipse上面查看HDFS文件目录; (4)在Eclipse上面查看Wordcount程序运行结果; (5)熟悉Hadoop、Eclipse编程流程及思想; 程序设计题,编程实现基于Hadoop的数据去重程序,具体要求如下: 把data1文件和data2文件中相同的数据删除,并输出没有重复的数据,自己动手实现,把代码贴到实验报告的附录里。 设计思路: 数据去重实例的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次。具体就是Reduce的输入应该以数据作为Key,而对value-list则没有要求。当Reduce 接收到一个时就直接将key复制到输出的key中,并将value设置成空值。在MapReduce流程中,Map的输出 经过shuffle过程聚集成后会被交给Reduce。所以从设计好的Reduce输入可以反推出Map输出的key应为数据,而

软件系统分析与设计大作业

《软件系统分析与设计》 期末大作业 选题名称:游戏平台管理系统设计人:徐文豪刘青海 赖超宇甘智宏 班级:软工143班 南昌大学软件学院 2016.6.1

目录 一、整体描述 (2) 二、需求分析 (3) 三、系统功能概况 (4) 四、类的属性与方法 (5) 五、系统界面界限 (11) 六、设计模型 (13) 七、设计原则 (17) 八、设计模式······················

一、整体描述 随着移动通讯的发展,手机应用也越来越多,其中,游戏应用占据了很大的比重,游戏平台管理系统是整合了大量游戏应用,以及玩家线上交流的平台。 主要受众群:拥有移动端或电脑端的人群。 应用前景:移动互联的发展为游戏平台的发展提供了很大的生存空间,应用前景十分广阔 盈利方式:向平台中游戏的开发商收取一定的费用,游戏玩家向游戏中注入资金时,收取一定比例的游戏收入。 面临的困难:游戏平台前期的推广,提高游戏平台本身对开发商和游戏玩家的吸引力,游戏平台能否适应大部分游戏玩家的要求。 玩家首先要注册账号,然后就可以在上面下载游戏应用,上传自己的游戏资源。同时,根据玩家的活跃程度获取相应积分,用积分可以兑换游戏礼包,也会根据玩家等级在游戏装备上给与相应的优惠和等级奖励。玩家在每一款游戏的评论区都可以交流游戏经验,提出意见和建议,以便游戏及时更新,弥补相应不足。玩家也可以建立游戏工会,不同游戏的玩家都可以加入,分享自己的游戏心得或者转赠游戏装备或积分。

二、需求分析 时间when:游戏厂商:随时;注册用户:随时;管理人员:正常工作时间。 地点Where:游戏厂商,管理人员:工作地点;注册用户:随地 人员who:游戏厂商,管理人员,注册用户, What:游戏厂商:推广游戏,管理人员:扩大服务,盈利;注册人员:玩游戏。 Why:游戏厂商:推广力度不大,效果不好,管理人员:方便管理,注册用户:良好的游戏环境。 性能Performance:系统提供服务的效率,响应时间快,由于是手机端的APP吞吐量不需要太大。 成本Cost:实现系统需要付出的代价,耗费****元 时间Time:2016年6月3日 可靠性Reliability: 需要系统长时间正确运行的能力 安全性Security: 由于该平台会涉及资金的流动,所以需要对信息安全的保护能力。 合规性Compliance: 需要符合各种行业的标准,法律法规,规范。技术性Technology:要求基于安卓平台开发。 兼容性Compatibility:需要与一些支付平台进行兼容能力。还有对游戏的兼容性。

软件设计大作业

一需求分析 此系统是一个类似于淘宝网的在线衣服销售系统,相当于淘宝网上的一个专门买衣服的网店,它具有用户注册,用户登录,修改密码,显示系统功能,查看订购历史以及订货。 1.1需求列表: (1)用户管理:用户管理的需求包括用户注册,用户登录以及修改密码。 用户注册是添加一个我们网上衣店的新用户;用户登录是用户想要进 入系统时必须采取验证身份的步骤;修改密码是为了用户的安全性考 虑,当密码存在不安全的因素时,适时修改密码。 (2)商品衣服的管理:商品管理包括订购衣服和查看订购衣服的历史。订购衣服是当我们衣店的库存数量不足时必须采取的;查看订购衣服的 历史有助于我们更好地了解衣服的订购情况。 (3)显示系统功能:此功能是用来让用户能很清楚地了解此系统所实现的各种功能。 1.2系统用例图:

1.3用例分析及场景描述: 用户注册用例: 这部分主要是新用户进行注册的过程,首先用户进入到注册页面,填写注册信息并提交,如果无误的话系统会给予注册成功的提示,如果注册失败会提示注册失败信息。 用户登录用例: 此功能模块针对的对象是本网站的会员既已经注册的会员,会员首先填写用户名和密码,然后点击登录按钮,如果网站数据库中存在此会员并且密码正确则提示登录成功提示,如果网站不存在此用户或密码不正确,系统会提示用户登录失败。 修改密码用例: 此用例针对注册会员进行操作。用户登录成功会可以进入网站主页面,如果用户想修改密码的话可以单击修改密码按钮,进行密码修改,用户输入新密码单击修改按钮即可完成密码修改。

显示系统功能用例: 此功能针对注册会员,会员首先登录到网站,进入主页,主页会有相关操作的按钮,显示系统所提供给会员操作的功能,用户可以针对自己的需要选择系统提供的功能。 订货衣服用例: 此功能针对注册登录会员,网站提供两种订购方案:单件订购和定制套装。用户可以根据自己的需求来选择。 单件订购方案:用户选择是上衣还是裤子,并填写订购的数量,确认无误后单击订购按钮即可,如果订购成功,系统会提示订购成功,失败则会提示订购失败。 定制套装方案:用户选择定制套装的档次(高、中、低),并填写订购的数量,确认无误后单击订购按钮即可,如果订购成功,系统会提示订购成功,失败则会提示订购失败。 显示订购历史用例: 此功能针对注册会员,用户登录到系统后,主页显示系统功能中包括历史查看选项,用户可以单击进入历史交易记录页面,页面将显示用户所有的交易记录。 二设计模式 2.1单件模式 2.1.1单件模式的定义

自考公共关系学第二章练习题

一、单项选择题 1.一个社会组织的领导者必须对本组织的声誉和形象承担()。 A.直接责任 B.间接责任 C.技术责任 D.经济责任 2.《<中国公共关系职业道德准则>草拟及实施草案》的提出时间是()。 A.1985年 B.1988年 C.1989年 D.1991年 3.组织的全员公关培训即指对全员进行公关教育,其重点是()。 A.政治思想教育 B.思想及意识教育 C.公关知识普及教育 D.公关能力教育 4.在公关人员心理素质中,其最基本的要求是()。 A.热情心理 B.创新心理 C.开放心理 D.自信心理 5.公关人员所应具有的沟通意识实际上可以说是一种()。 A.环境意识 B.调查意识 C.协调意识 D.信息意识 6.在组织公关部中主要是按照既定的公共关系目标、计划和方案去开展、管理公共传播活动的人员是()。 A.调查分析人员 B.计划分析人员

C.文秘人员 D.传播人员 7.某人在组织公关部中主要负责评估组织的形象和公关工作的效果,并寻找出现问题的原因。他属于()。 A.公关文秘人员 B.公关计划人员 C.调查分析人员 D.公关传播人员 8.从管理作用上看,公共关系职能部门在组织总体中扮演()。 A.边缘的角色 B.核心的角色 C.无足轻重的角色 D.基础的角色 9.公共关系的()是执行公共关系任务、实现公共关系功能的载体和行为者,即各类社会组织。 A.客体 B.手段 C.对象 D.主体 10.()的公共关系主体指的是任何有目的、有系统地组织起来,具有特定功能和任务、具有社会行为能力的社会组织。 A.狭义 B.广义 C.微观 D.宏观 11.下列关于公共关系部门的性质说法错误的是()。 A.公共关系职能的形成是现代组织管理职能演化的结果 B.专门公共关系职能部门的传播与沟通活动的显著特点是分散随机和不系统 C.从工作性质上看,公共关系的职能是传播性、沟通性的 D.公共关系部门的职能目标和业务内容完全不同于其他的职能部门

算法分析大作业动态规划方法解乘法表问题和汽车加油行驶问题#精选.

算法分析大作业 动态规划方法解 乘法表问题和汽车加油行驶问题目录 1.动态规划解乘法表问题 1.1问题描述------ 1.2算法设计思想------ 1.3设计方法------ 1.4源代码------ 1.5最终结果------ 2.动态规划解汽车加油行驶问题 2.1问题描述------ 2.2算法设计思想------ 2.3设计方法------ 2.4源代码------ 2.5最终结果------ 3.总结

1.动态规划解决乘法表问题 1.1问题描述 定义于字母表∑{a,b,c)上的乘法表如表所示: 依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。 例如,对于字符串x=bbbba,它的一个加括号表达式为(b(bb))(ba)。依乘法表,该表达式的值为a。 试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。 1.2算法设计思想 设常量a,b,c 分别为 1, 2 ,3 。n 为字符串的长度。 设字符串的第 i 到第 j 位乘积为 a 的加括号法有result[i][j][a] 种, 字符串的第 i 到第 j 位乘积为 b 的加括号法有result[i][j][b] 种, 字符串的第 i 到第 j 位乘积为 c 的加括号法有 result[i][j][c] 种。 则原问题的解是:result[i][n][a] 。 设 k 为 i 到 j 中的某一个字符,则对于 k 从 i 到 j :result[i][j][a] += result[i][k][a] * result[k + 1][j][c] + result[i][k][b] * result[k + 1][j][c] + result[i][k][c] * result[k + 1][j][a]; result[i][j][b] += result[i][k][a] * result[k + 1][j][a] + result[i][k][a] * result[k + 1][j][b] + result[i][k][b] * result[k + 1][j][b]; result[i][j][c] += result[i][k][b] * result[k + 1][j][a] + result[i][k][c] * result[k + 1][j][b] + result[i][k][c] * result[k + 1][j][c];

算法设计与分析基础课后习题答案

Program算法设计与分析基础中文版答案 习题 5..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立. Hint: 根据除法的定义不难证明: 如果d整除u和v, 那么d一定能整除u±v; 如果d整除u,那么d也能够整除u的任何整数倍ku. 对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。 数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。故gcd(m,n)=gcd(n,r) 6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次? Hint: 对于任何形如0<=m

设sqrt(x)是求平方根的函数) 算法Quadratic(a,b,c) 描述将十进制整数表达为二进制整数的标准算法 a.用文字描述 b.用伪代码描述 解答: a.将十进制整数转换为二进制整数的算法 输入:一个正整数n 输出:正整数n相应的二进制数 第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n 第二步:如果n=0,则到第三步,否则重复第一步 第三步:将Ki按照i从高到低的顺序输出 b.伪代码 算法 DectoBin(n) .n]中 i=1 while n!=0 do { Bin[i]=n%2; n=(int)n/2; i++; } while i!=0 do{ print Bin[i]; i--; } 9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略)对这个算法做尽可能多的改进. 算法 MinDistance(A[0..n-1])

《大数据分析方法与应用》教学大纲

《大数据分析方法与应用》课程教学大纲 课程代码:090542008 课程英文名称:Big Data Analysis: Methods and Applications 课程总学时:40 讲课:40 实验:0 上机:0 适用专业:应用统计学 大纲编写(修订)时间:2017.6 一、大纲使用说明 (一)课程的地位及教学目标 本课程是应用统计学专业的一门专业课,通过本课程的学习,可以使学生学会选用适当的方法和技术分析数据,领会大数据分析方法和应用,掌握复杂数据的分析与建模,使学生能够按照实证研究的规范和数据挖掘的步骤进行大数据研发,为就业与继续深造打下必要而有用的基础。 (二)知识、能力及技能方面的基本要求 1.基本知识:掌握数据挖掘流程、随机森林树的回归算法、基于预测强度的聚类方法、朴素贝叶斯分类、高维回归及变量选择、图模型等。 2.基本能力:要求能在真实案例中应用相应的方法。 3.基本技能:掌握复杂数据的分析与建模。 (三)实施说明 1. 本大纲主要依据应用统计学专业2017版教学计划、应用统计学专业专业建设和特色发展规划和沈阳理工大学编写本科教学大纲的有关规定并根据我校实际情况进行编写的。 2. 课程学时总体分配表中的章节序号在授课过程中可酌情调整顺序,课时分配仅供参考。打“*”号的章节可删去或选学。 3. 建议本课程采用课堂讲授、讨论相结合的方法开展教学,通过讨论等方式强化重点,通过分散难点,使学生循序渐进的掌握难点。 4.教学手段:建议采用多媒体等现代化手段开展教学。 (四)对先修课的要求 本课程的先修课程:应用多元统计分析。 (五)对习题课、实践环节的要求 通过案例讲解算法,鼓励学生演示分析思路和分析收获,使学生有机会诊断问题,并学会选用适当的方法和技术分析数据。 (六)课程考核方式 1.考核方式:考查 2.考核目标:在考核学生基础知识、基本技能,基本能力的基础上,重点考核学生的分析能力、解决实际问题能力。 3.成绩构成:本课程由平时成绩和结课报告的质量评定优、良、中、及格和不及格。 (七)参考书目: 《大数据分析:方法与应用》,王星编,清华大学出版社,2013. 二、中文摘要 《大数据分析方法与应用》是高等学校应用统计学专业的一门选修的专业课。本课程着重介绍了统计学习、数据挖掘和模式识别等领域的各种大数据分析方法。课程主要内容包括大数据分析概述、数据挖掘流程、随机森林树、基于预测强度的聚类方法、贝叶斯分类和因果学习、高

算法与数据结构C语言版课后习题答案(机械工业出版社)第1章 绪论 习题参考答案

第1章概论习题参考答案 一、基础知识题 1.简述下列概念 数据,数据元素,数据类型,数据结构,逻辑结构,存储结构,算法。 【解答】数据是信息的载体,是描述客观事物的数、字符,以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据元素是数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等。 数据类型是对数据的取值范围、数据元素之间的结构以及允许施加操作的一种总体描述。每一种计算机程序设计语言都定义有自己的数据类型。 “数据结构”这一术语有两种含义,一是作为一门课程的名称;二是作为一个科学的概念。作为科学概念,目前尚无公认定义,一般认为,讨论数据结构要包括三个方面,一是数据的逻辑结构,二是数据的存储结构,三是对数据进行的操作(运算)。而数据类型是值的集合和操作的集合,可以看作是已实现了的数据结构,后者是前者的一种简化情况。 数据的逻辑结构反映数据元素之间的逻辑关系(即数据元素之间的关联方式或“邻接关系”),数据的存储结构是数据结构在计算机中的表示,包括数据元素的表示及其关系的表示。数据的运算是对数据定义的一组操作,运算是定义在逻辑结构上的,和存储结构无关,而运算的实现则依赖于存储结构。 数据结构在计算机中的表示称为物理结构,又称存储结构。是逻辑结构在存储器中的映像,包括数据元素的表示和关系的表示。逻辑结构与计算机无关。 算法是对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操作。一个算法应该具有下列特性:有穷性、确定性、可行性、输入和输出。 2.数据的逻辑结构分哪几种,为什么说逻辑结构是数据组织的主要方面? 【解答】数据的逻辑结构分为线性结构和非线性结构。(也可以分为集合、线性结构、树形结构和图形即网状结构)。 逻辑结构是数据组织的某种“本质性”的东西: (1)逻辑结构与数据元素本身的形式、内容无关。 (2)逻辑结构与数据元素的相对位置无关。 (3)逻辑结构与所含数据元素的个数无关。 3.试举一个数据结构的例子,叙述其逻辑结构、存储结构、运算三方面的内容。 【解答】如学生成绩表,逻辑结构是线性结构,可以顺序存储(也可以链式存储),运算可以有插入、删除、查询、等等。 4.简述算法的五个特性,对算法设计的要求。 【解答】算法的五个特性是:有穷性、确定性、可行性、零至多个输入和一至多个输出。

公共关系学试题及参考答案 第二章

模拟试题2 一.填空题(每空格1分,共25分)察看答案1、 纵观公共关系的产生和发展史,可以大致划分为孕育阶段、______ 和______ 三个时期。 答案:职业化阶段学科化阶段 2、 公共关系是近现代商品经济快速发展,______ 和大众传播 带动的信息社会来临的产物。 答案:政治民主化浪潮日益高涨 3、 公共关系学诞生于本世纪20年代,是当时文化背景、______ 、______ 及技术背景等诸方面历史条件综合作用的结果,是时代进步的必然产物。 答案:政治背景经济背景 二、判断题(正确的打“√”,错误的打“X”。每小题1分,共10分) 正确数/总题数/正确率=0/1/0%察看答案 错错误1、公共关系的产生主要是市场经济取代小农经济的结果。 正确错误 三、单项选择题(在每小题的四个备选答案中选出一个正确答案,并将其号码填在题干后的括号 内。每小题1分,共15分) 正确数/总题数/正确率=0/2/0%察看答案

错误B 1、公共关系的产生、发展之线索,可以追溯到久远时期零散的公共关系观念与不成系统的 () A、公共关系状态 B、公共关系活动 C、人群关系 D、人际关系 错误D 2、民主政治取代专制政治,这是公共关系产生的( )。 A、文化条件 B、历史条件 C、经济条件 D、政治条件 四、多项选择题(在每小题的五个备选答案中选出二个至五个正确答案,并将正确答案的序号填入题干后面的括号内,错选多选,漏选均不得分。每小题1分,共10分) 正确数/总题数/正确率=0/3/0%察看答案

错误 A B D 1、纵观公共关系的产生和发展史,可以大致划分为几个阶段,它们是 ( )。 A、孕育阶段 B、职业化阶段 C、成熟阶段 D、学科化阶段 E、学科化阶段 错误 A B D E 2、公共关系产生所必需的条件是( )。 A、文化条件 B、政治条件 C、军事条件 D、经济条件 E、技术条件 错误 A C 3、在19世纪中叶至20世纪初,公共关系成为一门社会职业,其催化剂是 ( )。 A、"报刊宣传运动 " B、清除污染运动 C、"清垃圾运动" D、大生产运动 E、"文化运动" 五、简答题(每小题5分,共20分) 1、公共关系产生和发展的社会历史条件是什么? 2、公共关系的未来发展将有何新特点?

大数据处理技术的总结与分析

数据分析处理需求分类 1 事务型处理 在我们实际生活中,事务型数据处理需求非常常见,例如:淘宝网站交易系统、12306网站火车票交易系统、超市POS系统等都属于事务型数据处理系统。这类系统数据处理特点包括以下几点: 一就是事务处理型操作都就是细粒度操作,每次事务处理涉及数据量都很小。 二就是计算相对简单,一般只有少数几步操作组成,比如修改某行得某列; 三就是事务型处理操作涉及数据得增、删、改、查,对事务完整性与数据一致性要求非常高。 四就是事务性操作都就是实时交互式操作,至少能在几秒内执行完成; 五就是基于以上特点,索引就是支撑事务型处理一个非常重要得技术. 在数据量与并发交易量不大情况下,一般依托单机版关系型数据库,例如ORACLE、MYSQL、SQLSERVER,再加数据复制(DataGurad、RMAN、MySQL数据复制等)等高可用措施即可满足业务需求。 在数据量与并发交易量增加情况下,一般可以采用ORALCERAC集群方式或者就是通过硬件升级(采用小型机、大型机等,如银行系统、运营商计费系统、证卷系统)来支撑. 事务型操作在淘宝、12306等互联网企业中,由于数据量大、访问并发量高,必然采用分布式技术来应对,这样就带来了分布式事务处理问题,而分布式事务处理很难做到高效,因此一般采用根据业务应用特点来开发专用得系统来解决本问题。

2数据统计分析 数据统计主要就是被各类企业通过分析自己得销售记录等企业日常得运营数据,以辅助企业管理层来进行运营决策。典型得使用场景有:周报表、月报表等固定时间提供给领导得各类统计报表;市场营销部门,通过各种维度组合进行统计分析,以制定相应得营销策略等. 数据统计分析特点包括以下几点: 一就是数据统计一般涉及大量数据得聚合运算,每次统计涉及数据量会比较大。二就是数据统计分析计算相对复杂,例如会涉及大量goupby、子查询、嵌套查询、窗口函数、聚合函数、排序等;有些复杂统计可能需要编写SQL脚本才能实现. 三就是数据统计分析实时性相对没有事务型操作要求高。但除固定报表外,目前越来越多得用户希望能做做到交互式实时统计; 传统得数据统计分析主要采用基于MPP并行数据库得数据仓库技术.主要采用维度模型,通过预计算等方法,把数据整理成适合统计分析得结构来实现高性能得数据统计分析,以支持可以通过下钻与上卷操作,实现各种维度组合以及各种粒度得统计分析。 另外目前在数据统计分析领域,为了满足交互式统计分析需求,基于内存计算得数据库仓库系统也成为一个发展趋势,例如SAP得HANA平台。 3 数据挖掘 数据挖掘主要就是根据商业目标,采用数据挖掘算法自动从海量数据中发现隐含在海量数据中得规律与知识。

算法分析大作业 寻找变位词

深圳大学研究生课程论文 题目大作业:变位词实验成绩 专业计算机与软件学院软件工程 课程名称、代码 年级2015 姓名文成 学号2150230509 时间2015 年12 月任课教师杨烜

一、大作业要求与内容 大作业内容: 在下列问题中挑选一个问题,选用适当的算法进行实现,在课堂上,针对该问题完成一个10分钟的论文演讲与演示,并提交演讲PPT。(30分) 在一个类似英语词典的大文件中找出变位词的所有集合,例如,tea和eat是变位词,同属一个集合,找出所有这种集合。 大作业要求:(70分) (1)要求演示算法解决问题的完整过程,如果我对解这个问题一无所知,看了你的解决过程,就要能理解算法是如何解决问题的; (2)要求交互界面活泼生动,演示速度可控; (3)尽可能提供丰富的功能让我理解你是如何解决这个问题的; (4)提交源程序、大作业报告(介绍详细的算法设计说明和使用说明); (5)以论文、报告等形式考核专用答题纸写大作业,大作业报告中要分析算法效率,并给出实测效率和理论效率图表; (6)大作业用5号字体,总页数不得少于8页,否则视为无效。 二、大作业步骤 Introduction: 给定一本英语单词词典,找出所有的变位词集。所谓的变位词是指,组成各个单词的字母完全相同,只是字母排列的顺序不同。例如,tea和eat是变位词,同属一个集合,找出所有这种集合。 Motivating idea: 1.如何判断两个单词是否为变位词。 思路一: 如果两个单词是变位词,那么它们具有相同的长度,且每个英语字母的个数是一样的。我们只需要挨个对各个单词进行比较即可。这个思路容易想,但时间效率太低,还可以继续改进一下,且看下面的思路二。 思路二: 将两个字符串按照字母表顺序排序,看排序后的字符串是否相等,如果相等则是兄弟字符串(变位词)。这种方法的时间效率根据你使用的排序算法不同而不同。这里我采取思路二,我使用的是快速排序。但是依旧有个问题,单词与单词一个一个比较的话效率还是太低了,我们可以再做改进。 2.如何从字典中找出所有变位词的集合。 思路一: 对于这个问题,最快想到的最直接的方法就是针对每一个单词跟字典中的其他单词进行比较。然而,假设一次比较至少花费1微秒的时间,则拥有二十万单词的字典将花费:200000

相关文档
最新文档