首页 > 编程语言 >从0开始的算法(数据结构和算法)基础(二)

从0开始的算法(数据结构和算法)基础(二)

时间:2024-08-06 11:38:24浏览次数:10  
标签:arr int 复杂度 基础 算法 low 数据结构 data

算法效率的评估

    评估算法效率的好坏主要涉及到算法的时间复杂度(Time Complexity)、空间复杂度(Space Complexity)以及在实际应用中的运行性能。 曾经调侃中文压缩包事件[1] ,白话、成语、文言文,大多数时候我们明意思白时间和知识量是递增的,时间增长和我们学习的文言文长短有关,就可以一定程度上反映难度,时间的增长情况反映的更为明显我们要查的书籍也会增长,要的知识量就会越大,反映他的增长情况(求一阶导数的作用)这些因素有助于我们理解算法在不同输入规模下的表现,预测其在实际应用中的可行性和效率。以下是评估算法效率的几个关键方面:

1. 时间复杂度

      时间复杂度是描述算法运行时间如何随着输入规模增加而变化的数学表示。常见的时间复杂度有:
      计算时间复杂度(Time Complexity)主要是通过分析算法的运行步骤,并估算其在输入规模 (n) 增长时,执行步骤的增长情况。这通常涉及以下几个步骤:

1. 识别算法中的基本操作

      基本操作是算法中最频繁执行的操作,通常是最内层的操作,可以是比较、赋值、交换等。

2. 计算基本操作的执行次数

      分析算法中基本操作随输入规模 (n) 增长的执行次数。通常需要分析循环、递归等结构的执行次数。

3. 用大O表示法表示时间复杂度

      将基本操作的执行次数表示为输入规模 (n) 的函数,并使用大O表示法来表示时间复杂度。大O表示法关注的是执行次数增长的数量级,而忽略常数因子和低阶项。

具体示例

1. 常数时间复杂度 (O(1))

      算法的运行时间不随输入规模的变化而变化。

int x = 5; // 这个操作只执行一次,与输入规模无关

2. 线性时间复杂度 (O(n))

      算法的运行时间与输入规模成正比。例如,一个遍历数组的操作:

for (int i = 0; i < n; i++) {
    System.out.println(arr[i]);
}

      此处,基本操作 System.out.println 执行 (n) 次,所以时间复杂度是 (O(n))。

3. 平方时间复杂度 (O(n^2))

      算法的运行时间与输入规模的平方成正比。例如,两个嵌套的循环:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        System.out.println(arr[i][j]);
    }
}

      此处,基本操作 System.out.println 在每次外层循环中执行 (n) 次,而外层循环也执行 (n) 次,总执行次数为 n2,所以时间复杂度是 (O(n^2))。

4. 对数时间复杂度 (O(log n))

      算法的运行时间随输入规模的对数增长。
例如,二分查找:

int binarySearch(int[] arr, int target) {
    int low = 0, high = arr.length - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return -1;
}

      此处,每次迭代都将搜索范围减半,因此基本操作的执行次数是对数级别的,时间复杂度是 (O(log n))。

5. 线性对数时间复杂度 (O(n log n))

      例如,快速排序在平均情况下的时间复杂度:

void quickSort(int[] arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

arr,int,复杂度,基础,算法,low,数据结构,data
From: https://www.cnblogs.com/Solidao/p/18344849

相关文章

  • 【数据结构】反转链表,合并有序链表,有无环的判断
    前言:小编在上期进行了单链表的模拟,这期接上期进行单链表相关题目讲解1.反转单链表 1.1.题目题目来源:.-力扣(LeetCode)给定一个单链表,实现单链表的反转,图示如下:1.2.解题思路首先在反转时,应该用到头插法,即将第一个后面的元素逐步插入到头结点之前,这里头结点每次要进......
  • 「代码随想录算法训练营」第三十天 | 动态规划 part3
    46.携带研究材料(0-1背包问题)题目链接:https://kamacoder.com/problempage.php?pid=1046文章讲解:https://programmercarl.com/背包理论基础01背包-1.html视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6/题目状态:看题解过思路:创建一个二维的dp数组,用来进行动态规划,其......
  • 数据结构 Queue 队列 -- C语言实现
    队列队列的概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点FIFO(FirstInFirstOut)入队:进行插入操作的一端称为队尾出队:进行删除操作的一端称为队头链实栈代码实现Ququq.h#pragmaonce#define_CRT_SECURE_NO_WARNI......
  • 数学基础-快速幂、快速乘、矩阵快速幂
    快速幂幂运算的本质是做乘法,对于\(a^b\),其核心思想是将指数\(b\)进行二进制分解,然后对\(b\)的每一位进行进行乘法,时间复杂度为\(O(\logb)\)。llquick_power(lla,llb,llp){llans=1%p;for(;b;b>>=1){if(b&1)ans=an......
  • 基于springboot的协同过滤算法的个性化音乐推荐系统(源码+Lw+文档+讲解等)
    博主介绍:✌十余年IT大项目实战经验、在某机构培训学员上千名、专注于本行业领域✌技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫+大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战项目。主要内容:系统功能设计、开题报告......
  • 数据结构 Stack 栈 -- C语言实现
    栈栈的概念一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出......
  • python入门(1)基础知识介绍
    print函数a=10print(a)print(10)print("您好")print(a,b,"您好")print(chr(98))#chr将98转换为ASVCII值print("你好"+"上海")#都是字符串可以用+连接输出print('您好',end='不换行')#修改结束符,不换行,否则自动视为有\nfp=open("note.txt&......
  • 数学基础-素数
    算术基本定理任何一个大于\(1\)的正整数\(N\)都能唯一分解为有限个质数的乘积,可写作:\[N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}\]其中\(c_i\)是正整数,\(p_i\)是质数,且满足\(p_1<p_2<...<p_m\)。推论:\(N\)的正约数的集合可写作:\[\{p_1^{b_1}p_2^{b_2}...p_m^{b_m}\}\]其......
  • 【数据结构】单链表
    前言:小编这里将讨论无头单向非循环的单链表。1.ArrayList的缺陷 在上一期中,小编模拟了列表的相关操作实现,可以发现在增删的过程中非常麻烦,每次增加,或者删除数据的时候,都需要将操作下标的后面所有数据进行前移或者后移。上期博客:http://t.csdnimg.cn/VI2yz所以:由于其......
  • 手撕数据结构之二叉树
     1.树树的基本概念与结构树是⼀种⾮线性的数据结构,它是由n(n>=0)个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。•有⼀个特殊的结点,称为根结点,根结点没有前驱结点。•除根结点外,其余结点被分成M(M>0)......