前言
🚀 写在最前:瑞士计算机科学家尼古拉斯·沃斯在1984年获得图灵奖说“Algorithm+Data Structures=Programs”,也就是我们常说的程序=数据结构+算法。在前一篇文章我们大概了解了一下数据结构到底在学什么,这篇文章将了解一下什么是算法;以及如何评价算法的好坏?
🚀 :求一个关注😀,让我们一起探索计算机的奥秘!
什么是算法?
算法的官方定义:
算法是解决特定问题求解决步骤的描述,再计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 其简单理解就是对于一个问题,给出该问题的解法,而这个解法用自然语言描述或者使用编程语言描述出来,这就是算法。
算法拥有五个重要特性:
- 有穷性:也就是说给出的问题解决方法必须在有限时间内可以解决该问题,且解决问题的每一个步骤必须也得可有在有限时间内完成。
- 确定性:给出的解决方案,对于同一问题,得到的答案必须唯一。
- 可行性:算法在给定问题上是否可以有效地解决、实现。
- 输入:对于一个算法,有零个或者多个输入。
- 输出:对于一个算法,有一个或者多个输出。
算法效率的度量
😀为什么要学算法效率的度量:对于一个问题的提出,可能就会有多种解决方案,即就是会有多种算法来解决这个问题,那么我们该如何选择算法呢?我们的期望肯定选择的算法是高效的,速度快的,对计算机硬件资源消耗小的;所以就需要一个评价指标来度量算法的好坏。
😀算法效率的度量的两个指标:时间复杂度+空间复杂度。
①:时间复杂度
对于算法是高效的,速度快的,选择时间复杂度来衡量,时间复杂度就是衡量这个算法快或者不快的,所以说我们是不是就可以把算法放机器上去跑一下,看下运行时长,就可以得到哪个算法的时间复杂度低呢?显示是不行的,机器硬件不同,跑出来的时间肯定不同,显然这种方法是不可行,所以对于时间复杂度我们只要大概统计一下要运行多少行代码即可,接下去一起看看时间复杂度是如何进行评价的。直接举例讲解!!
🍬例1:
def sum_of_array(arr):
total = 0
for num in arr:
total += num
return total
# 示例用法
arr = [1, 2, 3, 4, 5]
print(sum_of_array(arr)) # 输出: 15
现在arr的大小是变为了n,即未知,时间复杂度又会是多少?
🍬例2:
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
所以可以看出来,对于时间复杂度来说就是算每一行代码运行了多少次,然后把所有次数相加,就是该算法的时间复杂度。到这里为止已经就是掌握了时间复杂度的求法了。接下去我们再来看一个数学上的小问题。
可以看出,对于一个函数来说,其n的值越大,其最后的结果,大部分来自于次数最高的那个,所以对于算法时间复杂度表达式子可以简化表大,使用最高阶的来代替即可,即接下去要说的大O表示法。
大O表示法:
对于上述求出来的算法复杂度分别是
- 5+1=6
- n+1
-
1+ n+ [(n-1)+1]/2
使用大O表示法表示后其复杂度分别就表示为O(1)、O(n) 、O(),只保留最高项,对于常数次的算法,就用O(1)表示其算法复杂度。
②:空间复杂度
运行一个算法所需要的空间数量就是空间复杂度,当然也可以使用大O表示法。仍然举例说明。
🍬例:
def sum_array(arr):
total = 0
for num in arr:
total += num
return total