时间复杂度有哪几种
时间复杂度是指一个算法所需的计算时间,通常用“大O表示法”来表示,是算法复杂度的上限,也是衡量算法优劣的主要标准之一。那么,时间复杂度有哪几种呢?本文将从多个角度来解答这个问题。
一、按照阶级划分
从阶级来看,时间复杂度可以分为以下几种:
1. 常数阶O(1)
常数阶时间复杂度,表示代码执行时间不随数据规模的增长而增长,无论数据规模多大,执行时间都相等,因此常数阶时间复杂度对于算法性能的优化并不起作用。
例如:
```python
def sum(a,b):
return a+b
```
以上函数的时间复杂度就是 O(1)。
2. 线性阶O(n)
线性阶时间复杂度,表示代码在处理 n 个数据的时候,会执行 n 次操作,也就是时间复杂度随着数据规模的增长而线性增长。
例如:
```python
def find(arr, val):
for i in range(len(arr)):
if arr[i] == val:
return i
return -1
```
以上函数的时间复杂度就是 O(n)。
3. 对数阶O(logn)
对数阶时间复杂度,表示代码的执行时间随着数据规模的增长而增长,但是增长缓慢,时间复杂度随着数据规模的增长而减小,当数据规模扩大 n 倍时,所需的时间不会超过 logn 倍。
例如:
```python
def binary_search(arr, val):
left, right = 0, len(arr)-1
while left <= right:
mid = (left + right) // 2
if arr[mid] == val:
return mid
elif arr[mid] < val:
left = mid + 1
else:
right = mid - 1
return -1
```
以上函数的时间复杂度就是 O(logn)。
4. 平方阶O(n^2)
平方阶时间复杂度,表示代码在处理 n 个数据的时候,会执行 n^2 次操作,也就是时间复杂度随着数据规模的增长而成平方增长。
例如:
```python
def bubble_sort(arr):
for i in range(len(arr)-1):
for j in range(len(arr)-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
```
以上函数的时间复杂度就是 O(n^2)。
5. 立方阶O(n^3)和以此类推
根据这个思路,还可以推出 O(n^3)、O(n^4)、O(2^n)、O(n!)等不同的阶级时间复杂度。
二、按照分析方法划分
从分析方法来看,时间复杂度可分为以下两种:
1. 最优时间复杂度
最优时间复杂度,即该算法在分析最坏情况下的所需时间,通常表示为 O(1)。在最坏情况下,算法的执行时间是最短的,因此该算法具有很高的效率和快速的响应速度。
例如:
```python
def find_min(arr):
return min(arr)
```
以上函数的最优时间复杂度就是 O(1)。
2. 最坏时间复杂度
最坏时间复杂度,是指该算法在最坏情况下的所需时间,通常表示为 O(n)、O(logn)、O(n^2)等。在最坏情况下,算法的执行时间是最长的,因此该算法具有相对较低的效率和较慢的响应速度。
例如:
```python
def find_max(arr):
max_val = arr[0]
for i in range(1, len(arr)):
if arr[i] > max_val:
max_val = arr[i]
return max_val
```
以上函数的最坏时间复杂度就是 O(n)。
三、按照实现方法划分
从实现方法来看,时间复杂度可以分为以下几种:
1. 顺序查找
顺序查找,也叫线性查找,从数据的第一个元素开始,逐个比较,直到找到目标为止。顺序查找的时间复杂度为 O(n),最坏情况下需要执行 n 次比较操作。
例如:
```python
def linear_search(arr, val):
for i in range(len(arr)):
if arr[i] == val:
return i
return -1
```
以上函数的时间复杂度就是 O(n)。
2. 二分查找
二分查找,也叫折半查找,基于有序数据进行查找,每次查找时将查找范围缩小一半。二分查找的时间复杂度为 O(logn),最坏情况下需要执行 logn 次比较操作。
例如:
```python
def binary_search(arr, val):
left, right = 0, len(arr)-1
while left <= right:
mid = (left + right) // 2
if arr[mid] == val:
return mid
elif arr[mid] < val:
left = mid + 1
else:
right = mid - 1
return -1
```
以上函数的时间复杂度就是 O(logn)。
3. 哈希查找
哈希查找,也叫散列查找,基于哈希表实现,先将数据哈希到对应的位置,然后根据哈希冲突的不同情况,采用不同的解决办法来查找数据。哈希查找的时间复杂度为 O(1),最坏情况下需要执行 n 次比较操作,其中 n 为哈希表的长度。
例如:
```python
class HashTable():
def __init__(self, size):
self.size = size
self.data = [None] * size
def hash_func(self, key):
return key % self.size
def insert(self, key, val):
index = self.hash_func(key)
if self.data[index] is None:
self.data[index] = [(key, val)]
else:
for i in range(len(self.data[index])):
if self.data[index][i][0] == key:
self.data[index][i] = (key, val)
break
else:
self.data[index].append((key, val))
def get(self, key):
index = self.hash_func(key)
for item in self.data[index]:
if item[0] == key:
return item[1]
else:
return None
```
以上代码实现了一个简单的哈希表,并提供了插入和查询操作,哈希查找的时间复杂度为 O(1)。
本文从多个角度分析了时间复杂度有哪几种,包括从阶级、分析方法和实现方法三个方面,详细解释了每种时间复杂度的含义和使用场景。总的来说,掌握时间复杂度的概念和使用方法是算法分析的基础,是提高算法效率的重要手段。