算法入门

什么是算法

算法是一种设计出来的计算过程,解决问题的方法

算法的特性:

  • 有穷性:算法必须能在执行有限个步骤之后终止;
  • 确切性:算法的每一步骤必须有确切的定义;
  • 输入项:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
  • 输出项:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
  • 可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

算法的评定:

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。

时间复杂度:

  • 算法的时间复杂度是指执行算法所需要的计算工作量。
# O(1) 一条简单语句的执行可记为1,大O,简而言之可以认为它的含义是“order of”(大约是)
print("Hello Word")

# O(n) 会执行n次
for i in range(n):
    print("Hello Word")

# O(n**2) 会执行n**2次
for i in range(n):
    for i in range(n):
        print("Hello Word")

# O(n**3) 会执行n**3次
for i in range(n):
    for i in range(n):
        for i in range(n):
            print("Hello Word")

# 也记做O(1)
print("Hello Word")
print("Hello Word")
print("Hello Word")

# 下面这种并不记为O(n+n**2),也记作O(n**2)
for i in range(n):
    print("Hello Word")   # 执行n次
    for i in range(n):
        print("Hello Word") # 执行n**2次

# 还有下面这种
for i in range(n):
    for j in range(range(i)):
        print("Hello Word")

# print语句的执行次数0,1,2..n,(0+n)/2*n = (1/2)*(n**2)
# 然鹅,并不是这样,他也记作O(n**2)

# 0(log2n)
while n > 1:
    print(n)
    n = n //2

  常见时间复杂度排序

O(1)<O(logn)<O(n)<O(n*logn)<O(n**2)<O(n**2 * logn)<O(n**3)

  不常见的时间复杂度

O(n!) # n的阶乘
O(2**n)
O(n**n)

  一眼判断时间复杂度(假的,)

循环减半的过程>O(logn)
几次循环就是n的几次方的复杂度

  

空间复杂度:

  算法的空间复杂度是指算法需要消耗的内存空间。

正确性:

  算法的正确性是评价一个算法优劣的最重要的标准。

可读性:

  算法的可读性是指一个算法可供人们阅读的容易程度。

健壮性:

  健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性

 

posted @ 2018-04-22 20:14  瓜田月夜  阅读(132)  评论(0)    收藏  举报