算法时间复杂度评估

来源:互联网 发布:windows配置hadoop 编辑:程序博客网 时间:2024/05/18 19:39

Implementing An Algorithm

  • 实现一个查找算法:我们采用线性查找,线性查找是查找算法的一个实现方法,它采用循环遍历每个元素直到找到匹配元素为止:
  • 本算法提供了一个数据集nba:2013年的NBA球员信息,第一列是球员名字。我们尝试找到Kobe打的位置(SG).
# When Kobe is found in the dataset, store his position in Kobe_positionkobe_position = ""# Find Kobe in the datasetkobe_position = ""for row in nba:    if row[0] == "Kobe Bryant":        kobe_position = row[1]

Importance Of Modularity And Abstraction

模块化程序设计即模块化设计,简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系。逐步求精的结果是得到一系列以功能块为单位的算法描述。以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。

在计算机科学中,抽象化(英语:Abstraction)是将数据与程序,以它的语义来呈现出它的外观,但是隐藏起它的实现细节。抽象化是用来减少程序的复杂度,使得程序员可以专注在处理少数重要的部分。一个电脑系统可以分区成几个抽象层(Abstraction layer),使得程序员可以将它们分开处理。

  • 比如sum()函数,我们并不知道这个函数是怎么实现的,我们只需要知道它是干什么的,这就是抽象。并且它节约了我们的时间,不用每次都自己手动计算求和,这就是模块。

Linear Search Revisited

  • 设计一个函数可以轻松地找到某个球员的年龄:
# player_age returns the age of a player in our nba datasetdef player_age(name):    for row in nba:        if row[0] == name:            return row[2]    return -1allen_age = player_age("Ray Allen")durant_age = player_age("Kevin Durant")shaq_age = player_age("Shaquille O'Neal")

Time Algorithms

通常求解一个问题的算法有很多,选择算法的一个常见的标准就是时间复杂度

计算时间复杂度的过程,常常需要分析一个算法运行过程中需要的基本操作,计量所有操作的数量。通常假设一个基本操作可在固定时间内完成,因此总运行时间和操作的总数量最多相差一个常量系数。有时候,即使对于大小相同的输入,同一算法的效率也可能不同。因此,常对最坏时间复杂度进行分析。最坏时间复杂度定义为对于给定大小n的任何输入,某个算法的最大运行时间,记为T(n)。通常根据T(n)对时间复杂度进行分类。比如,如果对某个算法有T(n) = O(n),则称其具有线性时间。如有T(n) = O(2^n),则称其具有指数时间。若对于一个算法,T(n)的上界与输入大小无关,则称其具有常数时间,记作O(1)时间。

  • 在考虑常数时间复杂度的时候要注意一种陷进:就是內建函数的时间复杂度不可忽略:

    这里写图片描述

  • 很容易认为上面这段代码的时间复杂度是O(1),但实际上Python中在判断milk是否在fridge_items这个句子调用了一个内建函数,而这是个查找的过程,是依赖于数组的长度的,不是常数时间。

# Find the length of a listdef length(ls):    count = 0    for elem in ls:        count = count + 1length_time_complexity = "linear"# Check if a list is empty -- Implementation 1def is_empty_1(ls):    if length(ls) == 0:        return True    else:        return Falseis_empty_1_complexity = "linear"# Check if a list is empty -- Implementation 2def is_empty_2(ls):    for element in ls:        return False    return Trueis_empty_2_complexity = "constant"
0 0