活动地址:CSDN21天学习挑战赛
学而不思则罔,思而不学则殆。
本人自学算法有一小段时间了,但一直没做什么笔记和总结,学习内容也不成体系。借这个活动的机会,和大家一起学习、梳理一下经典算法。
1. 算法基本概念
1.1 算法的定义
英语:algorithm,在数学(算学)和计算机科学之中,指一个被定义好的、计算机可施行其指示的有限步骤或次序,常用于计算、数据处理和自动推理。算法是有效方法,包含一系列定义清晰的指令,并可于有限的时间及空间内清楚的表述出来。
– 维基百科
Informally, an algorithm is any well-defined computational procedure that takes some value, or set of values, as input and produces some value, or set of values, as output. An algorithm is thus a sequence of computational steps that transform the input into the output.
– Introduction to Algorithms
1.2 算法的效率
算法的效率主要由以下两个复杂度来评估:
时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。
常见的时间复杂度有(由低到高):
O
(
1
)
,
O
(
log
2
n
)
,
O
(
n
)
,
O
(
n
log
2
n
)
,
O
(
n
2
)
,
O
(
n
3
)
,
O
(
2
n
)
,
O
(
n
!
)
\mathrm{O}(1), \mathrm{O}\left(\log _{2} n\right), \mathrm{O}(\mathrm{n}), \mathrm{O}\left(n \log _{2} n\right), \mathrm{O}\left(n^{2}\right), \mathrm{O}\left(n^{3}\right) \text {, }\mathrm{O}\left(2^{n})\text {, }\right.O(n !)
O(1),O(log2n),O(n),O(nlog2n),O(n2),O(n3), O(2n), O(n!)
空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。
设计算法时,一般是要先考虑系统环境,然后权衡时间复杂度和空间复杂度,选取一个平衡点。不过,时间复杂度要比空间复杂度更容易产生问题,因此算法研究的主要也是时间复杂度,不特别说明的情况下,复杂度就是指时间复杂度。
2. 顺序查找
2.1 元素查找介绍
查找也被称为检索,算法的主要目的是在某种数据结构中找出满足给定条件的元素(以等值匹配为例)。如果找到满足条件的元素则代表查找成功,否则查找失败。
在进行查找时,对于不同的数据结构以及元素集合状态,会有相对匹配的算法,在使用时也需要注意算法的前置条件。在元素查找相关文章中只讨论数据元素只有一个数据项的情况,即关键字(key)就是对应数据元素的值,对应到具体的数据结构,可以理解为一维数组。
常见的查找算法:
- 顺序查找
- 二分查找
- 索引查找
2.2 顺序查找
顺序查找理论介绍
时间复杂度:O(n)
空间复杂度:O(1)
Python 代码实现
from typing import List
def search(nums: List[int], key: int) -> int:
n = len(nums)
for i in range(n):
if nums[i] == key:
return i
return -1
if __name__ == '__main__':
A = [11, 34, 20, 10, 12, 35, 41, 32, 43, 14]
key = 41
ans = search(A, key)
print(ans)