当前位置:首页算法 > 正文

算法复杂度的估算(含多项式、指数、对数复杂度)-野牛程序员讲少儿编程

作者:野牛程序员:2025-05-09 18:58:11算法阅读 1991
算法复杂度的估算(含多项式、指数、对数复杂度)-野牛程序员讲少儿编程

📘 什么是算法复杂度?

算法复杂度,是用来描述算法执行效率的工具。通常分为两类:

类型含义
时间复杂度算法运行所需的「操作步骤数量」
空间复杂度算法运行所占用的「内存大小」

其中,时间复杂度最常见,表示当输入数据规模 n 增大时,程序运行时间变化趋势。


📏 常见复杂度等级(从快到慢)

复杂度表达式名称举例
O(1)常数时间判断奇偶:x % 2 == 0
O(log n)对数时间折半查找(二分查找)
O(n)线性时间遍历数组一遍
O(n log n)线性对数时间快速排序、归并排序
O(n²)平方时间两层循环(如冒泡排序)
O(2^n)指数时间递归搜索子集(暴力搜索)
O(n!)阶乘时间(最慢)全排列枚举


🍬 通俗理解

假设有 n 个糖果,要从中找出最甜的一颗:

  • O(1):老师直接告诉答案(最省事)

  • O(n):一个个尝过去(遍历)

  • O(log n):先猜一半,看在哪边继续猜(折半)

  • O(n²):每颗都跟其他糖比甜度(成对比较)

  • O(2ⁿ):所有可能的吃法都试一遍(组合爆炸)


📌 示例代码讲解(含主函数与注释)

1️⃣ O(n) — 线性复杂度

#include <iostream>
using namespace std;

// 功能:输出前 n 个数字的和
int linearSum(int n) {
    int sum = 0;
    for (int i = 1; i <= n; i++) // 循环 n 次
        sum += i;
    return sum;
}

int main() {
    int n = 100000;
    cout << "前 " << n << " 个数之和是:" << linearSum(n) << endl;
    return 0;
}

2️⃣ O(log n) — 对数复杂度(二分查找)

#include <iostream>
using namespace std;

// 功能:在升序数组中查找目标值 target
bool binarySearch(int a[], int n, int target) {
    int l = 0, r = n - 1;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (a[mid] == target)
            return true;
        else if (a[mid] < target)
            l = mid + 1;
        else
            r = mid - 1;
    }
    return false;
}

int main() {
    int a[] = {1, 3, 5, 7, 9, 11, 13};
    int n = 7, target = 9;
    if (binarySearch(a, n, target))
        cout << "找到目标值!" << endl;
    else
        cout << "目标值不存在" << endl;
    return 0;
}

3️⃣ O(n²) — 冒泡排序

#include <iostream>
using namespace std;

// 功能:对数组进行冒泡排序
void bubbleSort(int a[], int n) {
    for (int i = 0; i < n - 1; i++)             // 外层 n-1 次
        for (int j = 0; j < n - 1 - i; j++)     // 内层也约为 n 次
            if (a[j] > a[j + 1])
                swap(a[j], a[j + 1]);
}

int main() {
    int a[] = {5, 2, 9, 1, 3};
    int n = 5;
    bubbleSort(a, n);
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

🚀 小学生能懂的记忆口诀

等级口诀(比喻)
O(1)秒回消息
O(log n)一猜一半找目标(猜数游戏)
O(n)一个个过(排队查身高)
O(n²)人人比(班级同学互相问卷)
O(2ⁿ)所有组合都试(翻牌、配对游戏)


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 算法复杂度的估算(含多项式、指数、对数复杂度)-野牛程序员讲少儿编程
  • 相关推荐

    最新推荐

    热门点击