算法基础

Posted aaronthon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法基础相关的知识,希望对你有一定的参考价值。

什么是算法?

算法(Algorithm):一个计算过程,解决问题的方法。

输入→算法→输出

时间复杂度

时间复杂度:用来评估算法运行效率的一个东西。

print(Hello World)           #假如说这行代码运行时间是一个单位O(1)
for i in range(n):             # 这段代码的时间是O(n),因为执行了n次
    print(Hello World)   
for i in range(n):             # 这段代码是O(n*n),因为在执行了n*n次
    for j in range(n):        
        print(Hello World)
for i in range(n):             #这代码是O(n*n*n),执行了n的立方次
    for j in range(n):       
        for k in range(n):          
            print(Hello World)

小结:

时间复杂度是用来估计算法运行时间的一个式子(单位)。
一般来说,时间复杂度高的算法比复杂度低的算法慢。
常见的时间复杂度(按效率排序):
    O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
不常见的时间复杂度(看看就好)
    O(n!) O(2n) O(nn) …

空间复杂度

空间复杂度:用来评估算法内存占用大小的一个式子

空间换时间:分给它一些空间或内存,让它运行速度更快

 递归

 递归的两个特点:

1.调用自身

2.有结束条件

def func(x):    
    if x>0:       
        print(x)       
        func(x-1)
print(4)
# 打印结果 4 3 2 1
#因为先打印再递归
def func(x):
    if x > 0:
        func(x-1)
        print(x)
func(4)
# 打印结果 1 2 3 4
# 因为先递归,再打印

打印  抱着抱着抱着抱着抱着我的小鲤鱼的我的我的我的我的我

def test(n):
    if n == 0:
        print("我的小鲤鱼", end=‘‘)
    else:
        print("抱着", end=‘‘)
        test(n-1)
        print("的我", end=‘‘)

test(5)

# 尾递归

汉诺塔问题

t = 0

def hanoi(n, A, B, C):
    global t
    if n > 0:
        hanoi(n-1, A, C, B)
        t += 1
        print("%s -> %s" % (A, C))
        hanoi(n-1, B, A, C)

# hanoi(8,‘A‘,‘B‘,‘C‘)  # 8表示8层  A B C 参数不能变
# print(t)

列表查找

 列表查找:从列表中查找指定元素

 输入:列表、待查找元素

 输出:元素下标或未查找到元素

顺序查找:从列表第一个元素开始,顺序进行搜索,直到找到为止。

二分查找:从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

有序列表,列表的元素值随着索引值的增加而增加:

简单版二分查找

def bin_search(li, val):         # li是传入的列表 val是要查找的值
    low = 0                      # low是起始的索引值
    high = len(li) - 1           # high是末尾的索引值
    while low <= high:           # 满足起始索引小于末尾索引的条件就执行循环
        mid = (low + high) // 2  # mid是列表的中间数的索引
        if li[mid] == val:       # 正好找到要查找的值的索引
            return mid
        elif li[mid] < val:      # 中间数的值小于被查找的值
            low = mid + 1        # 说明val在中间数的右边
        else:
            high = mid - 1       # 说明val在中间数的左边

递归版的二分查找 这是尾递归

def bin_search_rec(data_set, value, low, high):
    if low <= high:
        mid = (low + high) // 2
        if data_set[mid] == value:
            return mid
        elif data_set[mid] > value:
            return bin_search_rec(data_set, value, low, mid - 1)
        else:
            return bin_search_rec(data_set, value, mid + 1, high)
    else:
        return

列表排序

列表排序:将无序列表变成有序列表

输入:无序列表

输出:有序列表

顺序:升序与倒序

排序low B 三人组;

    冒泡排序       其次最多

    选择排序

    插入排序

排序niu B 三人组:

    快速排序        用得最多

    堆排序           最难的

    归并排序

 

以上是关于算法基础的主要内容,如果未能解决你的问题,请参考以下文章

常用编程思想与算法

视频二次裁剪时间计算出原片的时间片段算法

视频二次裁剪时间计算出原片的时间片段算法

以下代码片段的算法复杂度

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023