时间复杂度和空间复杂度(完)

  学习视频地址:https://www.bilibili.com/video/BV1uA411N7c5

 

内容概要

  一、时间复杂度

  二、空间复杂度(了解)

  三、时间复杂度判断

  四、一些特殊的时间复杂度

 

1、时间复杂度

  **个人理解**

  时间复杂度是一个计量单位,就像毫米、厘米、分米、米等单位,它更接近数量级

  它用于描述一段代码执行时间的快慢等级,并不具体的反应一段代码的执行时间。时间复杂度越高,算法的执行效率越低。

 

  对于一个普通的代码语句

print("hello world")

    它的时间复杂度是O(1)

 

print("hello,world")
print("hello,world")
print("hello,world")

    同样的,对于三条重复的普通语句,它的时间复杂度不是O(3),同样是O(1)

    因为3条打印语句1条打印语句具体执行时间相差并不大,就像3毫米1毫米相差不大,这个差值可以忽略不计

 

  当这个普通语句重复n遍时,它的复杂度变为O(n)

    例如:

for i in range(n):

    print("hello world")

  当一个普通语句重复n遍时,与普通语句执行1次或者3次的相差很大差值不能忽略

  就像1毫米1米一样,将O(1)与O(n)视为不同单位会更好理解

 

  当再多一层循环时,例如

for i in range(n):
    for j in range(n):
        print("hello world")

    它的时间复杂度为O(n**2)

 

2、空间复杂度(了解)

  与时间复杂度类似,空间复杂度是描述一段代码消耗内存的多少的等级。

import random
li = [random.randrange(0,10) for _ in range(0,101)]

new_li = []  # 开辟了一个新的列表,它的长度为原列表的长度100
for i in li:
    new_li.append(i)

  对于这段代码,由于申请了一个与原列表长度一样(都为100,可以不完全一样,只要近似100也可以)的列表的空间,所以它的空间复杂度为O(n)

 

  对于空间复杂度不需要太过注意,在内存允许情况下,一般都追求用空间换时间

 

3、时间复杂度判断

print("hello world")
print("hello world")
print("hello world")
print("hello world")

  注意:对于这段代码,它的时间复杂度不是O(4),而是O(1)

for i in range(n):
    print("hello world")

for i in range(n):
    print("hello world")

  同样:对于这段代码,它的时间复杂度不是O(2n), 而是O(n)

  还是那句话,它用于描述一段代码执行时间的快慢等级,并不具体的反应一段代码的执行时间

 

  **个人理解**

  之所以这样判断,是从它的功能来的,描述一段代码执行时间的快慢等级,不同等级之间的执行效率相差是很大的

  比如O(1)与O(n),O(n)耗时是O(1)的n倍

    O(n)与(n**2),O(n**2)耗时是O(n)的n倍

  在计算复杂算法的时间复杂度时,很难精确的计算出它含有常量级的时间复杂度,所以一般把常量舍去,比如O(1)和O(4)差别不大,所以统一使用O(1)表示

  在优化算法时,也没有必要费尽心思将复杂度为O(n+1)的算法优化为O(n),因为它们差别不大,但如果是举手之劳就另说了

 

4、一些特殊的时间复杂度

  记忆:存在对半平分的算法或查找方法,一般都存在O(logn)的时间复杂度(logn是以2为底,以n为真数的对数)

  比如:二分法查找数据

def half_select(li, head_index, tail_index, find_num, find_nun):
    mid_index = (head_index + tail_index) // 2
    mid_value = li[mid_index]
    while mid_value != find_nun:
        if head_index == tail_index:
            return (False, None)
        
        if find_num > mid_value:
            head_index = mid_index + 1
        elif find_num < mid_value:
            tail_index = mid_index - 1
        mid_index = (head_index + tail_index) // 2
        mid_value = li[mid_index]
    else:
        return (True, mid_index)
View Code

 

  它的时间复杂度就为logn

 

  其它一些常见的时间复杂度

  O(nlogn)、O(n**2logn)

 

  常见时间复杂度的效率排序

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

 

  其它一些复杂的时间复杂度

    O(n!) n的阶层;O(2**n); O(n**n)

 

***完***

posted @ 2021-03-29 22:05  口乞厂几  阅读(190)  评论(0)    收藏  举报