当我们在设计算法的时候,常常需要考虑算法的效率问题,而时间复杂度就是描述算法运行时间的一个函数,通常用O()来表示。在C++中,O(1)表示这个算法的运行时间是常量级的,不随输入规模大小而变化;O(n)表示这个算法的运行时间与输入规模成线性关系。以下是C++中常见的时间复杂度:
-
O(1):常熟级别时间复杂度。例如数组的访问、指针的访问,以及hash表的查询和删除操作都是O(1)级别的。
-
O(logn):对数级别时间复杂度。例如二分查找、快速排序、合并排序等算法的时间复杂度都是logn级别的。
-
O(n):线性级别时间复杂度。例如顺序查找、选择排序、冒泡排序等算法的时间复杂度都是n级别的。
-
O(nlogn):nlogn级别时间复杂度。例如快速排序、归并排序等算法的时间复杂度都是nlogn级别的。
-
O(n^2):平方级别时间复杂度。例如冒泡排序、选择排序等算法的时间复杂度都是n^2级别的。
以下是两个具体的例子:
-
二分查找算法
-
时间复杂度:O(logn)。
二分查找算法是基于有序数组的查找算法,每次将待查找元素与中间元素进行比较,将查找范围缩小一半。因为每次查找都可以把待查找区间缩小为原来的一半,所以时间复杂度是logn级别的。
-
快速排序算法
-
时间复杂度:O(nlogn)。
快速排序是一种常见的、高效的排序算法。快速排序的思想是选定一个基准数,通过一趟扫描使比基准数小的元素放在基准数的左边,比基准数大的元素放在基准数的右边,然后分别对左右两个子序列进行排序。因为每次排序都会使序列长度减半,一共需要进行logn次排序,而每次排序需要n次比较,所以时间复杂度是O(nlogn)。
这些时间复杂度将帮助我们评估算法的效率,快速选择更加有效的算法来解决问题。